FFT | 3 | 数论变换NTT基础
什么是 $NTT$
就是把把 $FFT$ 中所有的单位根换成了整数的单位根,也就是原根的 $n$ 次幂
通常用于求模意义下的多项式卷积
为什么要用 $NTT$
- 保证精度
- 能用来解决模意义下的卷积问题
- 空间更小
但速度不一定更优
前置知识
阶
对于满足 $gcd(a,p)=1$ 的正整数对 $a,p$ ,若 $r$ 是使得 $a^r\equiv 1\pmod p$ 成立的最小整数,则称 $r$ 为 $a$ 模 $p$ 的阶
原根
若在正整数对 $a,p$ 中,$a$ 模 $p$ 的阶等于 $\phi§$ ,则称 $a$ 为 $p$ 的原根
原根有一个特殊的性质
若 $a$ 为 $p$ 的原根,则对于任意整数 $k;(1\le k<p)$ ,$\left(a^k\right)\mod p$ 的值两两不相同
$NTT$ 的单位根
现在设我们的原根为 $a$ ,模数为 $p$ ,那么我们现在的单位根就变成了 $\omega_n^k=a^{k(p-1)/n}$
我们来回顾一下 $FFT$ 中要求的单位根的性质
$$
(\omega_n^k)^t=w_n^{tk}\tag{1}
$$
易证
$$
\omega_n^k=\omega_{n/2}^{k/2}\tag{2}
$$
易证
$$
\omega_n^{j+k}=\omega_n^j\cdot\omega_n^k\tag{3}
$$
易证
$$
\omega_n^0=\omega_n^n=1+0i\\
\omega_n^{n/2}=-1+0i\tag{4}
$$
不易证,证不来
$$
w_n^{k+n/2}=-\omega_n^k\tag{5}
$$
证了上面一个就易证了,可惜我证不来
实现
貌似没什么好说的,把 $FFT$ 里面的单位根换了,再把除法用乘上逆元代替就好了
代码中用到了一个很常用的大质数和它的逆元:$998244353$ ,原根为 $3$ ,能够在保证很大的范围内不被模掉
1 |
|
任意模数的 $NTT$
使用多个大质数分别 $NTT$ 最后用 $CRT$ 合并即可,不过常数略大
一般取 $998244353,;1004535809,;469762049$ ,这三个数原根都为 $3$
例题
FFT | 3 | 数论变换NTT基础