【快速傅里叶变换】

〖相关资料

《虚数的图解》        《虚数的意义》        《FFT学习笔记》

《从多项式乘法到快速傅里叶变换》        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 }
View Code

相关文章: