快速傅里葉變換(FFT) 學習筆記


背景

據說是高斯發明的

考慮從六年級開始學的多項式相乘,需要將所有項相乘並打開,時間復雜度\(O(n^2)\).FFT能在\(O(nlogn)\)時間復雜度內解決這一問題.由於整數可以被拆成系數與進制冪之積的和,所以大整數乘法也可以用FFT加速.

表示法

一種顯然的加速方式:在學習拉格朗日插值的過程中我們已經發現,n+1個點可以確定一個n次的多項式.所以兩個n次多項式相乘可以通過取n+1次值,再把值乘起來的方式實現.顯然有正確性.這樣用n+1個點表示n次多項式的方法為點值表示法.

單位復根

現在考慮如何快速將系數表示法轉化為點值表示法.我們在快速冪中已經學習了相關思想,即二進制拆分+分治/倍增.首先發現計算乘積非常浪費時間,如果能找到相乘始終為定制的數就可以加速這一過程.於是在復平面上選取單位圓,使復數 \(\omega\) 滿足 \(\omega^k=1\) ,這樣的復數稱為復根(實際上是k等分圓周).又容易發現,對於n等分圓周產生的n個復根,只要知道第一個就可以將其他復根表示成它的冪次.我們用\(\omega_i^j\)表示i等分圓周產生的第j個復根,顯然有以下性質:(圖:OI wiki)

img

\[\omega^k_n=\omega^{k\%n}_n\\ \omega^0_n=1\\ \omega^n_n=1\\ \omega^j_n*\omega^k_n=\omega^{j+k}_n\\ \omega^{2k}_{2n}=\omega^k_n\\ \omega^{k+n}_{2n}=-\omega^{k}_{2n} \]

快速傅里葉變換

將一個多項式奇偶分開,為了對稱先將其補成\(2^k\)項.如:

\[f(x)=a_0+a_1x+a_2x^2+a_3x^3 \]

奇偶分組可得:

\[f(x)=(a_0+a_2x^2)+(a_1x+a_3x^3)\\ =(a_0+a_2x^2)+x(a_1+a_3x^2) \]

設新函數\(G(x)\) , \(H(x)\)

\[G(x)=(a_0+a_2x)\\ H(x)=(a_1+a_3x) \]

\(f(x)\)表示為:

\[f(x)=G(x^2)+xH(x^2) \]

代入單位復根\(\omega^k_n\):

\[f(\omega^k_n)=G((\omega^k_n)^2)+\omega^k_nH((\omega^k_n)^2)\\ =G(\omega^{2k}_n)+\omega^k_nH(\omega^{2k}_n)\\ =G(\omega^{k}_{n/2})+\omega^k_nH(\omega^{k}_{n/2})\\ \]

代入\(\omega_n^{k+n/2}\):

\[f(\omega_n^{k+n/2})=G(\omega^{k}_{n/2})-\omega^k_nH(\omega^{k}_{n/2})\\ \]

發現由(16)(17)兩個式子套上\(\operatorname{DFT}\),可以將\(\operatorname{DFT}\)中的n逐步化為1,從而求出結果.顯然對於每個k分別代入即可.這樣就在\(O(nlogn)\)​的時間內求出了這個n-1次多項式的n組根(這里的n指的是補齊項之后的項數).

此外也可以將遞歸分治改為倍增,需要用到位逆序置換.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM