From 4567b605fd7701be7b49cd9253fabac2058f9917 Mon Sep 17 00:00:00 2001 From: Tifa <62847935+Tiphereth-A@users.noreply.github.com> Date: Sun, 28 May 2023 14:03:06 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=B0=86=20CNTT=20=E5=B9=B6?= =?UTF-8?q?=E5=85=A5=20NTT=20(#4916)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 24OI-bot <15963390+24OI-bot@users.noreply.github.com> --- docs/_redirects | 1 + docs/math/poly/cntt.md | 75 ------------------------------------ docs/math/poly/ntt.md | 87 +++++++++++++++++++++++++++++++++++++++++- mkdocs.yml | 1 - 4 files changed, 87 insertions(+), 77 deletions(-) delete mode 100644 docs/math/poly/cntt.md diff --git a/docs/_redirects b/docs/_redirects index 068f654cc..58765a38b 100644 --- a/docs/_redirects +++ b/docs/_redirects @@ -98,6 +98,7 @@ /math/poly/tri-func /math/poly/elementary-func /math/poly/inv-tri-func /math/poly/elementary-func /math/poly/lagrange /math/numerical/lagrange +/math/poly/cntt /math/poly/ntt /math/linear-algebra/gauss /math/numerical/gauss /math/integral /math/numerical/integral /math/newton /math/numerical/newton diff --git a/docs/math/poly/cntt.md b/docs/math/poly/cntt.md deleted file mode 100644 index c840b9c3d..000000000 --- a/docs/math/poly/cntt.md +++ /dev/null @@ -1,75 +0,0 @@ -author: Saisyc, 383494 - -$\mathbf Z_p$ 上的 NTT 常用于替代 FFT 以提高效率,但是严重依赖模数:$p$ 是 $2^mk+1$ 型(如费马质数)时能快速计算,是 $2^mk-1$ 型(如梅森质数)时却难以进行。 - -对此,[*Number theoretic transforms to implement fast digital convolution*](https://ieeexplore.ieee.org/document/1451721) 中(section IX, subsection B, P559-560)的快速复数论变换(Complex Number Theoretic Transforms, CNTT)即 $\mathbf Z_p[\mathrm{i}]$ 上的 DFT 能解决,但未被重视。 - -对于模 $2^mk-1$ 型质数的卷积问题,CNTT 优于三模数 NTT 和拆系数 FFT。 - -## DFT 可逆的条件 - -交换环 $R$ 上的 DFT 可逆的充要条件是:存在 $n$ 次本原单位根 $\omega$,且 $\omega^1-1,\omega^2-1,\cdots,\omega^{n-1}-1$ 可逆。 - -## 模 $p$ 高斯整数环 - -即 $\mathbf Z_p[\mathrm{i}]$。 - -为便捷,以下用 $p_-$ 表示 $4k-1$ 型质数,$p_+$ 表示 $4k+1$ 型质数。 - -$p_-$ 是高斯整数 $\mathbf Z_p[\mathrm{i}]$ 的素元而 $p_+$ 不是,因此 $\mathbf Z_{p_-}[\mathrm{i}]$ 是域而 $\mathbf Z_{p_+}[\mathrm{i}]$ 上仍可进行 CNTT。 - -## 原理 - -在 CNTT 中,我们考虑 $\mathbf Z_p[\mathrm{i}]$ 上的 Gauss 整数 $a+b\mathrm{i}\in\mathbf Z_p[\mathrm{i}]$,其中 $p \in \mathbf{P}$($\mathbf{P}$ 为素数集)。 - -原论文中假定 $\mathrm{i}^2=-1$,但经笔者手推,这里的 $\mathrm{i}^2$ 不是必须为 $-1$(要求 $4 \mid p-1$),只要满足 $\mathrm{i}^2$ 为模 $p$ 意义下的一个二次非剩余即可:这样 CNTT 的模数也可使用 NTT 模数。 - -???+ note "构成数域的证明" - 由于 $\mathbf Z_p[\mathrm{i}]$ 为 $\mathbf{C}$ 的子集,只要证明其对四则运算封闭。 - - 加法幺元:$0$ - - 乘法幺元:$1$ - - 加法逆元:同 $\mathbf{C}$ 中加法逆元,对 $p$ 取模即可。 - - 乘法逆元:对 $x = a+b\mathrm{i}$,其中 $a \not= 0 \vee b \not= 0$,设其逆元为 $y=c+d\mathrm{i}$,由 $xy=1$ 可知 - - $$ - \begin{cases} - ac+bd\mathrm{i}^2 &= 1 & (1) \\ - bc+ad &= 0 & (2) - \end{cases} - $$ - - 当 $b \not= 0$ 时:由 $(2)$ 知 $c = -adb^{-1}$,代入 $(1)$ 中可得 $d = (b\mathrm{i}^2-b^{-1}a^2)^{-1}$。 - - 若 $b\mathrm{i}^2-b^{-1}a^2 \equiv 0 \pmod p$,则 $\mathrm{i}^2 \equiv (ab^{-1})^2 \pmod p$,这与 $\mathrm{i}^2$ 是模 $p$ 意义下的一个二次非剩余矛盾,所以 $d$ 一定存在。 - - 当 $a \not= 0$ 时,用相似的方法可以推出 $x^{-1} = y$ 一定存在。 - - 由于加法和乘法运算封闭,且均存在逆元,因此 $\mathbf Z_p[\mathrm{i}]$ 对四则运算封闭。 - -这个数域的大小是 $p^2$,只要用一些方法找出 $g = a+b\mathrm{i},g^{(p^2-1)/2} \equiv -1 \pmod p$,则 $g$ 就是我们要找的 $p^2-1$ 次「原根」,剩下的和 NTT 类似。 - -$p=n\cdot2^k+1$ 时($p$ 为 NTT 模数),用 CNTT 可以将最大变换长度翻倍; - -$p=n\cdot2^k-1$ 时,用 CNTT 后最大变换长度同样能取到 NTT 模数级别。 - -## 常用模数的单位根 - -$\mathrm{i}^2 = -1, n=2^{21}$ 时 $p_-=999292927=2^{20}\times953-1$ 的 $p_-^2-1$ 次单位根 $\omega=1+8\mathrm{i}$; - -$\mathrm{i}^2 = -1, n=2^{23}$ 时 $p_+=998244353=2^{23}\times119+1$ 的 $p_+-1$ 次单位根 $\omega=1+\mathrm{i}$; - -$\mathrm{i}^2 = -1, n=2^{16}$ 时 $p_+=65537=2^{16}+1$ 的 $p_+-1$ 次单位根 $\omega=4+17573\mathrm{i}$; - -$\mathrm{i}^2 = 3, n=2^{31}$ 时 $p_-=2147483647=2^{31}-1$ 的 $p_-^2-1$ 次单位根 $\omega=1+\mathrm{i}$。 - -务必注意 $\omega^{-1}\equiv\bar\omega\pmod p$ 不一定成立。 - -## 性能和应用 - -[洛谷 P3803 评测记录](https://www.luogu.com.cn/record/list?pid=P3803&user=saisyc&page=7) 显示,按照*Optimization of number-theoretic transform in programming contests*实现的 NTT 及与其同构的 CNTT, FFT 进行 $2^{21}\approx2.1\times10^6$ 长度的变换用时分别约为 $44,97,115$ 毫秒。 - -对于 $\mathrm{i}^2=3$,模 $998244353$,$2^{24}$ 次单位根为 $0+125038983\mathrm{i}$,无读入优化等优化的 [CNTT](https://www.luogu.com.cn/record/106711483),它的常数是同等条件下 [FFT](https://www.luogu.com.cn/record/106683960) 和 [NTT](https://www.luogu.com.cn/record/106706552) 的 $3$ 倍左右;应用三次变两次优化后,[CNTT](https://www.luogu.com.cn/record/106997466) 常数约等于无优化的 FFT。 diff --git a/docs/math/poly/ntt.md b/docs/math/poly/ntt.md index 2a2746501..e0c65c77f 100644 --- a/docs/math/poly/ntt.md +++ b/docs/math/poly/ntt.md @@ -1,4 +1,4 @@ -author: ChungZH, Yukimaikoriya, tigerruanyifan, isdanni +author: ChungZH, Yukimaikoriya, tigerruanyifan, isdanni, Saisyc, 383494, Tiphereth-A ## 简介 @@ -172,6 +172,91 @@ DFT、FFT、NTT、FNTT 的具体关系是: } ``` +## 扩展 - 复数论变换(CNTT) + +$\mathbf Z_p$ 上的 NTT 常用于替代 FFT 以提高效率,但是严重依赖模数:$p$ 是 $2^mk+1$ 型(如费马质数)时能快速计算,是 $2^mk-1$ 型(如梅森质数)时却难以进行。 + +对此,[*Number theoretic transforms to implement fast digital convolution*](https://ieeexplore.ieee.org/document/1451721) 中(section IX, subsection B, P559-560)的快速复数论变换(Complex Number Theoretic Transforms, CNTT)即 $\mathbf Z_p[\mathrm{i}]$ 上的 DFT 能解决,但未被重视。 + +对于模 $2^mk-1$ 型质数的卷积问题,CNTT 优于三模数 NTT 和拆系数 FFT。 + +### DFT 可逆的条件 + +交换环 $R$ 上的 DFT 可逆的充要条件是:存在 $n$ 次本原单位根 $\omega$,且 $\omega^1-1,\omega^2-1,\cdots,\omega^{n-1}-1$ 可逆。 + +### 模 p 高斯整数环 + +即 $\mathbf{Z}_p[\mathrm{i}]$,其中 $p \in \mathbf{P}$($\mathbf{P}$ 为素数集)。 + +为便捷起见,以下用 $p_-$ 表示 $4k-1$ 型质数,$p_+$ 表示 $4k+1$ 型质数。 + +???+ note "定理 1" + $\mathbf{Z}_p[\mathrm{i}]$ 构成数域 + + ??? note "证明" + 对于 $p_+$,注意到 $\left(\dfrac{-1}{p_+}\right)=1$,故此时的 $\mathbf{Z}_{p_+}[\mathrm{i}]=\mathbf{Z}_{p_+}$. 因此以下假定 $p$ 为 $p_-$. + + 由于 $\mathbf Z_p[\mathrm{i}]$ 为 $\mathbf{C}$ 的子集,另外不难发现 $\mathbf Z_p[\mathrm{i}]$ 上有加法幺元 $0$ 和乘法幺元 $1$,故只需证明其对四则运算封闭即可。 + + 任取 $z_1=a_1+b_1\mathrm{i}\in\mathbf Z_p[\mathrm{i}]$,$z_2=a_2+b_2\mathrm{i}\in\mathbf{Z}_p[\mathrm{i}]$,则不难发现 + + - $\overline{z_1},\overline{z_2}\in\mathbf{Z}_p[\mathrm{i}]$ + - $|z_1|^2\equiv a_1^2+b_1^2\pmod{p}$,$|z_2|^2\equiv a_2^2+b_2^2\pmod{p}$ + - $\forall k\in\mathbf{Z}_p,~~kz_1\in\mathbf{Z}_p[\mathrm{i}]$ + + 加法与减法的封闭性:对上述的 $z_1,z_2$,有 + + $$ + z_1\pm z_2=(a_1\pm a_2)+(b_1\pm b_2)\mathrm{i}\in\mathbf{Z}_p[\mathrm{i}] + $$ + + 乘法的封闭性:对上述的 $z_1,z_2$,有 + + $$ + z_1z_2=(a_1a_2-b_1b_2)+(a_1b_2+a_2b_1)\mathrm{i}\in\mathbf{Z}_p[\mathrm{i}] + $$ + + 除法的封闭性:对上述的 $z_1,z_2$($z_2\ne 0$),有 + + $$ + \frac{z_1}{z_2}=(|z_2|^2)^{-1}z_1\overline{z_2}\in\mathbf{Z}_p[\mathrm{i}] + $$ + +???+ note "定理 2" + $\forall k\in\mathbf{Z}_+$,$\mathbf{Z}_p\left[\sqrt{-k^2}\right]=\mathbf{Z}_p\left[\sqrt{-1}\right]=\mathbf{Z}_p[\mathrm{i}]$ + + ??? note "证明" + 任取 $z=a+b\sqrt{-k^2}\in\mathbf{Z}_p\left[\sqrt{-k^2}\right]$,则 $z=a+bk\sqrt{-1}\in\mathbf{Z}_p\left[\sqrt{-1}\right]=\mathbf{Z}_p[\mathrm{i}]$ + +$p_-$ 是高斯整数 $\mathbf{Z}_p[\mathrm{i}]$ 的素元而 $p_+$ 不是,因此 $\mathbf{Z}_{p_-}[\mathrm{i}]$ 是域而 $\mathbf{Z}_{p_+}[\mathrm{i}]$ 上仍可进行 CNTT。 + +- 对于 $p_-$,因为 $\left(\dfrac{x}{p_-}\right)\left(\dfrac{-x}{p_-}\right)=-1,~\forall x\nmid p_-$,故 + + $$ + \forall \left(\frac{x}{p_-}\right)=-1, \exists k\in\mathbf{Z}_{+},~s.t.~-x\equiv k^2\pmod{p_-} + $$ + + 因此由定理 2 可知,$\mathrm{i}^2$ 只需为模 $p_-$ 意义下的一个二次非剩余即可,这样 CNTT 的模数也可使用 NTT 模数。 + + $\mathbf{Z}_{p_-}[\mathrm{i}]$ 的大小是 $p_-^2$,只要用一些方法找出 $g = a+b\mathrm{i},g^{(p_-^2-1)/2} \equiv -1 \pmod{p_-}$,则 $g$ 就是我们要找的 $p_-^2-1$ 次「原根」,剩下的和 NTT 类似。用 CNTT 后最大变换长度能取到 NTT 模数级别; + +- 对于 $p_+$,用 CNTT 可以将最大变换长度翻倍。 + +### 常用模数的单位根 + +- $\mathbf{Z}_{p_-}\left[\sqrt{-1}\right]$,$n=2^{21}$,$p_-=999292927=2^{20}\times953-1$ 的 $p_-^2-1$ 次单位根 $\omega=1+8\mathrm{i}$ +- $\mathbf{Z}_{p_+}\left[\sqrt{-1}\right]$,$n=2^{23}$,$p_+=998244353=2^{23}\times119+1$ 的 $p_+-1$ 次单位根 $\omega=1+\mathrm{i}$ +- $\mathbf{Z}_{p_+}\left[\sqrt{-1}\right]$,$n=2^{16}$,$p_+=65537=2^{16}+1$ 的 $p_+-1$ 次单位根 $\omega=4+17573\mathrm{i}$ +- $\mathbf{Z}_{p_-}\left[\sqrt{3}\right]$,$n=2^{31}$,$p_-=2147483647=2^{31}-1$ 的 $p_-^2-1$ 次单位根 $\omega=1+\sqrt{3}$ + +务必注意 $\omega^{-1}\equiv\bar\omega\pmod p$ 不一定成立。 + +### 性能和应用 + +[洛谷 P3803 评测记录](https://www.luogu.com.cn/record/list?pid=P3803&user=saisyc&page=7) 显示,按照*Optimization of number-theoretic transform in programming contests*实现的 NTT 及与其同构的 CNTT, FFT 进行 $2^{21}\approx2.1\times10^6$ 长度的变换用时分别约为 $44,97,115$ 毫秒。 + +对于 $\mathbf{Z}_{998244353}\left[\sqrt{3}\right]$,$998244353$ 的 $2^{24}$ 次单位根为 $0+125038983\sqrt{3}$,无读入优化等优化的 [CNTT](https://www.luogu.com.cn/record/106711483),它的常数是同等条件下 [FFT](https://www.luogu.com.cn/record/106683960) 和 [NTT](https://www.luogu.com.cn/record/106706552) 的 $3$ 倍左右;应用三次变两次优化后,[CNTT](https://www.luogu.com.cn/record/106997466) 常数约等于无优化的 FFT。 + ## 参考资料与拓展阅读 1. [FWT(快速沃尔什变换)零基础详解 qaq(ACM/OI)](https://zhuanlan.zhihu.com/p/41867199) diff --git a/mkdocs.yml b/mkdocs.yml index f1874c96a..1a239bae6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -262,7 +262,6 @@ nav: - 代数基本定理: math/poly/fundamental.md - 快速傅里叶变换: math/poly/fft.md - 快速数论变换: math/poly/ntt.md - - 快速复数论变换: math/poly/cntt.md - 快速沃尔什变换: math/poly/fwt.md - Chirp Z 变换: math/poly/czt.md - 多项式牛顿迭代: math/poly/newton.md