众所周知(),FFT凭借如下公式得以实现
一、单位根的计算
在FFT中,对于下标不同的单位根,可以不用重复计算。此处单位根下标
二、系数最终位置的确定
在FFT中,把多项式系数依据奇偶次幂分开进行分治。递归版的FFT中,在函数开头进行分组,每个系数的位置都变化了不止一次,但实际上我们可以一次性完成系数最终位置改变。
考虑第
那么对于初始的
- 若
( 为偶数),则 将在组内的左半边 - 若
( 为奇数),则 将在组内的右半边
可以得出,在第
- 若
( 在组内的编号为偶数),则 将在组内的左半边 - 若
( 在组内的编号为奇数),则 将在组内的右半边
那么
在第
- 若
在左半边,则其位置为 - 若
在右半边,则其位置为
两者即
那么类似地,在第
- 若
在左半边,则 - 若
在右半边,则
即
于是有
有了这个结论我们就可以直接从底部开始迭代。
注意若
三、蝴蝶变换
在一般的FFT中,我们这样从底部进行迭代
1 | xa=omega[size/lenth*j]*a[i+j+lenth/2];//lenth 为上次各多项式组的系数个数,size为多项式的总系数个数,i为各组起点,j为组内偏移量 |
然后在此次变换完成之后将结果储存回数组
1 | a[i+j]=mid[i+j]; |
需要一个中间数组来储存变换的值。但是蝴蝶变换可以不使用这个中间数组,减少赋值。
由公式可得
可以发现
1 | xa=omega[size/lenth*j]*a[i+j+lenth/2]; |
速度会快一些