铺垫
先要把FFT学习清楚才能进行.
因为基本原理都是一样的.
快速数论变换
FFT是根据复数和 n n n次单位根构造算法的.
但是,使用复数和单位根有以下两个缺点:
- 复数运算计算量大,常数比较高
- 复数是基于 d o u b l e double double运算的,可能会出现精度误差
这两个缺点都很致命.
但是,我们经常接触系数为整数的多项式.
有没有更简单的优化算法?
答案是:有!就是快速数论变换(Number Theoretic Transform)(NTT).
快速数论变换,以取模代替了复数运算.
既然没有了复数这一尚方宝剑,那么用什么代替复数指数?
用幂次方!
于是,NTT优秀脱颖而出.
定义
其实很巧,NTT并没有非常严格的数学论证.
只是在寻找这样的数而已.
(1)
阶:
如果有 a , p a,p a,p互质,那么如果
a n ≡ 1 ( m o d p ) a^n\equiv1\pmod p an≡1(modp)
称满足条件的最小正整数 n n n为a模p的阶,又称 δ p ( a ) \delta_p(a) δp(a)(读作delta).
(2)
原根:
如果 p p p是正整数, a a a是整数,若:
δ p ( a ) = φ ( p ) \delta_p(a)=\varphi(p) δp(a)=