Skip to content
Related Articles

Related Articles

Save Article
Improve Article
Save Article
Like Article

Python | Number Theoretic Transformation

  • Last Updated : 09 Sep, 2019

Number Theoretic Transform is a Fast Fourier transform theorem generalization. It is obtained by the replacement of e^(-2piik/N) with an nth primitive unity root. So this means, instead of the complex numbers C, use transform over the quotient ring Z/pZ. The theory is based on and uses the concepts of finite fields and number theory.

Number Theoretic Transform modulus need to be prime necessarily. But if it is prime, it makes things simpler. One can perform the NTT with a composite modulus. For modulus :

 Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.  

To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course. And to begin with your Machine Learning Journey, join the Machine Learning - Basic Level Course

  • nth root of unity existence
  • multiplicative inverse of n

A number-theoretic transform is basically a Fourier transform. Also, suppose that a Normal Discrete Fourier Transform is given and it can be done in matrix form by multiplying the data with a Fourier Matrix. Let us suppose N = 4. Then, the matrix can be –



[ 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( ) :

It can Number Theoretic Transform (NTT) of the sequence.
It specializes over the Discrete Fourier Transform (DFT) quotient ring with Z/pZ for the prime na complexstead of acomplex numbers.

Automatically the sequence is padded with zero to the right because the radix-2 FFT requires the sample point number as a power of 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

Example 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)

Output :

NTT :  [93, 114, 732, 659]


Example 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)

Output :

NTT :  [651, 276, 690, 533]



My Personal Notes arrow_drop_up
Recommended Articles
Page :