關於FFT快速傅利葉變換

2021-08-26 13:03:58 字數 1497 閱讀 2923

前一段時間荒廢掉了……一直在糾結zkw大牛的數學歸納法的**……結果看不懂……

一直很糾結fft是怎麼實現的

一直以為fft是很巧妙的利用數論之類的東西做,所以每次看到這方面的資料就蛋疼,因為一般都畫了個座標系,然後就懵了……

昨天晚上無聊翻算導看到fft這一章,就把它學了,發現算導有的時候講細一點還是有好處的,至少看得懂……

首先要明確的一點是fft是用來求多項式相乘的,高精度乘法只是其中一種應用而已(把基看做多項式中的x)

那麼大致過程是多項式的係數表示->dft(o(nlogn))->多項式的點值表示->相乘(o(n))->dft逆變換(o(nlogn))->得到相乘後的多項式係數表示

一直到省選之前應該都比較忙……具體細節以後再來補好了……

我用了complex類,**參考自7k+……//今天才知道有complex類……

要注意的是就算complex使用的是double(應該說正因為使用的是double……),基不能選的很大

在貢獻了若干次wa以後得到的結論是基最好是100000,再高就會爆精度,哪怕用long double也是一樣……

fft模板題

//lib #include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std; //macro #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i) #define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i) #define erep(i,e,x) for(int i=x;i;i=e[i].next) #define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++) #define read() (strtol(ipos,&ipos,10)) #define sqr(x) ((x)*(x)) #define pb push_back #define ps system("pause"); typedef long long ll; typedef pairpii; typedef complexcomp; const int oo=~0u>>1; const double inf=1e20; const double eps=1e-6; const double pi=acos(-1.0); string name="fft",in=".in",out=".out"; const int maxn=131073; const comp i=comp(0,1); const int limit=100000; //var comp a[maxn],b[maxn],c[maxn]; int base[10],len,n,la,lb; long double d; char s[100000]; void getnum(comp num,int &ln) } void fft(comp num,long double root) n--;while(n>=0&&fabs(c[n].real())

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