FFT學習筆記(DFT,IDFT)
昨天參悟了一天FFT,總算是理解了,今天的莫比烏斯反演也不太懂,乾脆棄療,決定來認真水一發部落格。
什麼是FFT?
FFT(Fast Fourier Transformation),即為快速傅氏變換,是離散傅氏變換(DFT)的快速演算法,它是根據離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的演算法進行改進獲得的。
FFT的作用?
主要用於加速多項式乘法(形如an x^n + a(n - 1) x^(n - 1) + …… + a1 x + a0),同時可以優化很多與多項式乘法相近的內容,比如高精度乘法(令x為10)。
先明確幾個概念:
複數:
由兩個部分組成,實數部分,虛數部分,形如 :a,ib(a為實數部分) 其中i^2 = -1,顯然i不是一個實數。
複數的運演算法則:
加法:實數部分相加,虛數部分相加
減法:實數部分相減,虛數部分相減
乘法:
我們來舉一個例子:
(a,ib)* (c,id)
= ac + iad + ibc + i^2bd
= (ac - bd) + i(ad + bc)
=(ac - bd,i(ad + bc))
(i ^ 2 = -1)
我們考慮用座標系來表示一下複數,
可以理解一下,對後文的一些講解會有所幫助。(注意y軸的預設單位長度為i)
由座標軸可以得出,複數(a,ib)的模長為sqrt(a^2 + b^2)
同理我麼可以得出複數的乘法運算的直觀體現,模長相乘,幅角相加。(自己可以帶入兩個(1,i1)計算來很好的理解)
多項式的係數表示與點值表示。
我們知道一個最高次項為n的多項式,有n + 1個係數,x^n……x^0的對應的係數。
如果我們將這n+1個係數構成一個n+1維的向量,顯然可以唯一的確定出一個多項式。
那麼這個向量就是係數表示式。
如果我們帶入n個數字,求算出n個對應的值,那麼這些值就構成了點值表示式。
我們同樣可以認為這個點值表示式可以唯一確定出一個多項式。
證明如下:(轉自Menci,鳴謝作者,連結詳見左側友情連結)
證明:假設命題不成立,存在兩個不同的 n−1 次多項式 A(x)、B(x),滿足對於任何 i∈[0,n−
令 C(x)=A(x)−B(x),則 C(x) 也是一個 n−1 次多項式。對於任何 i∈[0,n−1],有 C(xi)=0。
即 C(x) 有 n 個根,這與代數基本定理(一個 n−1 次多項式在複數域上有且僅有 n−1 個根)相矛盾,故 C(x) 並不是一個 n−1 次多項式,原命題成立,證畢。
插值:已知點值表達,求係數表示式
單位根:我們上文提及虛數可以在座標系內表示。我們可以在座標系內做半徑為1的圓,作為單位元,如果把單位圓分成n分,那麼最靠近x軸正半軸的一份的考上的邊即為wn = w0,即為單位根,剩下的依次為w1,w2,w3……wn-1;
其中單位根的幅角2π/n ,由尤拉公式可以得出cos2k2n2π+isin2k2n2π=coskn2π+isinkn2π
我們在求解點值表示式時,通常帶入單位根,舉個例子
如果有n項,那麼我們可以分別帶入wn^0,wn^2,wn^(n-1),這樣子便於計算,此結論是前人證明,在此不詳細敘述。
同時我們隨手得出幾個小的結論。
沒有什麼比畫圖更能說明這個兩個結論了。(結合上文提及的複數乘法)
折半定理:
ω2n2k=ωnk