离散的#

这个 discrete SymPy中的模块实现了计算有限序列的离散变换和卷积的方法。

此模块包含对离散序列进行操作的函数。

变换- fftifftnttinttfwhtifwht

mobius_transform, inverse_mobius_transform

卷积- convolutionconvolution_fftconvolution_ntt

convolution_fwht, convolution_subset, covering_product, intersecting_product

由于离散变换可以用来降低离散卷积的计算复杂度,因此 convolutions 模块利用 transforms 用于高效计算的模块(以长输入序列著称)。

转换#

本节列出了实现离散序列基本变换的方法。

快速傅里叶变换#

sympy.discrete.transforms.fft(seq, dps=None)[源代码]#

执行离散傅里叶变换( DFT )在复杂领域。

序列会自动在右侧填充零,如 radix-2 FFT 要求采样点的数量是2的幂次方。

由于表达式的复杂性随序列的大小而增加,因此仅应将此方法与默认参数一起使用。

参数:

seq :i可读取

顺序 DFT 将被应用。

dps :整数

指定精度的小数位数。

实例

>>> from sympy import fft, ifft
>>> fft([1, 2, 3, 4])
[10, -2 - 2*I, -2, -2 + 2*I]
>>> ifft(_)
[1, 2, 3, 4]
>>> ifft([1, 2, 3, 4])
[5/2, -1/2 + I/2, -1/2, -1/2 - I/2]
>>> fft(_)
[1, 2, 3, 4]
>>> ifft([1, 7, 3, 4], dps=15)
[3.75, -0.5 - 0.75*I, -1.75, -0.5 + 0.75*I]
>>> fft(_)
[1.0, 7.0, 3.0, 4.0]

工具书类

sympy.discrete.transforms.ifft(seq, dps=None)[源代码]#

执行离散傅里叶变换( DFT )在复杂领域。

序列会自动在右侧填充零,如 radix-2 FFT 要求采样点的数量是2的幂次方。

由于表达式的复杂性随序列的大小而增加,因此仅应将此方法与默认参数一起使用。

参数:

seq :i可读取

顺序 DFT 将被应用。

dps :整数

指定精度的小数位数。

实例

>>> from sympy import fft, ifft
>>> fft([1, 2, 3, 4])
[10, -2 - 2*I, -2, -2 + 2*I]
>>> ifft(_)
[1, 2, 3, 4]
>>> ifft([1, 2, 3, 4])
[5/2, -1/2 + I/2, -1/2, -1/2 - I/2]
>>> fft(_)
[1, 2, 3, 4]
>>> ifft([1, 7, 3, 4], dps=15)
[3.75, -0.5 - 0.75*I, -1.75, -0.5 + 0.75*I]
>>> fft(_)
[1.0, 7.0, 3.0, 4.0]

工具书类

数论变换#

sympy.discrete.transforms.ntt(seq, prime)[源代码]#

执行数论变换( NTT ),专门研究离散傅里叶变换( DFT )过商环 \(Z/pZ\) 对于prime \(p\) 而不是复数 \(C\) .

序列会自动在右侧填充零,如 radix-2 NTT 要求采样点的数量是2的幂次方。

参数:

seq :i可读取

顺序 DFT 将被应用。

首要的 :整数

形式素模 \((m 2^k + 1)\) 用于表演 NTT 按顺序。

实例

>>> from sympy import ntt, intt
>>> ntt([1, 2, 3, 4], prime=3*2**8 + 1)
[10, 643, 767, 122]
>>> intt(_, 3*2**8 + 1)
[1, 2, 3, 4]
>>> intt([1, 2, 3, 4], prime=3*2**8 + 1)
[387, 415, 384, 353]
>>> ntt(_, prime=3*2**8 + 1)
[1, 2, 3, 4]

工具书类

sympy.discrete.transforms.intt(seq, prime)[源代码]#

执行数论变换( NTT ),专门研究离散傅里叶变换( DFT )过商环 \(Z/pZ\) 对于prime \(p\) 而不是复数 \(C\) .

序列会自动在右侧填充零,如 radix-2 NTT 要求采样点的数量是2的幂次方。

参数:

seq :i可读取

顺序 DFT 将被应用。

首要的 :整数

形式素模 \((m 2^k + 1)\) 用于表演 NTT 按顺序。

实例

>>> from sympy import ntt, intt
>>> ntt([1, 2, 3, 4], prime=3*2**8 + 1)
[10, 643, 767, 122]
>>> intt(_, 3*2**8 + 1)
[1, 2, 3, 4]
>>> intt([1, 2, 3, 4], prime=3*2**8 + 1)
[387, 415, 384, 353]
>>> ntt(_, prime=3*2**8 + 1)
[1, 2, 3, 4]

工具书类

快速Walsh-Hadamard变换#

sympy.discrete.transforms.fwht(seq)[源代码]#

执行Walsh-Hadamard变换( WHT ),并对序列使用Hadamard排序。

序列会自动在右侧填充零,如 radix-2 FWHT 要求采样点的数量是2的幂次方。

参数:

seq :i可读取

应用WHT的顺序。

实例

>>> from sympy import fwht, ifwht
>>> fwht([4, 2, 2, 0, 0, 2, -2, 0])
[8, 0, 8, 0, 8, 8, 0, 0]
>>> ifwht(_)
[4, 2, 2, 0, 0, 2, -2, 0]
>>> ifwht([19, -1, 11, -9, -7, 13, -15, 5])
[2, 0, 4, 0, 3, 10, 0, 0]
>>> fwht(_)
[19, -1, 11, -9, -7, 13, -15, 5]

工具书类

sympy.discrete.transforms.ifwht(seq)[源代码]#

执行Walsh-Hadamard变换( WHT ),并对序列使用Hadamard排序。

序列会自动在右侧填充零,如 radix-2 FWHT 要求采样点的数量是2的幂次方。

参数:

seq :i可读取

应用WHT的顺序。

实例

>>> from sympy import fwht, ifwht
>>> fwht([4, 2, 2, 0, 0, 2, -2, 0])
[8, 0, 8, 0, 8, 8, 0, 0]
>>> ifwht(_)
[4, 2, 2, 0, 0, 2, -2, 0]
>>> ifwht([19, -1, 11, -9, -7, 13, -15, 5])
[2, 0, 4, 0, 3, 10, 0, 0]
>>> fwht(_)
[19, -1, 11, -9, -7, 13, -15, 5]

工具书类

莫比乌斯变换#

sympy.discrete.transforms.mobius_transform(seq, subset=True)[源代码]#

使用序列索引作为位掩码对子集格执行Mobius变换。

每个参数的索引被视为位串,对应于一个有限集的子集。

序列的右边会自动填充零,因为基于位掩码(索引)的子集/超集定义要求序列的大小是2的幂次。

参数:

seq :i可读取

应用Mobius变换的序列。

子集 布尔

指定是否通过枚举给定集的子集或父集来应用Mobius变换。

实例

>>> from sympy import symbols
>>> from sympy import mobius_transform, inverse_mobius_transform
>>> x, y, z = symbols('x y z')
>>> mobius_transform([x, y, z])
[x, x + y, x + z, x + y + z]
>>> inverse_mobius_transform(_)
[x, y, z, 0]
>>> mobius_transform([x, y, z], subset=False)
[x + y + z, y, z, 0]
>>> inverse_mobius_transform(_, subset=False)
[x, y, z, 0]
>>> mobius_transform([1, 2, 3, 4])
[1, 3, 4, 10]
>>> inverse_mobius_transform(_)
[1, 2, 3, 4]
>>> mobius_transform([1, 2, 3, 4], subset=False)
[10, 6, 7, 4]
>>> inverse_mobius_transform(_, subset=False)
[1, 2, 3, 4]

工具书类

sympy.discrete.transforms.inverse_mobius_transform(seq, subset=True)[源代码]#

使用序列索引作为位掩码对子集格执行Mobius变换。

每个参数的索引被视为位串,对应于一个有限集的子集。

序列的右边会自动填充零,因为基于位掩码(索引)的子集/超集定义要求序列的大小是2的幂次。

参数:

seq :i可读取

应用Mobius变换的序列。

子集 布尔

指定是否通过枚举给定集的子集或父集来应用Mobius变换。

实例

>>> from sympy import symbols
>>> from sympy import mobius_transform, inverse_mobius_transform
>>> x, y, z = symbols('x y z')
>>> mobius_transform([x, y, z])
[x, x + y, x + z, x + y + z]
>>> inverse_mobius_transform(_)
[x, y, z, 0]
>>> mobius_transform([x, y, z], subset=False)
[x + y + z, y, z, 0]
>>> inverse_mobius_transform(_, subset=False)
[x, y, z, 0]
>>> mobius_transform([1, 2, 3, 4])
[1, 3, 4, 10]
>>> inverse_mobius_transform(_)
[1, 2, 3, 4]
>>> mobius_transform([1, 2, 3, 4], subset=False)
[10, 6, 7, 4]
>>> inverse_mobius_transform(_, subset=False)
[1, 2, 3, 4]

工具书类

卷积#

本节列出了实现离散序列基本卷积的方法。

卷积#

这是计算离散序列卷积的一种通用方法,它在内部调用其中一种方法 convolution_fftconvolution_nttconvolution_fwhtconvolution_subset .

sympy.discrete.convolutions.convolution(a, b, cycle=0, dps=None, prime=None, dyadic=None, subset=None)[源代码]#

通过使用提示确定所需卷积的类型来执行卷积。

正是其中之一 dpsprimedyadicsubset 应显式指定参数以标识卷积的类型和参数 cycle 可以选择指定。

对于默认参数,使用 FFT .

参数:

a, b :iterables公司

进行卷积的序列。

周期 :整数

指定执行循环卷积的长度。

dps :整数

指定执行精度的小数位数 FFT 按顺序。

首要的 :整数

形式素模 \((m 2^k + 1)\) 用于表演 NTT 按顺序。

并矢 布尔

将卷积类型标识为并元( bitwise-XOR )卷积,使用 FWHT .

子集 布尔

将卷积类型标识为子集卷积。

实例

>>> from sympy import convolution, symbols, S, I
>>> u, v, w, x, y, z = symbols('u v w x y z')
>>> convolution([1 + 2*I, 4 + 3*I], [S(5)/4, 6], dps=3)
[1.25 + 2.5*I, 11.0 + 15.8*I, 24.0 + 18.0*I]
>>> convolution([1, 2, 3], [4, 5, 6], cycle=3)
[31, 31, 28]
>>> convolution([111, 777], [888, 444], prime=19*2**10 + 1)
[1283, 19351, 14219]
>>> convolution([111, 777], [888, 444], prime=19*2**10 + 1, cycle=2)
[15502, 19351]
>>> convolution([u, v], [x, y, z], dyadic=True)
[u*x + v*y, u*y + v*x, u*z, v*z]
>>> convolution([u, v], [x, y, z], dyadic=True, cycle=2)
[u*x + u*z + v*y, u*y + v*x + v*z]
>>> convolution([u, v, w], [x, y, z], subset=True)
[u*x, u*y + v*x, u*z + w*x, v*z + w*y]
>>> convolution([u, v, w], [x, y, z], subset=True, cycle=3)
[u*x + v*z + w*y, u*y + v*x, u*z + w*x]

快速傅里叶变换卷积#

sympy.discrete.convolutions.convolution_fft(a, b, dps=None)[源代码]#

使用快速傅立叶变换执行线性卷积。

参数:

a, b :iterables公司

进行卷积的序列。

dps :整数

指定精度的小数位数。

实例

>>> from sympy import S, I
>>> from sympy.discrete.convolutions import convolution_fft
>>> convolution_fft([2, 3], [4, 5])
[8, 22, 15]
>>> convolution_fft([2, 5], [6, 7, 3])
[12, 44, 41, 15]
>>> convolution_fft([1 + 2*I, 4 + 3*I], [S(5)/4, 6])
[5/4 + 5*I/2, 11 + 63*I/4, 24 + 18*I]

工具书类

数论变换卷积#

sympy.discrete.convolutions.convolution_ntt(a, b, prime)[源代码]#

使用数论变换执行线性卷积。

参数:

a, b :iterables公司

进行卷积的序列。

首要的 :整数

形式素模 \((m 2^k + 1)\) 用于表演 NTT 按顺序。

实例

>>> from sympy.discrete.convolutions import convolution_ntt
>>> convolution_ntt([2, 3], [4, 5], prime=19*2**10 + 1)
[8, 22, 15]
>>> convolution_ntt([2, 5], [6, 7, 3], prime=19*2**10 + 1)
[12, 44, 41, 15]
>>> convolution_ntt([333, 555], [222, 666], prime=19*2**10 + 1)
[15555, 14219, 19404]

工具书类

快速Walsh-Hadamard变换卷积#

sympy.discrete.convolutions.convolution_fwht(a, b)[源代码]#

执行并矢( bitwise-XOR )使用快速Walsh-Hadamard变换的卷积。

卷积会自动在右侧填充零,如 radix-2 FWHT 要求采样点的数量是2的幂次方。

参数:

a, b :iterables公司

进行卷积的序列。

实例

>>> from sympy import symbols, S, I
>>> from sympy.discrete.convolutions import convolution_fwht
>>> u, v, x, y = symbols('u v x y')
>>> convolution_fwht([u, v], [x, y])
[u*x + v*y, u*y + v*x]
>>> convolution_fwht([2, 3], [4, 5])
[23, 22]
>>> convolution_fwht([2, 5 + 4*I, 7], [6*I, 7, 3 + 4*I])
[56 + 68*I, -10 + 30*I, 6 + 50*I, 48 + 32*I]
>>> convolution_fwht([S(33)/7, S(55)/6, S(7)/4], [S(2)/3, 5])
[2057/42, 1870/63, 7/6, 35/4]

工具书类

卷积子集#

sympy.discrete.convolutions.convolution_subset(a, b)[源代码]#

对给定序列执行子集卷积。

每个参数的索引被视为位串,对应于一个有限集的子集。

序列会自动用零填充到右边,因为基于位图(索引)的子集定义要求序列的大小为2的幂。

参数:

a, b :iterables公司

进行卷积的序列。

实例

>>> from sympy import symbols, S
>>> from sympy.discrete.convolutions import convolution_subset
>>> u, v, x, y, z = symbols('u v x y z')
>>> convolution_subset([u, v], [x, y])
[u*x, u*y + v*x]
>>> convolution_subset([u, v, x], [y, z])
[u*y, u*z + v*y, x*y, x*z]
>>> convolution_subset([1, S(2)/3], [3, 4])
[3, 6]
>>> convolution_subset([1, 3, S(5)/7], [7])
[7, 21, 5, 0]

工具书类

覆盖产品#

sympy.discrete.convolutions.covering_product(a, b)[源代码]#

返回给定序列的覆盖积。

每个参数的索引被视为位串,对应于一个有限集的子集。

给定序列的覆盖积是一个序列,它包含由 bitwise-OR 相应的指数。

序列会自动用零填充到右边,因为基于位图(索引)的子集定义要求序列的大小为2的幂。

参数:

a, b :iterables公司

得到覆盖积的序列。

实例

>>> from sympy import symbols, S, I, covering_product
>>> u, v, x, y, z = symbols('u v x y z')
>>> covering_product([u, v], [x, y])
[u*x, u*y + v*x + v*y]
>>> covering_product([u, v, x], [y, z])
[u*y, u*z + v*y + v*z, x*y, x*z]
>>> covering_product([1, S(2)/3], [3, 4 + 5*I])
[3, 26/3 + 25*I/3]
>>> covering_product([1, 3, S(5)/7], [7, 8])
[7, 53, 5, 40/7]

工具书类

交积#

sympy.discrete.convolutions.intersecting_product(a, b)[源代码]#

返回给定序列的相交积。

每个参数的索引被视为位串,对应于一个有限集的子集。

给定序列的交积是由给定序列的元素的乘积之和组成的序列 bitwise-AND 相应的指数。

序列会自动用零填充到右边,因为基于位图(索引)的子集定义要求序列的大小为2的幂。

参数:

a, b :iterables公司

求交积的序列。

实例

>>> from sympy import symbols, S, I, intersecting_product
>>> u, v, x, y, z = symbols('u v x y z')
>>> intersecting_product([u, v], [x, y])
[u*x + u*y + v*x, v*y]
>>> intersecting_product([u, v, x], [y, z])
[u*y + u*z + v*y + x*y + x*z, v*z, 0, 0]
>>> intersecting_product([1, S(2)/3], [3, 4 + 5*I])
[9 + 5*I, 8/3 + 10*I/3]
>>> intersecting_product([1, 3, S(5)/7], [7, 8])
[327/7, 24, 0, 0]

工具书类