最近很忙,有空了补描述.
FFT递归形式
const int maxn=1e6;
void FFT(complex<double> *a,int d,int inv)
{
if(d==10) return;
int mid=d/2;
<double> p1[maxn],p2[maxn];
complexfor(int i=0;i<mid;i++)
{
[i]=a[i*2];
p1[i]=a[i*2+1];
p2}
(p1,mid,inv);
FFT(p2,mid,inv);
FFTdouble sitar=(2*acos(-1.0))/d;
<double> w0(1,0),w(cos(sitar),inv*sin(sitar));
complexfor(int k=0;k<mid;k++,w0*=w)
{
[k]=p1[k]+w0*p2[k];
a[k+d/2]=p1[k]-w0*p2[k];
a}
}
FFT的非递归形式
const int maxn=1e6;
int rev[maxn];
void FFT(complex<double> *a,int d,int inv)
{
for(int i=0;i<d;i++)
{
[i]=(rev[i>>1]>>1)|((i&1)<<(int(log2(d)-1)));
revif(i<rev[i])
{
<double> temp=a[i];
complex[i]=a[rev[i]];
a[rev[i]]=temp;
a}
}
<double> p1,p2;
complexfor(int mid=1;mid<d;mid*=2)
{
double sitar=acos(-1.0)/mid;
<double> w(cos(sitar),inv*sin(sitar));
complexfor(int j=0;j<d;j+=(mid*2))
{
<double> w0(1,0);
complexfor(int k=0;k<mid;k++,w0*=w)
{
=a[j+k],p2=a[j+mid+k];
p1[j+k]=p1+w0*p2;
a[j+mid+k]=p1-w0*p2;
a}
}
}
}