快速傅利葉變換(FFT)

2022-03-30 07:42:56 字數 1548 閱讀 3135

快速傅利葉變換,簡稱fft,是一種可以o(nlogn)的時間內計算n次多項式乘法的演算法。

寫得很好的部落格:自為風月馬前卒大佬的部落格。

大致步驟是:

1.先將兩個多項式的係數表達法o(nlogn)都轉化成點值表達法。

例如:y=a0+a1*x+a2*x2+a3*x3+...+an*xn可以轉化為n+1個點(x1,y1),(x2,y2),(x3,y3),...,(xn,yn),(xn+1,yn+1)

這n+1個點也能確定這個多項式,就像兩點確定一條直線,三點確定一條拋物線一樣。

同理第二個多項式也轉化為n+1個點,這n+1個點的x要與第乙個多項式的點的x分別相等。

2.x相同的點所對應的y可以o(n)直接相乘,達到多項式相乘的效果。

3.再將點值表達法轉化為係數表達法就行了。

然後發現暴力轉化的話時間是o(n2),那麼如何優化呢,這裡就要牽扯到複數的概念和性質了,前面的部落格裡寫的非常好,我就不再贅述了其實就是懶。

下面是遞迴版的**和非遞迴版的**:(遞迴版的時間又長空間又大好像沒什麼用,但應該可以幫助理解吧w)

#includeusing

namespace

std;

const

int n=4e6+1e5;

const

double pai=acos(-1.0

);double

co[n],si[n];

struct

complex

}a[n],b[n];

complex

operator+(complex x,complex y)

complex

operator-(complex x,complex y)

complex

operator*(complex x,complex y)

intrd()

void fft(int n,complex *a,int

opt)

intmain()

遞迴版

#includeusing

namespace

std;

const

int n=4e6+1e5;

const

double pai=acos(-1.0

);int

r[n];

double

co[n],si[n];

struct

complex

}a[n],b[n];

complex

operator+(complex x,complex y)

complex

operator-(complex x,complex y)

complex

operator*(complex x,complex y)

intrd()

void fft(int n,complex *a,int

opt)}}

}int

main()

非遞迴版

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