FFT快速傅里叶变换
FFT快速傅里叶变换
some 多项式变换
DFT:离散傅里叶变换
计算多项式乘法
FFT:快速傅里叶变换计算多项式乘法
FNTT/NTT:快速傅里叶变换的优化版优化常数及误差
FWT:快速沃尔什变换利用类似FFT的东西解决一类卷积问题
MTT:毛爷爷的FFT非常nb/任意模数
FMT 快速莫比乌斯变化
快速傅里叶变换
快速傅里叶变换(
就
对于一个
按照次数的奇偶来分成两组,然后右边提出来一个
分别用奇偶次次项数建立新的函数:
那么原来的
利用偶数次单位根的性质:
我们知道在复平面上
得到:
和:
因此我们求出了
于是对
考虑到分治
所以要在第一次
位逆序置换
原序列的每个数用二进制表示,然后把二进制翻转对称一下,就是最终位置的下标。
可以在
蝶形运算优化
已知
使用位逆序置换后,对于给定的
因此可以直接在数组下标为
再详细说明一下如何借助蝶形运算完成所有段长度为
令段长度为
同时枚举序列
合并两个段时,枚举
使用蝶形运算求出
快速傅里叶逆变换
设
对
记
当
当
也就是说
那么代回原式
也就是说给定点
综上所述,我们取单位根为其倒数,对
递归写法
il void FFT(qwq *q,int lim,int k){
if(lim==1) return;
for(ri int i=0;i<lim;++i) o[i]=q[i];
ri int m=lim>>1;
for(ri int i=0;i<lim;i++){
if(i&1) q[m+(i>>1)]=o[i];
else q[i>>1]=o[i];
}
FFT(q,m,k),FFT(q+m,m,k);
wn={cos(Pi*2/lim),k*sin(Pi*2/lim)},w={1,0};
for(ri int i=0;i<m;++i,w=w*wn){
x=q[i],y=w*q[i+m];
q[i]=x+y,q[i+m]=x-y;
}
return;
}
code
#include<bits/stdc++.h>
#define il inline
#define cs const
#define ri register
using namespace std;
namespace Q{
il int rd(){
ri int x=0;ri bool f=0;ri char c=getchar();
while(!isdigit(c)) f|=(c==45),c=getchar();
while(isdigit(c)) x=x*10+(c^48),c=getchar();
return f?-x:x;
}
il void wt(int x){
if(x<0) x=-x,putchar(45);
if(x>=10) wt(x/10);
return putchar(x%10|48),void();
}
} using namespace Q;
cs double Pi=3.141592653589793;
cs int N=2097152;
namespace FastFastTle{
struct qwq{
double r,i;
qwq operator +(cs qwq o)cs{
return (qwq){r+o.r,i+o.i};
}
qwq operator -(cs qwq o)cs{
return (qwq){r-o.r,i-o.i};
}
qwq operator *(cs qwq o)cs{
return (qwq){r*o.r-i*o.i,o.r*i+r*o.i};
}
}wn,w,f[N],g[N],o[N],x,y;
il void FFT(qwq *q,int lim,int k){
if(lim==1) return;
for(ri int i=0;i<lim;++i) o[i]=q[i];
ri int m=lim>>1;
for(ri int i=0;i<lim;i++){
if(i&1) q[m+(i>>1)]=o[i];
else q[i>>1]=o[i];
}
FFT(q,m,k),FFT(q+m,m,k);
wn={cos(Pi*2/lim),k*sin(Pi*2/lim)},w={1,0};
for(ri int i=0;i<m;++i,w=w*wn){
x=q[i],y=w*q[i+m];
q[i]=x+y,q[i+m]=x-y;
}
return;
}
} using namespace FastFastTle;
signed main(){
int n=rd(),m=rd(),lim=1;
while(lim<=n+m) lim<<=1;
for(ri int i=0;i<=n;++i) f[i].r=rd();
for(ri int i=0;i<=m;++i) g[i].r=rd();
FFT(f,lim,1),FFT(g,lim,1);
for(ri int i=0;i<lim;++i) f[i]=f[i]*g[i];
FFT(f,lim,-1);
for(ri int i=0,s;i<=n+m;++i){
wt(f[i].r/lim+0.5),putchar(32);
}
return 0;
}
迭代实现
il void FFT(qwq q[],int lim,int k){
for(ri int i=0;i<lim;++i){
if(i<r[i]) swap(q[i],q[r[i]]);
}
for(ri int mid=1;mid<lim;mid<<=1){
wn={cos(Pi/mid),k*sin(Pi/mid)};
for(ri int R=mid<<1,j=0;j<lim;j+=R){
w={1,0};
for(ri int t=0;t<mid;++t,w=w*wn){
x=q[j+t],y=w*q[j+mid+t];
q[j+t]=x+y,q[j+mid+t]=x-y;
}
}
}
return;
}
code
#include<bits/stdc++.h>
#define il inline
#define cs const
#define ri register
using namespace std;
namespace Q{
il int rd(){
ri int x=0;ri bool f=0;ri char c=getchar();
while(!isdigit(c)) f|=(c==45),c=getchar();
while(isdigit(c)) x=x*10+(c^48),c=getchar();
return f?-x:x;
}
il void wt(int x){
if(x<0) x=-x,putchar(45);
if(x>=10) wt(x/10);
return putchar(x%10|48),void();
}
} using namespace Q;
cs double Pi=3.141592653589793;
cs int N=2097152;
namespace FastFastTle{
struct qwq{
double r,i;
qwq operator +(cs qwq o)cs{
return (qwq){r+o.r,i+o.i};
}
qwq operator -(cs qwq o)cs{
return (qwq){r-o.r,i-o.i};
}
qwq operator *(cs qwq o)cs{
return (qwq){r*o.r-i*o.i,o.r*i+r*o.i};
}
}wn,w,f[N],g[N],x,y;
int l,r[N];
il void FFT(qwq q[],int lim,int k){
for(ri int i=0;i<lim;++i){
if(i<r[i]) swap(q[i],q[r[i]]);
}
for(ri int mid=1;mid<lim;mid<<=1){
wn={cos(Pi/mid),k*sin(Pi/mid)};
for(ri int R=mid<<1,j=0;j<lim;j+=R){
w={1,0};
for(ri int t=0;t<mid;++t,w=w*wn){
x=q[j+t],y=w*q[j+mid+t];
q[j+t]=x+y,q[j+mid+t]=x-y;
}
}
}
return;
}
} using namespace FastFastTle;
signed main(){
int n=rd(),m=rd(),lim=1;
while(lim<=n+m) lim<<=1,l++;
for(ri int i=0;i<=n;++i) f[i].r=rd();
for(ri int i=0;i<=m;++i) g[i].r=rd();
for(ri int i=0;i<lim;++i){
r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
}
FFT(f,lim,1),FFT(g,lim,1);
for(ri int i=0;i<lim;++i) f[i]=f[i]*g[i];
FFT(f,lim,-1);
for(ri int i=0,s;i<=n+m;++i){
wt(f[i].r/lim+0.5),putchar(32);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】