本文主要是介绍快速数论变换NTT学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
什么是NTT?
数论变换(number-theoretic transform, NTT)是离散傅里叶变换(DFT)在数论基础上的实现。
NTT是一种计算卷积的快速算法,FFT也是其中一种。
但是FFT具有一些实现上的缺点,举例来说,向量必须乘上复数系数的矩阵进行处理,而且每个复数系数的实部和虚部是一个正弦及余弦函数,因此大部分的系数都是浮点数,也就是说,必须做浮点复数运算,计算量会比较大,并且浮点数运算产生的误差会比较大。
NTT解决的是多项式乘法带模数的情况,受到模数的限制,数也比较大。
在数学中,NTT 是关于任意环上的DFT。在有限域的情况下,通常称为数论变换,即NTT。
原根
FFT的实现是找单位圆上的 n n n个点 ω n 0 , ω n 1 , … , ω n n \omega_n^0, \omega_n^1, \dots, \omega_n^n ωn0,ωn1,…,ωnn(称为单位根) ,然后对这些点进行FFT。因此,对于NTT,我们需要在取模域上找到和这个点等价的数。为了找到这 n n n个等价的数,我们要使用原根。
令 n n n为大于1的2的幂, p p p为质数且 n ∣ ( p − 1 ) n|(p-1) n∣(p−1),即 n n n整除 p − 1 p-1 p−1 ,则存在本原 n n n次方根。对于质数 p = q n + 1 p=qn+1 p=qn+1,(模 p p p意义下的)原根 g g g满足: g q n = 1 ( m o d p ) g^{qn}=1 (\mod p) gqn=1(modp),将 g n = g q ( m o d p ) = g p − 1 n ( m o d p ) g_n=g^q (\mod p)=g^{{p-1}\over n} (\mod p) gn=gq(modp)=gnp−1(modp)看作 ω n \omega_n ωn的等价。
于是原根 g n g_n gn和单位根 ω n \omega_n ωn满足相似的性质!
原根和单位根的等价性
g n = g p − 1 n g_n=g^{{p-1}\over n} gn=gnp−1
于是,
g n n = g n ⋅ p − 1 n = g p − 1 g_n^n=g^{n \cdot {p-1\over n}}=g^{p-1} gnn=gn⋅np−1=gp−1
g n n 2 = g p − 1 2 g_n^{n\over 2}=g^{p-1\over 2} gn2n=g2p−1
g a n a k = g a k ( p − 1 ) a n = g k ( p − 1 ) n = g n k 【对应单位根消去引理】 g_{an}^{ak}=g^{\frac{ak(p-1)}{an}}=g^{\frac{k(p-1)}{n}}=g_n^k【对应单位根消去引理】 ganak=ganak(p−1)=gnk(p−1)=gnk【对应单位根消去引理】
可以得到:
g n n ≡ 1 ( m o d p ) 【对应单位根 ω n n ≡ 1 】 g_n^n \equiv 1 (\mod p) 【对应单位根\omega_n^n\equiv 1】 gnn≡1(modp)【对应单位根ωnn≡1】
g n n 2 ≡ − 1 ( m o d p ) 【对应单位根 ω n n 2 ≡ − 1 】 g_n^{n\over 2} \equiv -1 (\mod p)【对应单位根\omega_n^{n\over 2}\equiv -1】 gn2n≡−1(modp)【对应单位根ωn2n≡−1】
g n k + n 2 = g n k ⋅ g n n 2 = − g n k ( m o d p ) 【对应单位根折半引理】 g_n^{k+{n\over 2}}=g_n^{k}\cdot g_n^{n\over 2}=-g_n^{k} (\mod p)【对应单位根折半引理】 gnk+2n=gnk⋅gn2n=−gnk(modp)【对应单位根折半引理】
( g n k + n 2 ) 2 = g n 2 k + n = g n 2 k ⋅ g n n = g n 2 k ( m o d p ) (g_n^{k+{n\over 2}})^2=g_n^{2k+n}=g_n^{2k}\cdot g_n^n=g_n^{2k} (\mod p) (gnk+2n)2=gn2k+n=gn2k⋅gnn=gn2k(modp)
我们发现单位根具有的性质原根都有,所以我们将 g n k g_n^k gnk和 g n k + n 2 g_n^{k+{n\over 2}} gnk+2n代入,本质上和将 ω n k \omega_n^k ωnk和 ω n k + n 2 \omega_n^{k+{n\over 2}} ωnk+2n代入并无二异!
在INTT中,乘单位根的共轭复数的操作也就会相应地变为乘原根在模意义下的逆元。
常见的模数和原根如下:
p = 1004535809 = 479 × 2 21 + 1 , g = 3 p = 998244353 = 7 × 17 × 2 23 + 1 , g = 3 p=1004535809=479\times 2^{21}+1, g=3 \\ p = 998244353=7\times 17\times2^{23}+1, g=3 p=1004535809=479×221+1,g=3p=998244353=7×17×223+1,g=3
快速数论变换(FNTT)
简而言之,FNTT是NTT增加分治操作之后的快速算法,也是FFT在数论基础上的实现。FNTT使用的分治办法,与FFT使用的分治办法完全一致。
DFT、FFT、NTT、FNTT的关系
- 在 DFT与NTT的基础上,增加分治操作,得到FFT与FNTT。分治操作同FFT一致。
- 在DFT与FFT的基础上,将复数加法与复数乘法替换为模 p p p意义下的加法和乘法,一般大小限制在0到 p − 1 p-1 p−1之间;将本原单位根改为模 p p p意义下的相同阶数的本原单位根,阶数为2的幂,即可得到NTT与FNTT。
一大堆参考资料
- 快速数论变换(NTT)超详解
- OI Wiki 快速数论变换
- 快速数论变换NTT
- 快速傅立叶变换FFT学习笔记
这篇关于快速数论变换NTT学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!