[模板] 快速傅里叶变换/fft

Posted ubospica

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板] 快速傅里叶变换/fft相关的知识,希望对你有一定的参考价值。

Code

const int nmax=(int)3e6+50;
const db pi=acos(-1.0);

struct tcpx{db a,b;}c1[nmax],c2[nmax];
tcpx operator+(tcpx a,tcpx b){return (tcpx){a.a+b.a,a.b+b.b};}
tcpx operator-(tcpx a,tcpx b){return (tcpx){a.a-b.a,a.b-b.b};}
tcpx operator*(tcpx a,tcpx b){return (tcpx){a.a*b.a-a.b*b.b,a.a*b.b+a.b*b.a};}

int n,m;
int l,rev[nmax];
void dft(tcpx *c,int n,int fl){
    rep(i,0,n-1)if(i<rev[i])swap(c[i],c[rev[i]]);
    for(int i=1;i<n;i<<=1){
        tcpx wn=(tcpx){cos(pi/i),fl*sin(pi/i)};
        for(int j=0,p=(i<<1);j<n;j+=p){
            tcpx w=(tcpx){1,0};
            for(int k=0;k<i;++k,w=w*wn){
                tcpx x=c[j+k],y=w*c[j+k+i];
                c[j+k]=x+y,c[j+k+i]=x-y;
            }
        }
    }
}
void fft(tcpx *c1,int n,tcpx *c2,int m,tcpx *c3){//c3=c1*c2
    m+=n;
    for(n=1;n<=m;n<<=1)++l;
    rep(i,0,n-1)rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
    dft(c1,n,1),dft(c2,n,1);
    rep(i,0,n-1)c3[i]=c1[i]*c2[i];
    dft(c3,n,-1);
    rep(i,0,n-1)c3[i].a=(int)(c3[i].a/n+0.5);
}

以上是关于[模板] 快速傅里叶变换/fft的主要内容,如果未能解决你的问题,请参考以下文章

[模板]快速傅里叶变换 FFT

模板FFT快速傅里叶变换

快速傅里叶变换(FFT)模板

[模板] 快速傅里叶变换/fft

快速傅里叶变换FFT——kuangbin模板

快速傅里叶变换FFT