FFT算法本身就是一种优化,优化(类似)卷积运算的时间复杂度
(卷积: ∑ i , j a i ∗ b j − i \sum_{i,j}a_i*b_{j-i} ∑i,jai∗bj−i)。
FFT的本质,其实是利用复数的一些特殊性质,将一个多项式快速地在点值和系数两种表示方法间来回切换。再利用两个多项式点值表示法相乘的复杂度为O(n),来达到降时间的目的。
FFT算法的前导概念
首先介绍关于复数的一些定义及性质
复数:一种形如 a + b i a+bi a+bi的数称为复数,其中 a a a为实部, b b b为虚部, i i i为虚部单位 ( i 2 = − 1 ) (i^2=-1) (i2=−1)
对于每个 a + b i a+bi a+bi, a − b i a-bi a−bi为它的共轭复数
其实可以将复数看作一个二项式,其运算法则与实数概念上的二项式几乎相同,只需要注意i即可。
另外,复数也可以用向量来表示:表示为在复平面上(a,b)的向量。向量的模长为 a 2 + b 2 \sqrt{a^2+b^2} a2+b2。
所以,同样地,复数还可以用三角函数来表示:即
a + b i = a 2 + b 2 ∗ ( c o s θ + s i n θ i ) a+bi=\sqrt{a^2+b^2}*(cos\theta+sin\theta i) a+bi=a2+b2∗(cosθ+sinθi)
在这种表示方法下,两个复数相乘,就可以表示为其角度相加,模长相乘
p ∗ ( c o s α + s i n α i ) ∗ q ∗ ( c o s β + s i n β i ) p*(cos\alpha+sin\alpha i)*q*(cos\beta+sin\beta i) p∗(cosα+sinαi)∗q∗(cosβ+sinβi)
= p ∗ q ∗ ( s i n α ∗ c o s β i + c o s α ∗ s i n β i − s i n α ∗ s i n β + c o s α ∗ c o s β ) =p*q*(sin\alpha*cos\beta i+cos\alpha*sin\beta i-sin\alpha*sin\beta+cos\alpha*cos\beta) =p∗q∗(sinα∗cosβi+cosα∗sinβi−sinα∗sinβ+cosα∗cosβ)
= p ∗ q ∗ ( c o s ( α + β ) + s i n ( α + β ) i ) =p*q*(cos(\alpha+\beta)+sin(\alpha+\beta)i) =p∗q∗(cos(α+β)+sin(α+β)i)
然后是多项式的一些概念:
首先我们将 A ( x ) = a n x n + a n − 1 x n − 1 + a n − 2 x n − 2 . . . a 1 x + a 0 A(x)=a_nx^n+a_{n-1}x^{n-1}+a_{n-2}x^{n-2}...a_1x+a_0 A(x)=anx