zoukankan      html  css  js  c++  java
  • 快速傅里叶变换(FFT)模板

    //有多少项N取多至少8~10倍 
    #include <algorithm>
    #include <cmath>
    #include <complex>
    #include <cstdlib>
    using namespace std;
    typedef complex<double> cn;
    const int N=1e7+1;
    const double Pi=3.1415926535;//Pi通常取10位即可(随意) 
    cn a[N],b[N];
    int r[N];
    int mxb,bit;
    int n,m;
    //二进制翻转 
    void Get_Rev(int bit) {
        for (int i=0;i<(1<<bit);i++)
        r[i]=(r[i>>1]>>1)|((i&1)<<(bit-1));
    }
    //傅里叶变换 
    void DFT(cn *a,int mx,int inot) {//inot为1就是DFT,为-1就是IDFT 
        for (int i=0;i<mx;i++)
        if (i<r[i]) swap(a[i],a[r[i]]);
        for (int mlen=1;mlen<mx;mlen<<=1) {
            cn wn=exp(cn(0,inot*Pi/mlen));
            for (int len=mlen<<1,l=0;l<mx;l+=len) {
                cn wnk=cn(1,0);
                for (int k=l;k<l+mlen;k++,wnk*=wn) {
                    cn x=a[k],y=wnk*a[k+mlen];
                    a[k]=x+y;a[k+mlen]=x-y;//蝴蝶操作 
                }
            }
        }
        if (inot==-1)//IDFT的除n操作 
        for (int i=0;i<mx;i++) a[i]/=mx;
    }
    
    void FFT() {
        mxb=1;
        while (mxb<=n+m) mxb<<=1,bit++;
        Get_Rev(bit);
        DFT(a,mxb,1);DFT(b,mxb,1);
        for (int i=0;i<=mxb;i++) a[i]*=b[i];
        DFT(a,mxb,-1);
    }
    View Code
    在日渐沉没的世界里,我发现了你。
  • 相关阅读:
    个人学期总结
    管理信息系统 第三部分 作业
    模型分离(选做)
    密码保护
    实现搜索功能
    完成个人中心—导航标签
    个人中心标签页导航
    评论列表显示及排序,个人中心显示
    完成评论功能
    ASP.NET Core开发者指南
  • 原文地址:https://www.cnblogs.com/mastervan/p/9425608.html
Copyright © 2011-2022 走看看