快速傅利葉變換FFT

2021-08-15 03:15:36 字數 2233 閱讀 6447

本文著重講述fft的簡單原理,讓朋友們閱讀完本篇文章之後能夠對快速傅利葉變換有乙個大致概念。至於演算法的具體數學論證,由於涉及到的數學知識比較多博主自己也沒有搞懂,想要了解的朋友推薦這兩篇文章傳送門1,傳送門2以及演算法導論(第三版)第30章。

多項式有兩種表達方式,一種是我們熟悉的係數表示式,對於n次多項式a,可以表示為 a(

x)=∑

i=0n

−1ai

xi也就是 a(

x)=a

0+a1

x1+a

2x2+

⋅⋅⋅+

an−1

xn−1

另一種就是點值表示式,乙個n次多項式要用n個點對組成集合,a(

x)用點值表示式可以寫成 a(

x)=

使得對k=0

,1,⋅

⋅⋅,n

−1,所有xk

各不相同 yk

=a(x

k)係數表示式的多項式乘法咱們已經很熟悉了,就是將兩個多項式相乘然後合併同類項,時間複雜度為o(

n),而如果使用點值表示式計算多項式乘法的話則可以在o(

n)的複雜度內完成計算,假設有兩個n次多項式 a(

x)=b

(x)=

則a(x)∗b

(x) 為

點值表示式比係數表示式計算多項式乘法快,這為我們提供了計算多項式乘法提供了新方法,先將多項式轉換成點值表示式再用點值表示式計算多項式乘法,再將點值表示式轉換成係數表示式得到結果,可以用下圖來表示

我們可以看到,ff

t 就是將係數表示式轉換成點值表示式的過程,點值表示式轉換成係數表示式就是ff

t 的逆過程。

可以簡單計算一下,如果隨機取n個值,將係數表示式轉換成點值表示式,複雜度為o(

n2) ,這和我們想要簡化計算的需求相衝突,所以這裡我們引入

n 次單位根來做序列來使轉換可以折半遞迴計算,加速轉換(涉及數學知識過多,不做過多贅述,有興趣的朋友可以去看上面提供的部落格,也可以翻閱演算法導論第30章學習),使得ff

t的時間複雜度為o(

nlog

(n))

。下面是hdu1402高精度乘法的題解**,也可以作為ff

t 的模板使用。

#include using namespace std;

const double pi = acos(-1.0);

struct co

co operator +(const co &b)

co operator -(const co &b)

co operator *(const co &b)

};void change(co y,int

len)

k = len

/2; while(j >= k)

if(j < k)

}}void fft(co y,int

len,int on)}}

if(on ==-1)

}}const

int maxn =200010;

co x1[maxn],x2[maxn];

string str1,str2;

int sum[maxn];

int main()

for(int i =0;i < len1;i++)

for(int i = len1;i < len;i++)

for(int i =0;i < len2;i++)

for(int i = len2;i

fft(x1,len

,1);

fft(x2,len

,1);

for(int i =0;i

fft(x1,len

,-1);

for(int i =0;i < len;i++)

for(int i =0;i < len;i++)

len = len1+len2-1;

while(sum[len]<=0&&len

>0)

for(int i = len;i>=0;i--)

cout << '\n';

}return

0;}

需要注意的是如果多項式的次數不是2的整數次冪需要用係數0補齊至2的整數次冪,這樣才能迭代計算,所以在使用時初始化也要注意,要將補齊部分也初始化。

快速傅利葉變換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 如果要求他們的積,則需...