一、 NTT的局限
对于模数符合下列条件的多项式乘法,我们可以用NTT。
- 模数为P=r∗2k+1P=r*2^k+1P=r∗2k+1, 其中kkk足够大,满足2k>=N2^k>=N2k>=N,NNN为多项式扩充后的项数。因为多项式乘法都需要将项数扩充到222的幂。
而如果不满足这个条件,则我们无法使用NTTNTTNTT直接做了。
而要使用FFTFFTFFT解决带模的多项式乘法,则要保证在不考虑模数的情况下,多项式乘积的系数不能超过doubledoubledouble能表示的精度。一般doubledoubledouble的精度在101610^{16}1016,所以如果系数超过101610^{16}1016以后,则用double不能精确表示了。
二、 任意模数的多项式乘法
模数为任意整数时的多项式乘法该如何解决呢?
1. 三模数NTT
有两种解决思路,第一种是三模数NTTNTTNTT。即找三个模数,这三个模数都需满足上述NTTNTTNTT的条件。分别求出在三个模数下的多项式乘法的结果,然后再利用中国剩余定理,求出在给定模数下的结果。
设给定的模数为modmodmod, 自己找的三个模数为mod1,mod2,mod3mod1,mod2,mod3mod1,mod2,mod3,这三个模数除了要满足上述NTTNTTNTT的条件外,还需要满足:
mod1×mod2×mod3mod1\times mod2 \times mod3mod1×mod2×mod3大于结果多项式中的所有系数,其中两个modmodmod的乘积要在long long 范围以内。
对多项式结果的系数ccc:有:
{ c≡c1(modmod1)c≡c2(modmod2)c≡c3(modmod3)\begin{aligned} \begin{cases} c \equiv c_1 \pmod {mod1} \\ c \equiv c_2 \pmod {mod2} \\ c \equiv c_3 \pmod{mod3} \end{cases} \end{aligned}⎩ ⎨ ⎧c≡c1(modmod1)c≡c2(modmod2)c≡c3(modmod3)
根据扩展中国剩余定理,由前两个方程可知:
c1+mod1×k1=c2+mod2×k2c1+mod_1 \times k_1 = c2+ mod_2 \times k_2c1+mod1×k1=c2+mod2×k2
k1×mod1≡(c2−c1)(modmod2)k_1 \times mod_1 \equiv (c2-c1) \pmod{mod_2}k1×mod1≡(c2−c1)(modmod2)
k1=(c2−c1)×mod1−1(modmod2)k_1 = (c_2-c_1) \times mod_1^{-1} \pmod{mod_2}k1=(c2−c1)×mod1−1(modmod2)
求出了k1k_1k1以后,就可以求出来前两个方程下的ccc的值:
c≡(c2−c1)×mod1−1×mod1+c1(modmod1×mod2)(2)c \equiv (c_2-c_1) \times mod_1^{-1} \times mod_1+c_1 \pmod{mod_1 \times mod_2} \tag {2} c≡(c2−c1)×mod1−1×mod1+c1(modmod1×mod2)(2)
观察上式,发现有mod1−1×mod1mod_1^{-1} \times mod_1mod1−1×mod1,这不就是111吗?
那222式不变成了c≡c2c \equiv c2c≡c2了吗?
不是的,这里要注意,上面的式子中mod1−1mod_1^{-1}mod1−1是指在模mod2mod_2mod2意义下mod1mod_1mod1的逆元,而在模mod1×mod2mod_1 \times mod_2mod1×mod2意义下, mod1−1×mod1mod_1^{-1} \times mod_1mod1−1×mod1就不是逆元了,其不一定为111.
举个例子:mod1mod_1mod1为555, mod2mod_2mod2为777, 在mod2mod_2mod2意义下,mod1−1mod_1^{-1}mod1−1为333, 在mod1×mod2mod_1\times mod_2mod1×mod2意义下,5×35 \times 35×3并不等于111.
然后将该式与方程组中的第三个方程联立起来,设m=(c2−c1)×mod1−1×mod1+c1m=(c_2-c_1) \times mod_1^{-1} \times mod_1+c_1m=(c2−c1)×mod1−1×mod1+c1,
可以得到:
c≡(c3−m)×(mod1×mod2)−1×(mod1×mod2)+m(modmod1×mod2×mod3)c \equiv (c_3-m) \times (mod_1 \times mod_2)^{-1} \times (mod_1 \times mod_2) + m \pmod{mod_1\times mod_2 \times mod_3}c≡(c3−m)×(mod1×mod2)−1×(mod1×mod2)+m(modmod1×mod2<

1154

被折叠的 条评论
为什么被折叠?



