昨晚写了各种FFT模板,还是稍微记录一下吧
FFT原理
还是上最基本的问题:求 C(x)=A(x)B(x)
其中 A(x)=Σi<ni=0aixi B(x)=Σi<mi=0bixi
暴力求解的复杂度为 O(n2) ,FFT则可以在 O(nlogn) 的时间复杂度内实现
FFT的实现主要分两步,点值运算和插值运算
点值运算
首先注意到 C(x) 的次数界 N 至多为
为了方便,我们先让 N 稍微取大一点
for(N = 1; N < n + m; N <<= 1);
我们先不急着求出
如果这 N 个值的选取是任意的,那么这么做的复杂度仍然是
这
如下图:当 N=8 时, ω0...78 的取值
由复数的运算可知,这 N 个数(
其中 ω0N=1 , ωk+1N=ωkNωN
复平面上的这 N 个数有一些神奇的性质,将用几个引理来描述:
消去引理:
折半引理:
如果 N>0 且为偶数,那么 N 次单位复数根的平方的集合就是
由折半引理