FFT
前言
FFT(Fast Fourier Transformation),能够在时间复杂度为O(nlogn)的时间内将多项式的系数表示法转换成点值表示法。
一、系数表示法和点值表示法
1.1、系数表示法
f ( x ) = ∑ i = 0 n − 1 a i x i f(x) = \displaystyle\sum_{i=0}^{n-1} a_ix_i f(x)=i=0∑n−1aixi 可以用每一项的系数表示,即:
就是平常最常使用的方法
1.2、点值表示法
把 n 个不同的 x x x 代入 f ( x ) f(x) f(x),会得出 n 个不同的值,根据插值法原理可知这 n 个点可以唯一确定一个多项式,即 f ( x ) f(x) f(x),所以:
1.3、多项式相乘时的时间复杂度
当两个 n-1 次多项式 f ( x ) , g ( x ) f(x), g(x) f(x),g(x)相乘时:
⋅ · ⋅系数表示法的复杂度: O ( n 2 ) O(n^2) O(n2);
⋅ · ⋅点值表示法的复杂度: O ( n l o g n ) O(n logn) O(nlogn);
所以:将系数表示法转换成点值表示法,可以有效降低复杂度;
但是 不能直接代入 n 个任意不同的 x x x值,因为从系数表示法转换到点值表示法还是 O ( n 2 ) O(n^2) O(n2),而FFT就能够在 O ( n l o g n ) O(nlogn) O(nlogn)的条件下完成这项任务;
二、FFT预备知识
2.1、复数
在复数范围内令 ω n = 1 \omega^n = 1 ωn=1,可以得到 n 个不同的复数根{
ω n 0 , ω n 1 , . . . , ω n n − 1 \omega_n^0, \omega_n^1, ..., \omega_n^{n-1} ωn0,ωn1,...,ωnn−1},且均匀分布在模长为1的圆上,
单位根的性质:
1) ω n m = ω 2 n 2 m \omega_n^m = \omega_{2n}^{2m} ωnm=ω2n2m;
2) ω n m = − ω n m + n 2 \omega_n^m = -\omega_{n}^{m+\frac{n}{2}} ωnm=−ωnm+2n;
3) ( ω n m ) 2 = ω n 2 m (\omega_n^m)^2 = \omega_{n}^{2m} (ωnm)2=ωn2m;
4) ω n m = c o s m n 2 π + i s i n m n 2 π \omega_n^m = cos\frac{m}{n}2π+isin\frac{m}{n}2π ωnm=cosnm2π+isinnm2π;
2.2、蝶形变换
对于 A ( x ) = ∑ i = 0 n − 1 a i x i = a 0 + a 1 x 1 + a 2 x 2 + . . . + a n − 1 x n − 1 : A(x)=\displaystyle\sum_{i=0}^{n-1} a_ix_i = a_0+a_1x^1+a_2x^2+...+a_{n−1}x^{n−1}: A(x)=i=0∑n−1aixi=a0+a1x1+a2x2+...+an−1xn−1:
按 A ( x ) A(x) A(x) 下标的奇偶性把 A ( x ) A(x) A(x)分成两半,右边再提一个 x : x: x:
A ( x ) = ( a 0 + a 2 x 2