快速傅里叶变化(FFT)含模板
快速傅里叶变化(FFT)
资料来源:https://www.bilibili.com/video/BV1Y7411W73U
前置知识索引
FFT的核心算法是基于复数和单位根的,并且在算法竞赛中FFT的最普遍应用是求i多项式乘法,或者是卷积。
复数 Complex Number
定 义 : z = a + b i 其 中 a , b ∈ R , i = n 加 法 法 则 : ( a + b i ) + ( c + d i ) = ( a + c ) + ( b + d ) i 乘 法 法 则 : ( a + b i ) ( c + d i ) = ( a c − b d ) + ( a d + b c ) i 欧 拉 定 理 : e i θ = cos θ + i sin θ 定义:z = a + bi 其中 a,b∈R ,i =\sqrt{n}\\ 加法法则:(a+bi)+(c+di) = (a+c)+(b+d)i\\ 乘法法则:(a+bi)(c+di) = (ac-bd)+(ad+bc)i\\ 欧拉定理:{e}^{iθ} = \cosθ+i\sinθ 定义:z=a+bi其中a,b∈R,i=n加法法则:(a+bi)+(c+di)=(a+c)+(b+d)i乘法法则:(a+bi)(c+di)=(ac−bd)+(ad+bc)i欧拉定理:eiθ=cosθ+isinθ
复数的几何意义
单位根
快速傅里叶变换的核心是用单位根的某些独特性质来快速实现的
我们知道每个复数都可以表示为:
z = r ∗ e i θ z = r*{e}^{iθ}\\ z=r∗eiθ
所以两复数相乘可以表示为
z 2 = r 2 ∗ e ( 2 θ ) i z^2 = r^2*e^{(2θ)i} z2=r2∗e(2θ)i
每个单位根都可以看成如下公式单位根的幂
ω n = e i 2 π n ω_n = e^{i{\frac{2\pi}{n}}} ωn=ein2π
单位根-三个引理
- lemma.1 消去引理:
ω d k d n = ω k n ω n n 2 = ω 2 = − 1 ω_{dk}^{dn} = ω_{k}^{n}\\ ω^{\frac{n}{2}}_{n} = ω_{2} = -1\\ ωdkdn=ωknωn2n=ω2=−1
证明:
ω d k d n = ( e 2 π d n i ) d k = ( e 2 π n i ) k = ω k n ω_{dk}^{dn}=(e^{\frac{2\pi}{dn}i})^{dk} = (e^{\frac{2\pi}{n}i})^{k} = ω_{k}^{n} ωdkdn=(edn2πi)dk=(en2πi)k=ωkn
- lemma.2 折半引理:
( ω n k + n 2 ) 2 = ( ω k n ) 2 = ω n 2 k (ω^{k+\frac{n}{2}}_{n})^2 = (ω_{k}^{n})^2 = ω_{\frac{n}{2}}^{k}\\ (ωnk+2n)2=(ωkn)2=ω2nk
证明:
ω n k + n 2 = ω n k ω n n 2 = − ω n k ( ω n k ) 2 = ω n 2 k = ω n 2 k ω n k + n 2 = ω n k ω n n 2 = − ω n k ( ω n k ) 2 = ω n 2 k = ω n 2 k ω^{k+\frac{n}{2}}_{n} = ω_{n}^{k}ω_{n}^{\frac{n}{2}} =- ω_{n}^{k}\\ (ω^{k}_{n})^2 = ω_{n}^{2k} = ω_{\frac{n}{2}}^{k}\\ω^{k+\frac{n}{2}}_{n} = ω_{n}^{k}ω_{n}^{\frac{n}{2}} =- ω_{n}^{k}\\ (ω^{k}_{n})^2 = ω_{n}^{2k} = ω_{\frac{n}{2}}^{k}\\ ωnk+2n=ωnkωn2n=−ωnk(ωnk)2=ωn2k=ω2nkωnk+2n=ωnkωn2n=−ωnk(ωnk)2=ωn2k=ω