快速数论变换总结
前置
根据快速傅里叶变换,可以在
于是考虑快速傅里叶变换在数论上的实现,避免了精度误差,支持了取模运算。
引入概念原根:
阶
定义
由欧拉定理可知,对
因此满足同余式
性质
若
原根
定义
设
即
性质
指数性
周期性
对称性
由阶的性质与:
可得:
折半性
可以观察到原根与复数在这里是完全等价的,故只需将快速傅里叶变换的复数部分替换为原根即可。
NTT & INTT
void NTT(ll f[],int n,int op)
{
if(n==1) return;
ll f1[n/2],f2[n/2];
for(int i=0;i<n/2;++i)
{
f1[i]=f[i<<1],f2[i]=f[i<<1|1];
}
NTT(f1,n>>1,op),NTT(f2,n>>1,op);
ll gk=1,g1=qpow(op==1?g:gi,(p-1)/n);
for(int i=0;i<n/2;++i)
{
f[i]=(f1[i]+gk*f2[i]%p)%p;
f[i+n/2]=(p+f1[i]-gk*f2[i]%p)%p;
gk=gk*g1%p;
}
}
本文作者:vanueber
本文链接:https://www.cnblogs.com/vanueber/p/18678787
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步