快速计算多项式相乘系数 FFT快速傅里叶变换
正常求两个多项式乘积
复杂度为
分别设n+1个在A与B上的点
根据高斯消元法,n+1个不同的点一定能确定一个唯一的n次多项式
横坐标相同的点相乘
那么就有两个问题:
1.怎么快速得到n+1个点
2.怎么将点值表达法变回系数
如果是一个偶函数,那么,因此带入一个值也就得到了两个点
同理如果是一个奇函数,那么有,也可以带一个点得到两个点
因此可以将分成奇函数部分与偶函数部分
然后如果将继续分解
但我们的是通过得来的,因此取相反数也无法让它们一一符号相反
那么我们取复数呢?
那么更大的呢?
我们令,我们可以得到它的性质正好可以解决该问题
![捕获]()
反过来呢?
将,然后给每个数都乘上即可
void init(int k)
{
int len=1<<k;
for(int i=0;i<len;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
}
void fft(cp *a,int n,int flag){
for(int i=0;i<n;i++)
{
if(i<rev[i])swap(a[i],a[rev[i]]);
}
for(int h=1;h<n;h*=2)
{
cp wn=exp(cp(0,flag*pie/h));
for(int j=0;j<n;j+=h*2)
{
cp w(1,0);
for(int k=j;k<j+h;k++)
{
cp x=a[k];
cp y=w*a[k+h];
a[k]=x+y;
a[k+h]=x-y;
w*=wn;
}
}
}
if(flag==-1)
for(int i=0;i<n;i++)
a[i]/=n;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效