背景
據說是高斯發明的
考慮從六年級開始學的多項式相乘,需要將所有項相乘並打開,時間復雜度\(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
)
快速傅里葉變換
將一個多項式奇偶分開,為了對稱先將其補成\(2^k\)項.如:
奇偶分組可得:
設新函數\(G(x)\) , \(H(x)\)
\(f(x)\)表示為:
代入單位復根\(\omega^k_n\):
代入\(\omega_n^{k+n/2}\):
發現由(16)(17)兩個式子套上\(\operatorname{DFT}\),可以將\(\operatorname{DFT}\)中的n逐步化為1,從而求出結果.顯然對於每個k分別代入即可.這樣就在\(O(nlogn)\)的時間內求出了這個n-1次多項式的n組根(這里的n指的是補齊項之后的項數).
此外也可以將遞歸分治改為倍增,需要用到位逆序置換.