快速傅利葉變換 FFT

2022-05-07 20:57:12 字數 2232 閱讀 2322

快速傅利葉變換,用來求出兩個多項式相乘,如果暴力相乘,時間複雜度為\(o(n^2 )\),使用快速傅利葉變換,可以優化到\(o(n \log n)\)。

準備知識:

多項式:設\(a(x)\)表示乙個n次多項式,則\(a(x)=a_0x^0+a_1x^1+\cdots+a_x^\)

多項式的表示方法:

一是用係數表示法,表示為\(\sum_^a_ix^i\),二是點值表示法,表示為對於幾個具體的\(x\)對應的\(a(x)\)的值,最少需要\(n\)個不同的點就能表示唯一乙個\(n-1\)次多項式。

多項式運算:

加法:

如果使用係數表示法,則將各個係數相加,複雜度為\(o(n)\);

如果使用點值表示法,則將橫座標相同點的縱座標相加,複雜度相同。

乘法:

如果使用係數表示法,則設得到的多項式為\(\sum_^nc_ix^i\),其中,\(c_i=\sum_a_jb_k\),很顯然,時間複雜度為\(o(n^2)\);

如果使用點值表示法,則將橫座標相同點的縱座標相乘,複雜度仍不變,為\(o(n)\)。

向量:

物理、幾何學意義:同時具有大小和方向的量。向量相加滿足平行四邊形定則。

複數:

分為實部與虛部,形如\(a+bi\),詳見。

複數單位根:

將複數\(a+bi\)中a看做橫座標,b看做縱座標,則複數單位根為到原點距離為1的點。這些點構成的集合為乙個圓,稱為單位圓。單位圓的n等分點稱為n次單位根,將幅角為正且最小的數設為\(\omega_n\),則n次單位根分別為\(\omega_n^2,\omega_n^3,\dots,\omega_n^n\)。\(\omega_n=\omega_n^n=1\)。根據尤拉公式\(e^=\cos \theta+i\ \sin \theta\),\(\omega_n^k=e^}=\cos k \cdot \frac+i\sin k \cdot \frac\)。

易知,\(\omega_n^}=-\omega_n^k,\omega_n^2=\omega_}\)。(可以畫圖試試)

快速傅利葉變換的思想主要是分治。

進行快速傅利葉變換,就是將n個n次單位根分別對多項式求出對應的值。

對於多項式a(x),將其n次單位根帶入,則可得到\(a(\omega_n^k)=\sum_^na_i\omega_n^\)

我們將其按照奇偶性分組,得到:\(a(\omega_n^k)=\sum_^a_\omega_n^+\omega_n^k\sum_^a_\omega_n^\)

由上面的公式得:\(a(\omega_n^k)=\sum_^a_\omega_^+\omega_n^k\sum_^a_\omega_^\)

並且\[\begin a(\omega_n^}) &=& \sum_^-1}a_\omega_}^+\omega_n^}\sum_^-1}a_\omega_}^ \\ &=&\sum_^-1}a_\omega_}^-\omega_n^k\sum_^-1}a_\omega_}^ \end

\]這樣需要帶入的值就減少了一半,時間複雜度為\(t(n)=2t(n/2)+o(n)=o(n\log n)\)。

當然,我們還需要將點值表示轉化為係數表示,具體實現就是傅利葉逆變換,就是把原來的傅利葉變換裡的\(\omega_n^k\)變成\(-\omega_n^k\)帶上然後把係數除以n就好了。證明:我不會。。

實現的快速方法:二進位制優化,背板子就好了qaq

#include#include#include#includeusing namespace std;

const int maxn=1100000;

const double pi=3.14159265358979323846;

int n,m,r[maxn],limit=1,l;

struct complex a[maxn],b[maxn];

complex operator + (complex a,complex b) ;

}complex operator - (complex a,complex b) ;

}complex operator * (complex a,complex b) ;

}void fft(complex *a,int type)

快速傅利葉變換FFT

fft的作用就不多說了,搞訊號處理的人都會用上。fft的由來 傅利葉變換ft 離散傅利葉變換dft 快速傅利葉變換fft。學習資料 1 陳後金的 數字訊號處理 裡面深入淺出,該有的公式都有,程式設計思想也有。2 一篇系統講述傅利葉變換的帖子 3 學生對fft的理解 4 工程人員對fft的簡單明瞭的總...

快速傅利葉變換 FFT

bzoj 2179 fft快速傅利葉 果題 bzoj2194 請計算c k sigma a i b i k 其中 k i n 並且有 n 10 5。a,b中的元素均為小於等於100的非負整數。注意到i 和 i k有奇妙的聯絡 不妨嘗試把b翻轉 然後就變成卷積了。貼個模板 include define...

快速傅利葉變換 FFT

首先說一下我用fft做什麼,我要做的是多項式乘法,或者說,加速多項式乘法。考慮多項式a x j 0n 1aj xj,它一共有 n 項,我們稱它的次數界為 n。假設我們有兩個次數界為 n 的多項式a x 和b x 要求它們的和是非常簡單的,只需要將對應的係數相加,複雜度為o n 如果要求他們的積,則需...