【快速傅里叶变换】
〖相关资料〗
《从多项式乘法到快速傅里叶变换》 《Fast Fourier Transform》
《【快速傅里叶变换】【FFT】【WikiOI】【P3132】【高精度练习之超大整数乘法】》
〖模板代码〗
[FFT]
1 const double pi=acos(-1); 2 struct cpx{double r,i;cpx(double _r=0,double _i=0):r(_r),i(_i){};}; 3 cpx operator + (cpx a,cpx b){return cpx(a.r+b.r,a.i+b.i);} 4 cpx operator - (cpx a,cpx b){return cpx(a.r-b.r,a.i-b.i);} 5 cpx operator * (cpx a,cpx b){return cpx(a.r*b.r-a.i*b.i,a.r*b.i+a.i*b.r);} 6 void fft(cpx *a,int n,int f) 7 { 8 int k=0;while((1<<k)<n)k++; 9 for(int i=0;i<n;i++) 10 { 11 int t=0; 12 for(int j=0;j<k;j++) 13 if(i&(1<<j))t|=(1<<(k-j-1)); 14 if(i<t)swap(a[i],a[t]); 15 } 16 for(int l=2;l<=n;l<<=1) 17 { 18 int m=l>>1; 19 cpx nw=cpx(cos(2*pi/l),sin(2*pi/l)*f); 20 for(cpx *p=a;p!=a+n;p+=l) 21 { 22 cpx w=cpx(1,0); 23 for(int i=0;i<m;i++) 24 { 25 cpx t=p[m+i]*w;w=w*nw; 26 p[m+i]=p[i]-t;p[i]=p[i]+t; 27 } 28 } 29 } 30 } 31 void mul(cpx *c1,int n1,cpx *c2,int n2,int *ans) 32 { 33 int n=1;while(n<n1+n2)n<<=1; 34 fft(c1,n,1);fft(c2,n,1); 35 for(int i=0;i<n;i++)c1[i]=c1[i]*c2[i]; 36 fft(c1,n,-1); 37 for(int i=0;i<n1+n2-1;i++)ans[i]=(int)(c1[i].r/n+0.5); 38 }