日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速傅里叶变换(FFT)详解

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速傅里叶变换(FFT)详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速傅里葉變換(FFT)詳解

  (這是我第一次寫博,不喜勿噴...)

  關于FFT已經聽聞已久了,這次終于有機會在Function2的介紹下來了解一下FFT了。

  快速傅里葉變換(Fast Fourier Transformation)簡稱FFT。在各大OI競賽中也常有用到,也是一個十分優秀的可以裝逼的好算法

  在這篇blog中,有大量數學推導,因為我懶得寫公式(好復雜,逃),所以用圖片代替了╮(╯▽╰)╭,如有不適,望見諒(逃~~)。

?基礎知識:

多項式的度數:

多項式的線性空間

系數表達

?

向量的卷積

?

分治乘法(如果你急著和MM約會或機房要關門了,那跳過也無妨)

點值表達

?

插值

?

?

點值計算分析

?單位復數根

?

單位復數根的性質

  • 消去引理
  •     

      2.折半引理

        

      3.求和引理

        

    ?

    鋪墊都鋪完了,讓我們一起進入DFT,FFT,IDFT的美妙世界吧!

    離散傅里葉變換(Discrete Fourier Transform 簡稱DFT)

    ?快速傅里葉變換(FFT)(終于等到你~~)

    ?

    ?

    逆離散傅里葉變換(Inverse Discrete Fourier Transform 簡稱IDFT)

    ?FFT的迭代實現

    我們類似于需要像這樣實現FFT:

    知識點終于講完了,接下來我們就要開始寫板子了

    板子題:uoj #34

    代碼附上~~

    1 #include<cstdio>2 #include<iostream>3 #include<cmath>4 #include<cstring>5 #include<algorithm>6 #include<cstdlib>7 using namespace std;8 const int mod=1e9+7;9 const double pi=acos(-1); 10 struct cn 11 { 12 double x,y; 13 cn (double x=0,double y=0):x(x),y(y) {} 14 }a[300005],b[300005],c[300005]; 15 cn operator + (const cn &a,const cn &b) {return cn(a.x+b.x,a.y+b.y);} 16 cn operator - (const cn &a,const cn &b) {return cn(a.x-b.x,a.y-b.y);} 17 cn operator * (const cn &a,const cn &b) {return cn(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);} 18 void fft(cn a[],int n,int l,int f) 19 { 20 int rev[n+5]; 21 rev[0]=0; 22 for (int i=1; i<n; i++){ 23 rev[i]=(rev[i>>1]>>1)|((i&1)<<l-1); 24 if (i<rev[i]) swap(a[i],a[rev[i]]); 25 } 26 for (int i=1; i<n; i<<=1){ 27 cn wi(cos(pi/i),f*sin(pi/i)); 28 for (int j=0; j<n; j+=i*2){ 29 cn w(1,0); 30 for (int k=0; k<i; k++){ 31 cn x=a[j+k],y=w*a[j+k+i]; 32 a[j+k]=x+y; 33 a[j+k+i]=x-y; 34 w=w*wi; 35 } 36 } 37 } 38 if (f==-1) 39 for (int i=0; i<n; i++){ 40 a[i].x/=n; a[i].y/=n; 41 } 42 } 43 int main() 44 { 45 int n,m; 46 scanf("%d%d",&n,&m); n++; m++; 47 for (int i=0; i<n; i++) scanf("%lf",&a[i].x); 48 for (int i=0; i<m; i++) scanf("%lf",&b[i].x); 49 int l=0,N=1; 50 while (N<n+m-1) N<<=1,l++; 51 fft(a,N,l,1); 52 fft(b,N,l,1); 53 for (int i=0; i<N; i++) c[i]=a[i]*b[i]; 54 fft(c,N,l,-1); 55 for (int i=0; i<n+m-1; i++) printf("%d ",(int)(c[i].x+0.5)); 56 return 0; 57 }

    總結

    以上是生活随笔為你收集整理的快速傅里叶变换(FFT)详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。