[NTT] 快速数论变换学习笔记

我们学过了FFT(没学过看这里),发现很滋磁。但是FFT涉及小数,有可能有精度问题,所以这就很闹心了……发现精度问题出现在DFT和IDFT中求 sin ⁡ \sin sin cos ⁡ \cos cos导致精度问题和IDFT中乘以 1 n \frac{1}{n} n1的精度问题,所以我们考虑能否在整数范围内实现FFT的过程。
那么整数范围内的问题需要数论解决,这就导致了NTT(也叫FNT)的诞生。
可以说,精度问题主要由 n n n次单位根引起。回顾FFT,我们用了 n n n次单位根,也就是 ω n k \omega_n^k ωnk的哪些性质?
好像也就是三个引理吧……
列出来所用的性质们:(一些条件有省略,具体请详见FFT学习笔记)
1、 ω n n = e 2 k π i = 1 \omega_n^n=e^{2k\pi i}=1 ωnn=e2kπi=1
2、 ∀ i , j ∈ [ 0 , n − 1 ] \forall i,j\in [0,n-1] i,j[0,n1] i , j ∈ Z , i ≠ j i,j\in \mathbb{Z},i\not =j i,jZ,i=j ω n i ≠ ω n j \omega_n^i\not =\omega_n^j ωni=ωnj
3、(折半引理) ( ω n k ) 2 = ω n 2 k (\omega_n^k)^2=\omega_{\frac{n}{2}}^k (ωnk)2=ω2nk ω n k + n 2 = − ω n k \omega_n^{k+\frac{n}{2}}=-\omega_n^k ωnk+2n=ωnk
4、(求和引理) ∑ j = 0 n − 1 ( ω n k ) j = 0    ( k ≠ 0 ) \sum\limits_{j=0}^{n-1}(\omega_n^k)^j=0\ \ (k\not =0) j=0n1(ωnk)j=0  (k=0)
所以,我们需要在整数范围内找到一个符合这四条性质的一种数。于是我们找到了一种特殊的数——原根。
网上并没有统一的原根的定义,维基百科看不懂(我太弱了……),介绍一下性质。
1、对于一个质数 P P P,如果存在原根 g g g,则 g i ≠ g j    (   m o d   P   ) g^i\not =g^j\ \ (\bmod P\ ) gi=gj  (modP )。其中 i ≠ j i\not =j i=j
别问我怎么证,有的讲稿是用它定义原根的……
有些证明用到了反证法(但是我觉得有点问题……)
了解就行。
于是这就符合了第二条。
然后,我们用 g φ ( P ) n g^{\frac{\varphi (P)}{n}} gnφ(P)代替 n n n次单位根进行计算,由 φ ( P ) = P − 1 \varphi (P)=P-1 φ(P)=P1,要求 φ ( P ) n \frac{\varphi (P)}{n} nφ(P)为整数, n n n还是 2 2 2的整数次幂,所以要求 P = k ∗ 2 q + 1 P=k*2^q+1 P=k2q+1,其中 2 q ≥ n 2^q\ge n 2qn
然后大力推式子,会发现所有的性质都符合……
如果模数任意呢?
如果要模数是 P P P,那么多项式的所有系数和不会超过 n ( P − 1 ) 2 n(P-1)^2 n(P1)2。所以找出一组 p p p,使得 p i = k i ∗ 2 q i + 1 p_i=k_i*2^{q_i}+1 pi=ki2qi+1,且:
∏ i = 0 k − 1 p i > n ( P − 1 ) 2 \prod_{i=0}^{k-1}p_i>n(P-1)^2 i=0k1pi>n(P1)2
然后按每个 p p p做NTT,然后CRT合并……
又双叒叕CRT合并……
本身NTT常数就比较大,和FFT差不多吧……(中间有快速幂)。
Po姐:“此外,一个答案模一个数的计数问题必须用NTT。”
板子以后补,接着挖坑……
这里是一些常用质数的原根。

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页