📜  Python|数论变换

📅  最后修改于: 2022-05-13 01:55:42.705000             🧑  作者: Mango

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]