Number-theoretic transform
|
The number-theoretic transform is similar to the discrete Fourier transform, but operates with modular arithmetic instead of complex numbers.
The discrete Fourier transform is given by
- <math>f_j=\sum_{k=0}^{n-1}x_k\left(e^{-\frac{2\pi i}{n}}\right)^{jk}\quad\quad j=0,\dots,n-1<math>
The number-theoretic transform operates on a sequence of n numbers, modulus a prime number p of the form p=ξn+1, where ξ can be any positive integer.
The number <math>e^{-\frac{2\pi i}{n}}<math> is substituted with a number ωξ where ω is a "primitive root" of p, a number where the lowest positive integer ж where ωж=1 is ж=p-1. There should be plenty of ω which fit this condition. Note that both <math>e^{-\frac{2\pi i}{n}}<math> and ωξ raised to the power of n are equal to 1 (mod p), all lesser positive powers not equal to 1.
The number-theoretic transform is then given by
- <math>f(x)_j=\sum_{k=0}^{n-1}x_k(\omega^\xi)^{jk}\mod p\quad\quad j=0,\dots,n-1<math>
The inverse number-theoretic transform is given by
- <math>f^{-1}(x)_h=n^{p-2}\sum_{j=0}^{n-1}x_j(\omega^{p-1-\xi})^{hj}\mod p\quad\quad h=0,\dots,n-1<math>
Note that ωp-1-ξ=ω-ξ, the reciprocal of ωξ, and np-2=n-1, the reciprocal of n. (mod p)
The inverse works because <math>\sum_{k=0}^{n-1}z^k<math> is n for z=1 and 0 for all other z where zn=1. A proof of this (should work for any division algebra) is
- <math>z\left(\sum_{k=0}^{n-1}z^k\right)+1=\sum_{k=0}^nz^k<math>
- <math>z\sum_{k=0}^{n-1}z^k=\sum_{k=0}^{n-1}z^k<math> (subtracting zn=1)
- <math>z=1\ \mathrm{if}\ \sum_{k=0}^{n-1}z^k\ne 0<math> (dividing both sides)
If z=1 then we could trivially see that <math>\sum_{k=0}^{n-1}z^k=\sum_{k=0}^{n-1}1=n<math>. If z≠1 then the right side must be false to avoid a contradiction.
It is now straightforward to complete the proof. We take the putative inverse transform of the transform.
- <math>f^{-1}(f(x))_h=n^{p-2}\sum_{j=0}^{n-1}\left(\sum_{k=0}^{n-1}x_k\left(\omega^\xi\right)^{jk}\right)(\omega^{p-1-\xi})^{hj}\mod p<math>
- <math>f^{-1}(f(x))_h=n^{p-2}\sum_{j=0}^{n-1}\sum_{k=0}^{n-1}x_k(\omega^\xi)^{jk-hj}\mod p<math>
- <math>f^{-1}(f(x))_h=n^{p-2}\sum_{k=0}^{n-1}x_k\sum_{j=0}^{n-1}(\omega^{\xi(k-h)})^j\mod p<math>
- <math>f^{-1}(f(x))_h=n^{p-2}\sum_{k=0}^{n-1}x_k\left\{\begin{matrix}n,&k=h\\0,&k\ne h\end{matrix}\right\}\mod p<math> (since ωξn=1)
- <math>f^{-1}(f(x))_h=n^{p-2}x_hn\mod p<math>
- <math>f^{-1}(f(x))_h=x_h\mod p<math>
See also
External link
- Site which (hopefully) says the same as this article (http://www.apfloat.org/ntt.html)