快速傅里叶变换

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值