快速数论变换(NTT)

update.2025.8.1

快速数论变换(NTT)

FFT的缺点

我们使用单位根需要用到三角函数来表示,而编程语言内置的三角函数精度都不理想

当使用卷积的场景是大整数系数时,FFT的精度错误就更加明显,产生的误差将会极其大

我们能不能改良一下FFT的这个缺点呢?

原根

我们发现精度问题主要在于单位根,这无法避免与实数域打交道,当我们想解决整数问题时就需要避免引用实数域上的概念

因此我们使用数论中的概念原根来代替单位根

接下来我们介绍原根

\( 设 a,b \in N^*, gcd(a,b) = 1,定义满足a^x \equiv1(mod\ b)的最小整数x叫做a模b的阶,记作ord_ba \)

\(设r,m\in N^*,gcd(a,b)=1,定义当ord_mr=\phi(x)时,将r叫做模x的原根,\phi(x)表示欧拉函数 \)

\( 对于模m意义下的原根g,我们可以证明\omega和g在取模意义下时等价的 \)

关于NTT的注意点

在我们实现FFT的过程中,为了便于实现分治,我们会将多项式项数补成2的幂次,设模数为m,由费马小定理得

\(m=2^xk+1\)
因此我们发现在进行NTT的时候对于模数是有限制的

\(常用模数:\)

\( m_1=998244353=119 *2^{23}+1,g=3\)
\( m_2=1004535809=479 *2^{21}+1,g=3\)

当题目要求的模数不是以上常用模数怎么办呢?
我们可以按照以上两种模数分别跑两遍NTT得到两种多项式
再根据这两种多项式的系数分别列方程
由于模数都是质数彼此互质
我们用中国剩余定理(CRT)解一下方程就可以还原到未取模的多项式
再对于该多项式系数取题目要求的模数即可

posted @ 2025-08-01 00:52  ZzhAllen  阅读(23)  评论(0)    收藏  举报