1. 程式人生 > >FFT學習筆記(DFT,IDFT)

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 - 1n1 次多項式 A(x)A(x)B(x)B(x),滿足對於任何 i \in [0,\ n - 1]i[0,n

1],有 A(x_i) = B(x_i)A(xi)=B(xi)

令 C(x) = A(x) - B(x)C(x)=A(x)B(x),則 C(x)C(x) 也是一個 n - 1n1 次多項式。對於任何 i \in [0,\ n - 1]i[0,n1],有 C(x_i) = 0C(xi)=0

即 C(x)C(x) 有 nn 個根,這與代數基本定理(一個 n - 1n1 次多項式在複數域上有且僅有 n - 1n1 個根)相矛盾,故 C(x)C(x) 並不是一個 n - 1n1 次多項式,原命題成立,證畢。

插值:已知點值表達,求係數表示式

單位根:我們上文提及虛數可以在座標系內表示。我們可以在座標系內做半徑為1的圓,作為單位元,如果把單位圓分成n分,那麼最靠近x軸正半軸的一份的考上的邊即為wn = w0,即為單位根,剩下的依次為w1,w2,w3……wn-1;

其中單位根的幅角2π/n ,由尤拉公式可以得出cos2k2n2π+isin2k2n2π=coskn2π+isinkn2π

我們在求解點值表示式時,通常帶入單位根,舉個例子

如果有n項,那麼我們可以分別帶入wn^0,wn^2,wn^(n-1),這樣子便於計算,此結論是前人證明,在此不詳細敘述。

同時我們隨手得出幾個小的結論。

沒有什麼比畫圖更能說明這個兩個結論了。(結合上文提及的複數乘法)

折半定理:


\omega_{2n} ^ {2k} = \omega_n ^ k
ω2n2k=ωnk