任意模数多项式乘法-多模数快速数论变换
本文作者为 JustinRochester。
任意模数多项式乘法-多模数快速数论变换
中国剩余定理
考虑一组同余式
\(\begin{cases}
\begin{aligned}
x&\equiv& a_1&\pmod {m_1}\\
x&\equiv& a_2&\pmod {m_2}\\
\vdots\\
x&\equiv& a_n&\pmod {m_n}\\
\end{aligned}
\end{cases}\) 其中,\(\forall i\neq j\to \gcd(m_i, m_j)=1\) 。
中国剩余定理(Chinese Remainder Theorem,CRT)用于求最小满足条件自然数的 \(x\) 。
由于任意两个模数之间都互质,我们参考 拉格朗日插值 的思想,看看是否能够构造:
方便起见,我们记 \(\displaystyle M=\prod_{i=1}^n m_i, M_i={M\over m_i}\) 。
则根据 \(\gcd\) 的积性性质,有 \(\displaystyle \gcd(M_i, m_i)=\gcd(\prod_{j\neq i}m_j, m_i)=\prod_{j\neq i}\gcd(m_j, m_i)=\prod_{j\neq i}1=1\) 。
因此,我们可以通过快速幂+欧拉定理,或拓展欧几里得算法,求出 \(M_i\) 在模 \(m_i\) 意义下的逆元 \(I_i(I_i<m)\) 。
于是,我们得到了一个很有意思的系数 \(\displaystyle C_i=M_i\cdot I_i=I_i\cdot \prod_{j\neq i}m_j\) 。它有
\(\begin{cases}
\begin{aligned}
C_i&\equiv&I_i\cdot \prod_{j\neq i\wedge j\neq k}m_j\cdot m_k&\equiv&I_i\cdot \prod_{j\neq i\wedge j\neq k}m_j\cdot 0&\equiv &0&\pmod{m_k}&(k\neq i)\\
C_i&\equiv&I_i\cdot M_i&\equiv& M_i^{-1}\cdot M_i&\equiv&1&\pmod{m_k}&(k=i)\\
\end{aligned}
\end{cases}\)
于是,类似拉格朗日插值构造基多项式的思想,我们构造出了“基系数” \(C_i\) 。
所以,根据拉格朗日插值的同样思想,我们可以直接写出 \(\displaystyle x^*=\sum_{i=1}^n a_iC_i\) 。但这一定是最小的吗?
我们不妨假设 \(x=x^*+k\cdot \text{lcm}(m_1, m_2, \cdots, m_n)=x^*+k\cdot M\) ,则 \(x\equiv x^*+k\cdot M\equiv x^*\equiv a_i\pmod{m_i}\) 同样成立。
因此,实际上,所有的解为 \(x^*+k\cdot M, k\in Z\) ,故最小自然数解为 \(x^*\bmod M\) 。
多模数快速数论变换
参考上文,我们有了一个还原多项式数值的方法:
挑选多个多项式模数 \(P_1, P_2, \cdots, P_k\) ,分别进行 \(k\) 次多项式计算后,再通过 CRT 进行合并,即可还原出一个不超过 \(\displaystyle P=\prod_{i=1}^k P_i\) 的数值。
因此,根据前一篇的结论,我们只需要选择足够多的多项式模数(每个的 \(2\) 因子乘积均需要超过长度),分别进行多项式计算后,再进行还原。
当我们进行 \(m\) 个多项式乘积时,我们仅需要满足 \(P\geq M^m\cdot n^{m-1}\) 即可还原;
同理,当只进行 \(2\) 个多项式乘积时,我们仅需要满足 \(P\geq M^2\cdot n\) 即可还原。
一个比较好的取值是:\(P_1=998244353=119\times 2^{23}+1, P_2=1004535809=479\times 2^{21}+1, P_3=469762049=7\times 2^{26}+1\) ,这三个数的乘积为 \(471064322751194440790966273\approx 4.7\times 10^{26}\),且原根均为 \(3\)。
根据前一篇分析,两个多项式在模数为 int
的情况下,乘法的数值范围只会达到 \(4\times 10^{24}\),远小于该乘积的范围。
因此,用该数值可以很好的进行多项式的任意模数乘法了。