Python|数论变换
数论变换是快速傅里叶变换定理的推广。它是通过用第 n 个原始单位根替换 e^(-2piik/N) 获得的。所以这意味着,不是复数 C,而是在商环Z/pZ上使用变换。该理论基于并使用有限域和数论的概念。
数论变换模数必须是素数。但如果它是素数,它会让事情变得更简单。可以使用复合模量执行 NTT。对于模数:
- n th统一存在根
- n的乘法逆
数论变换基本上是傅里叶变换。此外,假设给出了一个正态离散傅里叶变换,并且可以通过将数据与傅里叶矩阵相乘以矩阵形式完成。让我们假设 N = 4。那么,矩阵可以是 -
[ 1 1 1 1 ]
[ 1 w w^2 w^3 ]
[ 1 w^2 w^4 w^6 ]
[ 1 w^3 w^6 w^9 ]
sympy.discrete.transforms.ntt():
它可以对序列进行数论变换(NTT) 。
它专门研究离散傅立叶变换 (DFT) 商环,其中Z/pZ用于素数 na 复数而不是复数。
由于基数 2 FFT 要求样本点数为 2 的幂,因此该序列会自动在右侧填充零。
Parameters :
-> seq : [iterable] sequence on which DFT is to be applied.
-> prime no. : [Integer] prime modulus for NTT to perform on.
Returns :
Number Theoretic Transform
示例 1:
# import sympy
from sympy import ntt
# sequence
seq = [15, 21, 13, 44]
prime_no = 3 * 2**8 + 1
# ntt
transform = ntt(seq, prime_no)
print ("NTT : ", transform)
输出 :
NTT : [93, 114, 732, 659]
示例 2:
# import sympy
from sympy import ntt
# sequence
seq = [153, 321, 133, 44, ]
# Prime modulus of the form (m * 2**k + 1)
prime_no = 3 * 2**8 + 1
# ntt
transform = ntt(seq, prime_no)
print ("NTT : ", transform)
输出 :
NTT : [651, 276, 690, 533]