快速傅里叶变换

来源:互联网 发布:手机放大字体软件 编辑:程序博客网 时间:2024/05/18 15:30

Fast Fourier Transform
FFT在信号处理中有重要的应用,在算法中的主要应用是加速多项式运算——eg.多项式乘法,多项式取模,多项式求逆元…。由于不会LATEX公式,具体讲解请看澈哥博客(也可以看算导),我就只粘个代码好了。。。

//迭代版#include <cstdio>#include <cmath>#include <complex>using namespace std;typedef complex<double> C;const int MAXN=262145;const double PI=acos(-1);int pos[MAXN],bit,n,m;C a[MAXN],b[MAXN];void FFT(C A[],short type){    for(int i=1;i<n;++i){        if(i<pos[i])            swap(A[i],A[pos[i]]);    }    for(int i=1;i<n;i<<=1){        C wn(cos(PI/i),type*sin(PI/i));        for(int j=0,tmp=i<<1;j<n;j+=tmp){            C w(1,0);            for(int k=0;k<i;++k,w*=wn){                C x=A[j+k],y=w*A[i+j+k];                 A[j+k]=x+y,A[i+j+k]=x-y;            }        }    }}int main(){    scanf("%d%d",&n,&m);    for(int i=0,x;i<=n;++i)        scanf("%d",&x),a[i]=x;    for(int i=0,x;i<=m;++i)        scanf("%d",&x),b[i]=x;    m+=n;    for(n=1;n<m;n<<=1) ++bit;    for(int i=1;i<n;++i)        pos[i]=(pos[i>>1]>>1)|((i&1)<<(bit-1));    FFT(a,1),FFT(b,1);    for(int i=0;i<=n;++i)        a[i]*=b[i];    FFT(a,-1);    for(int i=0;i<=m;++i)        printf("%d ",int(a[i].real()/n+0.5));    return 0;}
0 0