整理的算法模板合集: ACM模板
一、前置知识
-
快速傅里叶变换FTT(学完FFT再看NTT哈,)
-
原根(链接待更,下面有原根的基础说明,足够今天的NTT使用了)
二、快速数论变换(NTT)
三、NTT证明(和FFT的关系)
我们发现FFT里的大多操作,都跟单位根没有什么关系,(例如选点插值,奇偶分治),我们随便选择一个n个点 v , v 2 , v 3 , … , v N v,v^2,v^3,\dots,v^N v,v2,v3,…,vN,最后可以得到公式 A ( k ) = A 1 ( x ) + V k × A 2 ( k ) A(k) = A1(x) + V^k \times A2(k) A(k)=A1(x)+Vk×A2(k),现在问题是这个公式只有在 k < N 2 k<\frac{N}{2} k<2N的时候才能成立,我们需要找到 k ≥ N 2 k≥\frac{N}{2} k≥2N 的时候的答案,这样才能得到整体的答案。所以FFT的关键问题就是如何得到 k ≥ N 2 k≥\frac{N}{2} k≥2N 时的统一的递推式,进而可以把两个子问题合并,使用分治的思想 O ( n l o g n ) O(nlogn) O(nlogn)的时间完成整个过程。
我们之所以使用单位根,即令 v = ω N v = \omega_N v=ωN,也就是 e 2 i π N e^\frac{2i\pi}{N} eN2iπ,就是 因为单位根拥有四个重要性质:
- ω N N = 0 \omega_N^N = 0 ωNN=0
- ω N N 2 = − 1 \omega_N^\frac{N}{2} = -1 ωN2N=−1
- ω 2 N 2 k = ω N k \omega_{2N}^{2k} = \omega_{N}^k ω2N2k=ωNk(折半定理)
- ω N k + N 2 = − ω N k \omega_N^{k + \frac{N}{2}} = -\omega_{N}^{k} ωNk+2N=−ωNk(消去定理)
我们根据性质1和3,可以得到 k < N 2 k<\frac{N}{2} k<2N的时候, A 1 ( ω N k ) = A 1 ( ω N 2 k ) + ω N k × A 2 ( ω N 2 k ) A1( \omega_{N}^k) =A1( \omega_{\frac{N}{2}}^k)+ \omega_{N}^k\times A2( \omega_{\frac{N}{2}}^k) A1(ωNk)=A1(ω2Nk