FFT

大佬博客
基本的东西在这里面都比较全,解释一下一些可能的疑点:

  1. 其实单位根还有一条比较好用的性质——wnxwny=wnx+yw^x_n*w^y_n=w^{x+y}_n ,关于这一结论可以先转为复数形式,相乘并用三角函数恒等变换化简得到
  2. 最开始存系数的数组在跑完第一遍FFT以后,存的就相当于那nnxx对应的yy
  3. 之所以每一层出来出来的wnkw^k_n所属的nn会不一样,其实是因为wn2k=wn2kw^{2k}_n=w^k_{\frac{n}{2}} ,类似于快速幂的思想,按下标奇偶分着算到最后凑出来的数将会是对的
  4. 附加的e~,感觉上来说,FT和DFT唯一的关系就在于FT对于正弦波向其出现程度的转化和出现程度逆转化回正弦波就如同DFT中对多项式的系数与点值表示法的相互转换,而FFT则是利用了一些特殊性质进行二分优化

蝶形变换

我觉得还是精讲一下蝶形变换吧,毕竟这个玩意还是有一点点难想。

蝶形变换,就是为了解决二进制反转后序号的问题,即把每一个数转换成二进制形态,再完全反转过来,按得到的数值重排。

其实不要把蝶形变换看的很难就导致想到一些稀奇古怪的做法,事实上,他利用的更多是一种递推。

我们得到一个下标 aa 所在位置 xx ,那么如果我想用它来得到 a<<1a<<1(a<<1)+1(a<<1)+1 的位置该怎么做?

类似 dpdp 的递推,思考一下假设是正常的未变换形态,那么我们可以得到就是x<<1x<<1(x<<1)+1(x<<1)+1,毕竟就相当于左移一位了嘛,只不过奇数需要在最后一位补上一个 11

那相对应的,变换后的理应满足是右移一位,也就是之前的反向,而奇数就是在最高位添加一个 11

这样一来,我们就有Θ(n)\Theta(n)求出蝶形变换的方法了。

这名字听着倒还挺美