📜  Python|倒数理论变换

📅  最后修改于: 2022-05-13 01:55:18.330000             🧑  作者: 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.intt():

它可以对序列进行逆数论变换(NTT) 。它专注于离散傅立叶变换 (DFT) 商环,其中Z/pZ用于素数而不是复数。

由于基数 2 FFT 要求样本点数为 2 的幂,因此序列会自动在右侧填充零。

Parameters : 
-> seq       : [iterable] sequence on which DFT is to be applied.
-> prime no. : [Integer] prime modulus for INTT to perform on.

Returns : 
Number Theoretic Transform

示例 #1:

# import sympy 
from sympy import intt
  
# sequence 
seq = [15, 21, 13, 44]
  
prime_no = 3 * 2**8 + 1
  
# intt
transform = intt(seq, prime_no)
print ("Inverse NTT : ", transform)

输出 :

Inverse NTT :  [600, 357, 183, 413]


示例 #2:

# import sympy 
from sympy import intt
  
# sequence 
seq = [153, 321, 133, 44, ]
  
# Prime modulus of the form (m * 2**k + 1)
prime_no = 3 * 2**8 + 1
  
# intt
transform = intt(seq, prime_no)
print ("Inverse NTT : ", transform)

输出 :

Inverse NTT :  [355, 710, 557, 69]