看了好久终于弄懂FFT了,记录下来,免得忘了。
FFT需要的基础有矩阵乘法和逆,这里写了,欧拉公式,单位复数根,其实FFT主要的还是理解多项式的点值表达,然后用单位复数根的性质实现蝶形运算就神奇的把计算的复杂度降到O(nlogn)了。
点值表达
多项式的点值表达,就是有一个多项式,将它看作一个函数,然后在x 轴上找n个x,代入就能得到n 个点。
比如有一个多项式:
A(x)=∑n−1i=0aixi
将它看作一个函数,在数轴上找n个点:
x0,x1,x2,.....,xn−1
代入A(x) ,就得到了n个点:
{
(x0,y0),(x1,y1),......,(xn−1,yn−1)}
这n个点就是这个A(x)的点值表达。
可能这样其实还是不清楚换成用点值表达有什么用,但是用矩阵相乘的方式表达出来就能看出些问题:
⎡⎣⎢⎢⎢⎢11...1x0x1...xn−1x20x21...x2n−1............xn−10xn−11...xn−1n−1⎤⎦⎥⎥⎥⎥ ⎡⎣⎢