FFT 学习笔记
——快速求两个多项式的乘积
多项式的点表示法
多项式的性质:用任意
证明:方程组为一个
当我们需要多项式
复数单位根
将复数域上的单位圆等分成
离散傅立叶正变换
将多项式的奇偶次数分类,变化
离散傅立叶逆变换
推导如下:即
然后我们使用
这里我们注意到,比较正逆变化的式子只有
struct comp{
double r,i;
comp(double _r=0,double _i=0){r=_r;i=_i;}
comp operator+ (const comp x){return comp(r+x.r,i+x.i);}
comp operator- (const comp x){return comp(r-x.r,i-x.i);}
comp operator* (const comp x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
}a[N],b[N];
const double pi=acos(-1.0);
void FFT(comp a[],int n,int t){
for(int i=1,j=0;i<n-1;i++){
for(int s=n;j^=s>>=1,~j&s;);
if(i<j)swap(a[i],a[j]);
}
for(int d=0;(1<<d)<n;d++){
int m=1<<d,m2=m<<1;
double o=pi/m*t;
comp _w(cos(o),sin(o));
for(int i=0;i<n;i+=m2){
comp w(1,0);
for(int j=0;j<m;j++){
comp &A=a[i+j+m],&B=a[i+j],t=w*A;
A=B-t;B=B+t;w=w*_w;
}
}
}
if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
}
int bit=0;
while((1<<bit)<n+m+1)bit++;
bit=(1<<bit);
for(int i=0;i<=n+m;i++){
cout<<(int)(a[i].r+0.5)<<' ';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】