NTT

1 问题描述
FFT问题解决的是复数域上的卷积。如果现在的问题是这样:给出两个整数数列$Ai,Bj,0\leq i\leq n-1,0\leq j\leq m-1$,以及素数$P$,计算新数列$Ci=(\sum_{k}A_{i-k}B_{k})\%P$。不在$A,B$定义域内的值均为0.NTT就是解决这样在模意义下的卷积问题。

2 预备知识
原根的概念:对于两个正整数$a,m$,如果$Gcd(a,m)=1$,那么存在$d\leq m-1$(比如$\varphi (m)$)使得$a^{d}\%m=1$。如果对于某个g使得在$[1,m-1]$内只有$\varphi (m)$满足$g^{\varphi (m)}\%m=1$,那么g被称作m的原根。比如7的原根是3,因为在1,2,3,4,5,6中只有3^6%7=1。

3 算法描述
NTT的原理与FFT的原理完全相同。即首先我们会将$A,B$通过NTT变换转化成新数列$A^{'},B^{'}$,然后我们有$C_{k}^{'}=A_{k}^{'}B_{k}^{'}$。最后通过NTT逆变换,将$C^{'}$转化成$C$.

FFT变换是这样的:$A_{k}^{'}=\sum_{j=0}^{n-1}A_{j}e^{\frac{2\pi i}{n}kj}=\sum_{j=0}^{n-1}A_{j}w_{n}^{kj}$。

FFT逆变换是这样的:$A_{k}=\frac{1}{n}\sum_{j=0}^{n-1}A_{j}^{'}e^{-\frac{2\pi i}{n}kj}=\frac{1}{n}\sum_{j=0}^{n-1}A_{j}^{'}w_{n}^{-kj}$

$e^{\frac{2\pi i}{n}}$在这里之所以能够使用,是因为它在乘法意义下构成一个群。同理,在模P的系统中,对于乘法来说,$g^{\frac{P-1}{n}}$也构成一个群,类似$(e^{\frac{2\pi i}{n}})^{n}=1$,$(g^{\frac{P-1}{n}})^{n}%P=1$。其中g是P的原根。

因此,NTT变换是: $A_{k}^{'}=\sum_{j=0}^{n-1}A_{j}g^{\frac{P-1}{n}kj}$

NTT逆变换: $A_{k}=\frac{1}{n}\sum_{j=0}^{n-1}A_{j}^{'}g^{-\frac{P-1}{n}kj}=\frac{1}{n}\sum_{j=0}^{n-1}A_{j}^{'}g^{((P-1)-\frac{P-1}{n})kj}$

所以,NTT变换使用的基为$g^{\frac{P-1}{n}}$,NTT逆变换使用的基为$g^{(P-1)-\frac{P-1}{n}}$

这里有一些需要注意的问题。在实际计算时,我们会将整个数列的长度扩展至$2^{K}$次幂,因此在每一次分治时,每个子问题的长度n也都是2的某次幂。而这里,必须要保证n能够整除$P-1$,所以若$P=c*2^t+1$,其中$c$为奇数。那么一定要满足$t\geq K$


转载于:https://www.cnblogs.com/jianglangcaijin/p/6000204.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值