1. 程式人生 > >[FFT] 快速傅立葉變換學習筆記

[FFT] 快速傅立葉變換學習筆記

原文:https://blog.csdn.net/herano/article/details/71213373
-1、為什麼學 FFT

退役(很早)之前聽說 FFT 很神(e)奇(xin),Po姐來講的時候也是膜(sha)了(ye)一(bu)發(dong),於是就放那裡了。退役之後有(xian)了(de)時(mei)間(shi),並且在籃球賽之前立了贏一場的 flag 否則學FFT結果又雙叒叕全輸了,於是下面就是成果了……網上 FFT 講解多得是不看也罷……

0、什麼是 FFT?為什麼 FFT?

0.1、為什麼 FFT?

從一個簡單問題說起:大整數乘法。在做 VijosP2000 的時候,看資料範圍

O(n2)O(n2) 的 FFT 了。

0.2、什麼是 FFT?

FFT(Fast Fourier Transform),全名快速傅立葉變換,這與傅立葉變換只有半毛錢的關係,傅立葉變換是分析波的成分的方法,通過推廣傅立葉變換得到了優化的快速傅立葉變換,為了展示區別和聯絡,下面是傅立葉變換和傅立葉逆變換的公式:
傅立葉變換:

F(ω)=F[f(t)]=f(t)eiωtdtF(ω)=F[f(t)]=∫−∞∞f(t)e−iωtdt 的原像函式。具體問題請參考《高等數學》,博主還是高中生……(高中高等數學233333)
然後,我們終於可以開始講 FFT 了……

1 、(初中知識)多項式

1.1、定義

我們把形如 a0+a1x+a2x2++an1xn1a0+a1x+a2x2+⋯+an−1xn−1 等類似形式表示。

1.2、多項式的兩種表示法

1.2.1、係數表示法

我們知道,向量是個好東西(蛤?),矩陣也是個好東西(蛤?),於是我們把三者結合起來看(蛤玩意?)。
我們將 n1n−1

1.2.2、點值表示法

我們把多項式 A(x)A(x) 的點值表示。
到這裡,是不是差不多忘了要幹什麼了……

1.3、多項式的運算

1.3.1、多項式求值

這個比較簡單,拿題說。這是我還沒出也不想出的一道題,拿出來娛樂一下……
題目描述 Description

都知道 FZ 醬數學不好,數學老師很著急,於是讓她求個多項式的值。但是數學老師一不小心資料就出大了,他卻並沒有注意到這一點。老師共出了 TT 道題就崩潰了,請幫她儘快完成作業。

輸入 Input

第一行一個整數 TT

輸出 Output

對於每組資料,輸出一行,為答案。

樣例輸入 Sample Input

2
2
3 2
100
3
1 2 3
-9

樣例輸出 Sample Output

203
226

樣例解釋 Explanation

對於第一個多項式為 A(x)=2x+3A(x)=2x+3

限制 Limits

對於 50%50% 位。

那麼很好我們必須寫高精度了……
212813.4×10382128−1≈3.4×1038

1.3.1.1、方法一:O(pn2)50ptsO(pn2)→50pts

暴力不會嗎?
核心程式碼如下:
Algorithm1

1.3.1.2、方法二:O(p2nlog2n)[50,80]ptsO(p2nlog2⁡n)→[50,80]pts

這裡挨個乘太慢了,快速冪處理會快一些。
(其實不一定會快多少)
核心程式碼如下:
Algorithm2

1.3.1.3、方法三:O(p2n)100ptsO(p2n)→100pts

學過必修三嗎?
學過必修三還不會?
拿出數學必修三翻到 37 頁你看到了什麼?
秦九韶演算法可以大量減少乘法和加法次數,並且把運算量簡化為 O(n)O(n) 的。
核心程式碼如下:
Algorithm3_2
不過沒上面的優雅不是嗎……(呵呵)
回到正題上,我們要談的其實是……

1.3.2、多項式的加法和乘法

1.3.2.1、多項式加法

沒啥難度,直接加即可:

C(x)=A(x)+B(x)=i=0n1aixi+j=0n1bjxj=i=0n1(ai+bi)xi=i=0n1cixiC(x)=A(x)+B(x)=∑i=0n−1aixi+∑j=0n−1bjxj=∑i=0n−1(ai+bi)xi=∑i=0n−1cixi 完成。

1.3.2.2、多項式乘法

這就是個開括號的問題……
兩個次數界為 na,nbna,nb 就可以知道了。

C(x)=i=02n2(j=0iajbij)xi=i=02n2cixiC(x)=∑i=02n−2(∑j=0iajbi−j)xi=∑