FTT算法程序
时间: 2023-07-26 15:07:34 浏览: 195
FTT算法,全称为快速傅里叶变换(Fast Fourier Transform),是一种快速计算傅里叶变换的算法。以下是C++实现的FTT算法程序:
```c++
#include<bits/stdc++.h>
using namespace std;
const double PI=acos(-1.0);
const int MAXN=1<<18;
struct Complex{
double real,imag;
Complex operator + (const Complex &t) const{
return Complex{real+t.real,imag+t.imag};
}
Complex operator - (const Complex &t) const{
return Complex{real-t.real,imag-t.imag};
}
Complex operator * (const Complex &t) const{
return Complex{real*t.real-imag*t.imag,real*t.imag+imag*t.real};
}
Complex operator / (const double &t) const{
return Complex{real/t,imag/t};
}
}a[MAXN],b[MAXN];
int n,m,limit,r[MAXN];
void FFT(Complex *a,int f){
for(int i=0;i<limit;i++)
if(i<r[i]) swap(a[i],a[r[i]]);
for(int mid=1;mid<limit;mid<<=1){
Complex Wn(cos(PI/mid),sin(PI/mid)*f);
for(int j=0;j<limit;j+=mid<<1){
Complex w(1,0);
for(int k=0;k<mid;k++,w=w*Wn){
Complex x=a[j+k],y=w*a[j+k+mid];
a[j+k]=x+y,a[j+k+mid]=x-y;
}
}
}
if(f==-1) for(int i=0;i<limit;i++) a[i]=a[i]/limit;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++) scanf("%lf",&a[i].real);
for(int i=0;i<=m;i++) scanf("%lf",&b[i].real);
for(limit=1;limit<n+m+1;limit<<=1);
for(int i=0;i<limit;i++)
r[i]=(r[i>>1]>>1)|((i&1)?(limit>>1):0);
FFT(a,1),FFT(b,1);
for(int i=0;i<=limit;i++) a[i]=a[i]*b[i];
FFT(a,-1);
for(int i=0;i<=n+m;i++)
printf("%d ",(int)(a[i].real+0.5));
return 0;
}
```
其中,结构体 `Complex` 表示复数,包含实部和虚部。`FFT` 函数实现了快速傅里叶变换,其中 `f` 表示进行正变换还是逆变换,正变换时 `f=1`,逆变换时 `f=-1`。主函数中输入了两个多项式 `a` 和 `b`,并对它们进行了乘法运算,最后输出结果。
阅读全文