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

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

學習了一波 F F T FFT ,只是淺淺的入門。還有很多前置知識,有一些還不是太瞭解,完了深入學習之後再補部落格 q w q

qwq
以下內容大部分參考秦嶽學長的課件

多項式

形如 A ( x ) = k

= 0 n 1 a k ×
x k A(x)=\sum_{k=0}^{n-1}a_k\times x^k ,其中 a k a_k 為多項式係數
C ( x ) = A ( x ) + B ( x ) C(x)=A(x)+B(x) c k = a k + b k c_k=a_k+b_k
C ( x ) / A ( x ) = B ( x ) C(x)/A(x)=B(x) c n = a k × b n k c_n=\sum a_k\times b_{n-k}

多項式的表示法:
係數表示式:上面說的
點值表示式:給出 N + 1 N+1 個不同的 x x 代入 A ( x ) A(x) 的點值,這樣的 N + 1 N+1 個元素構成的集合 { ( x 0 , y 0 ) , ( x 1 , y 1 ) , , ( x n , y n ) } \{(x0,y0),(x1,y1),…,(xn,yn)\} ,其中 y i y_i = A ( x i ) A(x_i) ,稱為點值表示法。

唯一性定理:證明可用範德蒙矩陣行列式

係數與點值
係數表示法的 n n 次多項式 A ( x ) , B ( x ) A(x),B(x) 可以 O ( n ) O(n) 快速求得 A ( x ) + B ( x ) A(x)+B(x) ,但是卷積通常需要 O ( n 2 ) O(n^2) 計算

點值表示法的 n n 次多項式卷積也可以 O ( n ) O(n) 計算,只需將值域 y y 對應相乘即可 { ( x i , y i ) } × { ( x i , z i ) } = { ( x i , y i z i ) } \{(xi,yi)\}×\{(xi,zi)\}=\{(xi,yi*zi)\} (由於 n n 項確定次數界為 n n 的多項式,故計算卷積是至少保留 2 n 2n 項)

實際上點值表示法的卷積計算的是圓周卷積

點值與係數的轉化
1. 1. 係數表示法 點值表示法
樸素計算 O ( n 3 ) O(n^3)
秦九韶演算法/霍納法則 O ( n 2 ) O(n^2)
2. 2. 點值表示法 係數表示法
高斯消元 O ( n 3 ) O(n^3)
拉格朗日插值法 O ( n 2 ) O(n^2) A ( x ) = 0 < = k < = n y k Π ( j k ) ( x x j ) / ( x k x j ) A(x)=∑_{0<=k<=n}y_k*Π(j≠k)(x-x_j)/(x_k-x_j)
(原理:構造求和式當 x = x k x=x_k 時只有一項為 y k y_k ,其餘全為 0 0 )

(霍納法則不會 q w q qwq ,等以後補

F F T FFT 可以在 O ( n l o g n ) O(nlogn) 時間內求出多項式卷積

複數

單位複數 i = s q r t ( 1 ) i=sqrt(-1) ,複數表示為 ( a + b × i ) (a+b\times i) 的形式,運算和實數類似。
其實複數就相當於向量,複數的計算可以用向量計算來解決

struct complex{
    double x,y;
    complex(double xx=0,double yy=0) {x=xx,y=yy;}
}a[maxn],b[maxn];
complex operator +(complex a,complex b) {return complex(a.x+b.x,a.y+b.y);}
complex operator -(complex a,complex b) {return complex(a.x-b.x,a.y-b.y);}
complex operator