快速傅里叶变换:
快速傅里叶变换 (fast Fourier transform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。
FFT(Fast Fourier Transformation) 是离散傅氏变换(DFT)的快速算法。即为快速傅氏变换。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
多项式的两种表达方法:
1.系数表达法:
2.点值表达法:
在函数图像中,F[x]这个多项式可以被n个点唯一确定,即代入n个点作为x,分别解出对应的 y,得到n个式子。把这n条式子联立起来成为一个有n条方程的n元方程组,每一项的系数都可以解出来.(可类比二元一次方程) 也就是说,使用
多项式相乘
设两个多项式分别为f(x),g(x),我们要把这两个多项式相乘 (即求卷积)。
如果用系数表示法: 我们要枚举f的每一位的系数与g的每一位的系数相乘,多项式乘法时间复杂度
如果用点值表示法:
我们可以发现,如果两个多项式取相同的x,得到不同的y值,那么只需要y值对应相乘就可以了!复杂度只有枚举x的O(n)。那么问题转换为将多项式系数表示法转化成点值表示法。
系数转点值的算法叫DFT(离散傅里叶变换),优化后为FFT(快速傅里叶变换),点值转系数的算法叫IDFT(离散傅里叶逆变换),优化后为IFFT(快速傅里叶逆变换)。
FFT加速多项式乘法
由于多项式乘法用点值表示比用系数表示快的多,所以我们先要将系数表示法转化成点值表示法相乘,再将结果的点值表示法转化为系数表示法的过程。
第一个过程叫做FFT(快速傅里叶变换),第二个过程叫IFFT(快速傅里叶逆变换)
在讲这两个过程之前,首先了解一个概念:
单位根
复数
怎么找单位根?
单位圆:圆心为原点、1为半径的圆
把单位圆n等分,取这n个点(或点表示的向量)所表示的复数(即分别以这n个点的横坐标为实部、纵坐标为虚部,所构成的虚数),即为n次单位根。当n=8时,所有的8次单位根,分别记为
从点(1,0)开始(即
根据每个复数的幅角,可以计算出所对应的点/向量。
单位根的性质
DFT(离散傅里叶变换)
对于任意多项式系数表示转点值表示,例如
FFT(快速傅里叶变换)
虽然DFT能把多项式转换成点值但它仍然是代入n个数,复杂度仍然是O(n2),所以它只是快速傅里叶变换的朴素版。所以我们要考虑利用单位根的性质,加速我们的运算,得到FFT(快速傅里叶变换)
对于多项式
将A(x)的每一项按照下标的奇偶分成两部分:
设两个多项式
显然,
假设k<n,代入
考虑
而
IFFT(快速傅里叶逆变换)
一个重要结论
把多项式A(x)的离散傅里叶变换结果作为另一个多项式B(x)的系数,取单位根的倒数(单位根的倒数其实就是它的共轭复数 。)即
优化:迭代FFT
在进行FFT时,我们要把各个系数不断分组并放到两侧,一个系数原来的位置和最终的位置的规律如下。
初始位置:
第一轮后:
第二轮后:
第三轮后:
“|”代表分组界限
把每个位置用二进制表现出来。位置x上的数,最后所在的位置是“x二进制翻转得到的数”,例如4(100)最后到了1(001)5(101)最后不变为5(101),3(011)最后到了6(110)。