参考文献:
[Ber01] 详细地调研了上百篇有关各类乘法算法的文献,以环同构的视角解释这些算法。
映射:给定两个环 R , A R,A R,A,它们的环同态 ψ : R → A \psi: R \to A ψ:R→A 称为 “mapping R R R to A A A”
例如:
提升:令 I I I 是环 R R R 的理想,自然的环嵌入 r + I ↦ r ′ , ∀ ( r − r ′ ) ∈ I r+I \mapsto r', \forall (r-r') \in I r+I↦r′,∀(r−r′)∈I 称为 “lifting R / I R/I R/I to R R R”
例如:
整数的 Base- B B B clumping:将整数环 Z \mathbb Z Z 同构映射到 Z [ y ] / ( B − y ) \mathbb Z[y]/(B-y) Z[y]/(B−y),然后提升到多项式环 Z [ y ] \mathbb Z[y] Z[y]
多项式的 Degree- n n n clumping(聚合):将多项式环 R [ x ] R[x] R[x] 同构映射到 R [ x ] [ y ] / ( y − x n ) R[x][y]/(y-x^n) R[x][y]/(y−xn),然后提升到 R [ x ] [ y ] R[x][y] R[x][y],它形如
f = ∑ i = 0 k n − 1 f i x i = ∑ i = 0 k − 1 ( ∑ j = 0 n − 1 f n i + j ⋅ x j ) ⋅ y i f=\sum_{i=0}^{kn-1} f_i x^i = \sum_{i=0}^{k-1}\left(\sum_{j=0}^{n-1}f_{ni+j}\cdot x^j\right) \cdot y^i f=i=0∑kn−1fixi=i=0∑k−1(j=0∑n−1fni+j⋅xj)⋅yi
将连续 n n n 个相邻系数,打包到环 R [ x ] R[x] R[x] 上的度数小于 n n n 的多项式
多项式的 Degree- n n n striding(跨步):将多项式环 R [ x ] R[x] R[x] 同构映射到 R [ y ] [ x ] / ( x n − y ) R[y][x]/(x^n-y) R[y][x]/(xn−y),然后提升到 R [ y ] [ x ] R[y][x] R[y][x],它形如
f = ∑ i = 0 k n − 1 f i x i = ∑ i = 0 n − 1 ( ∑ j = 0 k − 1 f i + n j ⋅ y j ) ⋅ x i f=\sum_{i=0}^{kn-1} f_i x^i = \sum_{i=0}^{n-1}\left(\sum_{j=0}^{k-1}f_{i+nj}\cdot y^j\right) \cdot x^i f=i=0∑kn−1fixi=i=0∑n−1(j=0∑k−1fi+nj⋅yj)⋅xi
将间隔 n n n 的系数,打包到环 R [ y ] R[y] R[y] 上的度数小于 k k k 的多项式
为了计算 R [ x ] R[x] R[x] 内的线性函数 a = a 0 + a 1 x a=a_0+a_1x a=a0+a1x 和 b = b 0 + b 1 x b=b_0+b_1x b=b0+b1x 的乘积,
ψ : R [ x ] → R [ x ] / ( x 2 − x ) ≅ R [ x ] / ( x ) × R [ x ] / ( x − 1 ) \psi: R[x] \to R[x]/(x^2-x) \cong R[x]/(x) \times R[x]/(x-1) ψ:R[x]→R[x]/(x2−x)≅R[x]/(x)×R[x]/(x−1)
其中的 CRT 基是 { 1 − x , x } \{1-x,x\} {1−x,x},辅助信息 u = a 1 b 1 u=a_1b_1 u=a1b1
那么就有:
a ↦ ( a 0 , a 0 + a 1 ) b ↦ ( b 0 , b 0 + b a 1 ) a b = a 0 b 0 ⋅ ( 1 − x ) + ( a 0 + a 1 ) ( b 0 + b 1 ) ⋅ x + u ⋅ ( x 2 − x ) \begin{aligned} a &\mapsto (a_0, a_0+a_1)\\ b &\mapsto (b_0, b_0+ba_1)\\ ab &= a_0b_0 \cdot(1-x) + (a_0+a_1)(b_0+b_1) \cdot x + u \cdot (x^2-x) \end{aligned} abab↦(a0,a0+a1)↦(b0,b0+ba1)=a0b0⋅(1−x)+(a0+a1)(b0+b1)⋅x+u⋅(x2−x)
Karatsuba multiplication for integers:给定两个整数 0 ≤ a , b < 2 2 n 0\le a,b < 2^{2n} 0≤a,b<22n,
Karatsuba multiplication for polynomials:给定两个多项式 a , b ∈ R [ x ] a,b \in R[x] a,b∈R[x],满足 deg a , deg b < 2 n \deg a,\deg b < 2n dega,degb<2n
Dual Karatsuba multiplication:
对于 CRT 分解后的小环 R [ x ] / ( x ) , R [ x ] / ( x − 1 ) R[x]/(x), R[x]/(x-1) R[x]/(x),R[x]/(x−1) 上的乘法,递归地使用 Karatsuba multiplication,可以达到 O ( n log 3 ) O(n^{\log3}) O(nlog3) 复杂度。这是第一个优于 n 2 n^2 n2 的算法。
Toom 推广了 Karatsuba 技巧。为了计算 R [ x ] R[x] R[x] 内次数小于 k k k 的多项式的乘积,假设 2 , 3 , ⋯ , 2 ( k − 1 ) 2,3,\cdots,2(k-1) 2,3,⋯,2(k−1) 是环 R R R 上可消去的,那么
ψ : R [ x ] → R [ x ] / ( x − ( − k + 1 ) ) ( x − ( − k + 2 ) ) ⋯ ( x − ( k − 1 ) ) \psi: R[x] \to R[x]/(x-(-k+1))(x-(-k+2)) \cdots (x-(k-1)) ψ:R[x]→R[x]/(x−(−k+1))(x−(−k+2))⋯(x−(k−1))
继续做 CRT 分解,可以得到 2 k − 1 2k-1 2k−1 个小环。在 CRT 域下计算乘法,然后用 CRT basis 合成,然后提升回 R [ x ] R[x] R[x]
Toom multiplication for integers:对于 0 ≤ a , b ≤ 2 k n − 1 0\le a,b \le 2^{kn}-1 0≤a,b≤2kn−1,先执行基 2 n 2^n 2n 聚合,得到次数小于 k k k 的多项式,然后利用 Toom’s trick 计算多项式乘积。以 k = 3 k=3 k=3 为例,
Z → Z [ y ] / ( 2 n − y ) → Z [ y ] / ( y 5 − 5 y 3 + 4 y ) \mathbb Z \to \mathbb Z[y]/(2^n-y) \to Z[y]/(y^5-5y^3+4y) Z→Z[y]/(2n−y)→Z[y]/(y5−5y3+4y)
然后做 CRT 分解
Z [ y ] / ( y 5 − 5 y 3 + 4 y ) ≅ ∏ t = − 2 2 Z [ y ] / ( y − t ) Z[y]/(y^5-5y^3+4y) \cong \prod_{t=-2}^{2} \mathbb Z[y]/(y-t) Z[y]/(y5−5y3+4y)≅t=−2∏2Z[y]/(y−t)
这里的小环 Z [ y ] / ( y − t ) ≅ Z [ 2 n ] / ( 2 n − t ) \mathbb Z[y]/(y-t) \cong \mathbb Z[2^n]/(2^n-t) Z[y]/(y−t)≅Z[2n]/(2n−t),既可以按照多项式乘法,也可以按照整数乘法。
Toom multiplication for polynomials:对于 deg a , deg b ≤ k n − 1 \deg a,\deg b \le kn-1 dega,degb≤kn−1,先执行度 n n n 聚合,得到次数小于 k k k 的多项式,然后利用 Toom’s trick 计算多项式乘积
Dual Toom multiplication:对于 deg a , deg b ≤ k n − 1 \deg a,\deg b \le kn-1 dega,degb≤kn−1,先执行度 k k k 跨步,得到次数小于 k k k 的多项式,然后利用 Toom’s trick 计算多项式乘积
对于 CRT 分解后的小环 R [ x ] / ( x − t ) , t = − k + 1 , ⋯ , k − 1 R[x]/(x-t), t=-k+1,\cdots,k-1 R[x]/(x−t),t=−k+1,⋯,k−1 上的乘法,递归地使用 Toom multiplication,可以达到 n exp ( O ( log n ) ) n\exp\left(O(\sqrt{\log n})\right) nexp(O(logn)) 复杂度。这是第一个达到 O ~ ( n ) \tilde O(n) O~(n) 的算法。
如果 b ∈ R b \in R b∈R 满足 2 b 2b 2b 是可逆的,那么下面的映射是 CRT 可逆的,
R [ x ] / ( x 2 n − b 2 ) → R [ x ] / ( x n − b ) × R [ x ] / ( x n + b ) R[x]/(x^{2n}-b^2) \to R[x]/(x^{n}-b) \times R[x]/(x^{n}+b) R[x]/(x2n−b2)→R[x]/(xn−b)×R[x]/(xn+b)
FFT:假如存在 ζ ∈ R \zeta \in R ζ∈R 满足 ζ n = − 1 \zeta^{n}=-1 ζn=−1,那么递归地对 R [ x ] / ( x 2 n − 1 ) R[x]/(x^{2n}-1) R[x]/(x2n−1) 使用 FFT trick,可以达到 O ( n log n ) O(n\log n) O(nlogn) 复杂度。注意,只要任意的环 R R R 中存在 ζ \zeta ζ 即可,不需要它成为域。
twisted FFT:将环 R [ x ] / ( x 2 n − 1 ) R[x]/(x^{2n}-1) R[x]/(x2n−1) 分解为 R [ x ] / ( x n − 1 ) R[x]/(x^{n}-1) R[x]/(xn−1) 和 R [ x ] / ( x n + 1 ) R[x]/(x^{n}+1) R[x]/(xn+1),然后采用同构映射 x ↦ ζ y x \mapsto \zeta y x↦ζy,将后者扭曲为
R [ x ] / ( x n + 1 ) ≅ R [ y ] / ( y n − 1 ) R[x]/(x^{n}+1) \cong R[y]/(y^{n}-1) R[x]/(xn+1)≅R[y]/(yn−1)
接下来的递归 FFT 只需考虑形如 ( x n − 1 ) , ( y n − 1 ) (x^n-1), (y^n-1) (xn−1),(yn−1) 的分解,实现更加简单
split-radix FFT:假如存在 ζ ∈ R \zeta \in R ζ∈R 满足 ζ 2 n = − 1 \zeta^{2n}=-1 ζ2n=−1,简记 i = ζ n i=\zeta^n i=ζn,执行如下形式的分解
R [ x ] / ( x 4 n − 1 ) → R [ x ] / ( x 2 n − 1 ) × R [ x ] / ( x n − i ) × R [ x ] / ( x n + i ) R[x]/(x^{4n}-1) \to R[x]/(x^{2n}-1) \times R[x]/(x^{n}-i) \times R[x]/(x^{n}+i) R[x]/(x4n−1)→R[x]/(x2n−1)×R[x]/(xn−i)×R[x]/(xn+i)
接着,
现在我们得到了
R [ x ] / ( x 4 n − 1 ) → R [ x ] / ( x 2 n − 1 ) × R [ y ] / ( y n − 1 ) × R [ z ] / ( z n − 1 ) R[x]/(x^{4n}-1) \to R[x]/(x^{2n}-1) \times R[y]/(y^{n}-1) \times R[z]/(z^{n}-1) R[x]/(x4n−1)→R[x]/(x2n−1)×R[y]/(yn−1)×R[z]/(zn−1)
radix-3 FFT:如果存在 w ∈ R w \in R w∈R 满足 1 + w + w 2 = 0 1+w+w^2=0 1+w+w2=0,并且 b ∈ R b \in R b∈R 满足 3 b 2 3b^2 3b2 是可逆的,那么如下的分解是 CRT 可逆的,
R [ x ] / ( x 3 n − b 3 ) → R [ x ] / ( x n − b ) × R [ x ] / ( x n − w b ) × R [ x ] / ( x n − w 2 b ) R[x]/(x^{3n}-b^3) \to R[x]/(x^n-b) \times R[x]/(x^n-wb) \times R[x]/(x^n-w^2b) R[x]/(x3n−b3)→R[x]/(xn−b)×R[x]/(xn−wb)×R[x]/(xn−w2b)
使用场景:
假设 gcd ( m , n ) = 1 \gcd(m,n)=1 gcd(m,n)=1,那么 Z m n ∗ ≅ Z m ∗ × Z n ∗ \mathbb Z_{mn}^* \cong \mathbb Z_m^* \times \mathbb Z_n^* Zmn∗≅Zm∗×Zn∗,映射 a → ( b , c ) a \to (b,c) a→(b,c) 的逆是 a = b ′ c ′ a=b'c' a=b′c′,其中的 b ′ , c ′ ∈ Z m n ∗ b',c' \in \mathbb Z_{mn}^* b′,c′∈Zmn∗ 是满足 b ′ ≡ b ( m o d m ) b'\equiv b \pmod m b′≡b(modm) 和 c ′ ≡ c ( m o d n ) c'\equiv c \pmod n c′≡c(modn) 的恰当代表元。
假如 x x x 是 m n mn mn 次本原单位根, y , z y,z y,z 分别是 m , n m,n m,n 次本原单位根,因此 y z yz yz 也是一个 m n mn mn 次本原单位根。映射 x ↦ y z x \mapsto yz x↦yz,导致了如下的同构:
R [ x ] / ( x m n − 1 ) ≅ ( R [ y ] / ( y m − 1 ) ) [ z ] / ( z n − 1 ) R[x]/(x^{mn}-1) \cong (R[y]/(y^m-1))[z]/(z^n-1) R[x]/(xmn−1)≅(R[y]/(ym−1))[z]/(zn−1)
对于 f = ∑ i f i x i ∈ R [ x ] / ( x m n − 1 ) f = \sum_i f_i x^i \in R[x]/(x^{mn}-1) f=∑ifixi∈R[x]/(xmn−1),具体的转化为:
f ( x ) ↦ ∑ i = 0 m n − 1 f i ⋅ ( y z ) i = ∑ i = 0 m n − 1 f i ⋅ y i ( m o d m ) z i ( m o d n ) = ∑ i = 0 n − 1 ( ∑ j = 0 m − 1 f i + n j ⋅ y i + n j ( m o d m ) ) ⋅ z i \begin{aligned} f(x) &\mapsto \sum_{i=0}^{mn-1} f_i \cdot (yz)^i\\ &= \sum_{i=0}^{mn-1} f_i \cdot y^{i \pmod m} z^{i \pmod n}\\ &= \sum_{i=0}^{n-1}\left(\sum_{j=0}^{m-1} f_{i+nj} \cdot y^{i+nj \pmod m}\right) \cdot z^{i}\\ \end{aligned} f(x)↦i=0∑mn−1fi⋅(yz)i=i=0∑mn−1fi⋅yi(modm)zi(modn)=i=0∑n−1(j=0∑m−1fi+nj⋅yi+nj(modm))⋅zi
Good’s trick 往往和 FFT 组合使用,减少 Padding 长度(FFT 要求长度是二的幂次)
为了对 f ∈ R [ x ] f \in R[x] f∈R[x] 使用 FFT,必须要求环 R R R 中存在恰当的本原单位根。如果不存在,最简单的思路就是通过环扩张,使得在 R [ y ] R[y] R[y] 中存在,然后将系数从 R R R 提升到 R [ y ] R[y] R[y] 中,得到 f ∈ ( R [ y ] ) [ x ] f \in (R[y])[x] f∈(R[y])[x],虽然 f i ∈ R ⊆ R [ y ] f_i \in R \subseteq R[y] fi∈R⊆R[y]。
注意到如果存在 ζ ∈ R \zeta \in R ζ∈R,它已经是 n n n 次单位根,那么扩环 R [ y ] / ( y t − ζ ) R[y]/(y^t-\zeta) R[y]/(yt−ζ) 中的 y y y 就是 n t nt nt 次单位根。这通过已有的单位根,减少了环的扩张次数(如果简单使用 ( y n t − 1 ) (y^{nt}-1) (ynt−1),这扩张了 n t nt nt 次)。对于 Z [ x ] \mathbb Z[x] Z[x] 来说,系数的环可以是 Z / ( t ) \mathbb Z/(t) Z/(t)(充分大的模数 t t t,不必是素的),也可以是 C \mathbb C C(环 Z \mathbb Z Z 的扩张,但是精度受限),只要能够找出单位根,并且要求数据不发生溢出。
不过,也可以通过对多项式变换,通过把一些系数打包在一起,构造出系数的环 R [ y ] R[y] R[y](直接找出了单位根),而非简单的提升。
对于整数环 Z / ( 2 m n + 1 ) \mathbb Z/(2^{mn}+1) Z/(2mn+1),将它同构映射为 ( Z [ y ] / ( y n + 1 ) ) / ( 2 m − y ) (\mathbb Z[y]/(y^n+1))/(2^m-y) (Z[y]/(yn+1))/(2m−y),其中的整系数不大于 2 m 2^m 2m。我们将它提升到 Z [ y ] / ( y n + 1 ) \mathbb Z[y]/(y^n+1) Z[y]/(yn+1),接着可以再映射到 ( Z / ( 2 n k + 1 ) ) [ y ] / ( y n + 1 ) (\mathbb Z/(2^{nk}+1))[y]/(y^n+1) (Z/(2nk+1))[y]/(yn+1),于是:
Z / ( 2 m n + 1 ) ≅ Z [ y ] / ( y n + 1 , 2 m − y ) → l i f t Z [ y ] / ( y n + 1 ) → m a p Z 2 n k + 1 [ y ] / ( y n + 1 ) \mathbb Z/(2^{mn}+1) \cong \mathbb Z[y]/(y^n+1, 2^m-y) \overset{\bf lift}{\to} \mathbb Z[y]/(y^n+1) \overset{\bf map}{\to} \mathbb Z_{2^{nk}+1}[y]/(y^n+1) Z/(2mn+1)≅Z[y]/(yn+1,2m−y)→liftZ[y]/(yn+1)→mapZ2nk+1[y]/(yn+1)
预先确定参数 m , n , k m,n,k m,n,k 的取值,只要满足 2 n k > n ⋅ 2 2 m 2^{nk} > n \cdot 2^{2m} 2nk>n⋅22m,那么 Z / ( 2 n k + 1 ) \mathbb Z/(2^{nk}+1) Z/(2nk+1) 就可以正确模拟大小为 2 m 2^m 2m 的 n n n 个系数的(反)卷积。
特别地,在 Z / ( 2 n k + 1 ) \mathbb Z/(2^{nk}+1) Z/(2nk+1) 中的 2 k 2^k 2k,它就是 2 n 2n 2n 次本原单位根!因此,
Cyclic 变体:整数环 Z / ( 2 2 m n − 1 ) \mathbb Z/(2^{2mn}-1) Z/(22mn−1),同构于 ( Z [ y ] / ( y 2 n − 1 ) ) / ( 2 m − y ) (\mathbb Z[y]/(y^{2n}-1))/(2^m-y) (Z[y]/(y2n−1))/(2m−y),提升后再映射为 ( Z [ y ] / ( y 2 n − 1 ) ) / ( y 2 n − 1 ) (\mathbb Z[y]/(y^{2n}-1))/(y^{2n}-1) (Z[y]/(y2n−1))/(y2n−1)
对于多项式环 R [ x ] / ( x m n + 1 ) R[x]/(x^{mn}+1) R[x]/(xmn+1),做如下的同构映射
R [ x ] / ( x m n + 1 ) ≅ R [ x ] [ y ] / ( y n + 1 , x m − y ) R[x]/(x^{mn}+1) \cong R[x][y]/(y^n+1, x^{m}-y) R[x]/(xmn+1)≅R[x][y]/(yn+1,xm−y)
它关于 x x x 的次数小于 m m m,我们将它提升到 R [ x ] [ y ] / ( y n + 1 ) R[x][y]/(y^n+1) R[x][y]/(yn+1),然后再做同态映射
R [ x ] [ y ] / ( y n + 1 ) → ( R [ x ] / ( x n k + 1 ) ) [ y ] / ( y n + 1 ) R[x][y]/(y^n+1) \to (R[x]/(x^{nk}+1))[y]/(y^n+1) R[x][y]/(yn+1)→(R[x]/(xnk+1))[y]/(yn+1)
预先确定参数 m , n , k m,n,k m,n,k 的取值,只要满足 n k > 2 m − 2 nk > 2m-2 nk>2m−2,那么 R [ x ] / ( x n k + 1 ) R[x]/(x^{nk}+1) R[x]/(xnk+1) 就可以正确模拟长度为 m m m 的多项式的乘积。
特别地,在 R [ x ] / ( x n k + 1 ) R[x]/(x^{nk}+1) R[x]/(xnk+1) 中的 x k x^k xk,它就是 2 n 2n 2n 次本原单位根!因此,我们对环 ( R [ x ] / ( x n k + 1 ) ) [ y ] / ( y n + 1 ) (R[x]/(x^{nk}+1))[y]/(y^n+1) (R[x]/(xnk+1))[y]/(yn+1) 做 FFT,计算乘积之后,经过反序的 lift 和 map,回到 R [ x ] / ( x m n + 1 ) R[x]/(x^{mn}+1) R[x]/(xmn+1) 上。
Cyclic 变体:多项式环 R [ x ] / ( x 2 m n − 1 ) R[x]/(x^{2mn}-1) R[x]/(x2mn−1),同构于 R [ x ] [ y ] / ( y 2 n − 1 , x m − y ) R[x][y]/(y^{2n}-1, x^{m}-y) R[x][y]/(y2n−1,xm−y),提升后再映射为 ( R [ x ] / ( x n k + 1 ) ) [ y ] / ( y 2 n − 1 ) (R[x]/(x^{nk}+1))[y]/(y^{2n}-1) (R[x]/(xnk+1))[y]/(y2n−1)
Radix-3 变体:对于多项式环 R [ x ] / ( x 2 m n + x m n + 1 ) R[x]/(x^{2mn}+x^{mn}+1) R[x]/(x2mn+xmn+1),映射为
R [ x ] [ y ] / ( y 2 n + y n + 1 , x m − y ) → l i f t R [ x ] [ y ] / ( y 2 n + y n + 1 ) → m a p ( R [ x ] / ( z 2 n k + x n k + 1 ) ) [ y ] / ( y 2 n + y n + 1 ) R[x][y]/(y^{2n}+y^{n}+1, x^m-y) \overset{\bf lift}{\to} R[x][y]/(y^{2n}+y^{n}+1) \overset{\bf map}{\to} (R[x]/(z^{2nk}+x^{nk}+1))[y]/(y^{2n}+y^{n}+1) R[x][y]/(y2n+yn+1,xm−y)→liftR[x][y]/(y2n+yn+1)→map(R[x]/(z2nk+xnk+1))[y]/(y2n+yn+1)
其中 x n k ∈ R [ x ] / ( z 2 n k + x n k + 1 ) x^{nk} \in R[x]/(z^{2nk}+x^{nk}+1) xnk∈R[x]/(z2nk+xnk+1) 是 3 3 3 次单位根,于是就有分解
y 2 n + y n + 1 = ( y n − x n k ) ( y n − x 2 n k ) y^{2n}+y^n+1 = (y^n-x^{nk})(y^n-x^{2nk}) y2n+yn+1=(yn−xnk)(yn−x2nk)
另外 x k x^k xk 是 2 n 2n 2n 次本原单位根,从而可以对它们继续执行 FFT 算法。
对于多项式环 R [ x ] / ( x m n k + 1 ) R[x]/(x^{mnk}+1) R[x]/(xmnk+1) 做跨步,得到同构
R [ y ] [ x ] / ( y n k + 1 , x m − y ) ≅ ( R [ y ] / ( y n k + 1 ) ) [ x ] / ( x m − y ) R[y][x]/(y^{nk}+1, x^{m}-y) \cong (R[y]/(y^{nk}+1))[x]/(x^{m}-y) R[y][x]/(ynk+1,xm−y)≅(R[y]/(ynk+1))[x]/(xm−y)
系数的范围是 R [ y ] / ( y n k + 1 ) R[y]/(y^{nk}+1) R[y]/(ynk+1),而关于 x x x 的度数小于 m m m,将它提升后,再同态映射:
( R [ y ] / ( y n k + 1 ) ) [ x ] / ( x m − y ) → l i f t ( R [ y ] / ( y n k + 1 ) ) [ x ] → m a p ( R [ y ] / ( y n k + 1 ) ) [ x ] / ( x 2 n − 1 ) (R[y]/(y^{nk}+1))[x]/(x^{m}-y) \overset{\bf lift}{\to} (R[y]/(y^{nk}+1))[x] \overset{\bf map}{\to} (R[y]/(y^{nk}+1))[x]/(x^{2n}-1) (R[y]/(ynk+1))[x]/(xm−y)→lift(R[y]/(ynk+1))[x]→map(R[y]/(ynk+1))[x]/(x2n−1)
选取参数 m , n , k m,n,k m,n,k,只要满足 n ≥ m n \ge m n≥m,那么后者就可以正确模拟 ( R [ y ] / ( y n k + 1 ) ) [ x ] / ( x m − y ) (R[y]/(y^{nk}+1))[x]/(x^{m}-y) (R[y]/(ynk+1))[x]/(xm−y),从而计算出 R [ x ] / ( x m n k + 1 ) R[x]/(x^{mnk}+1) R[x]/(xmnk+1)
特别地, y k ∈ R [ y ] / ( y n k + 1 ) y^k \in R[y]/(y^{nk}+1) yk∈R[y]/(ynk+1) 就是 2 n 2n 2n 次本原单位根,从而可以执行 FFT 算法。
Radix-3 变体:对于多项式环 R [ x ] / ( x 2 m n k + x m n k + 1 ) R[x]/(x^{2mnk}+x^{mnk}+1) R[x]/(x2mnk+xmnk+1),映射为
( R [ y ] / ( y 2 n k + y n k + 1 ) ) [ x ] / ( x m − y ) → l i f t ( R [ y ] / ( y 2 n k + y n k + 1 ) ) [ x ] → m a p ( R [ y ] / ( y 2 n k + y n k + 1 ) ) [ x ] / ( x 3 n − 1 ) (R[y]/(y^{2nk}+y^{nk}+1))[x]/(x^m-y) \overset{\bf lift}{\to} (R[y]/(y^{2nk}+y^{nk}+1))[x] \overset{\bf map}{\to} (R[y]/(y^{2nk}+y^{nk}+1))[x]/(x^{3n}-1) (R[y]/(y2nk+ynk+1))[x]/(xm−y)→lift(R[y]/(y2nk+ynk+1))[x]→map(R[y]/(y2nk+ynk+1))[x]/(x3n−1)
其中的 y n k ∈ R [ y ] / ( y 2 n k + y n k + 1 ) y^{nk} \in R[y]/(y^{2nk}+y^{nk}+1) ynk∈R[y]/(y2nk+ynk+1) 是 3 3 3 次单位根,并且 y k y^{k} yk 是 3 n 3n 3n 次单位根。
对于任意的环 R R R,为了快速计算 a ⋅ b ∈ R a \cdot b \in R a⋅b∈R,可以通过 radix-2 和 radix-3 分别计算两遍,得到 a ⋅ b a \cdot b a⋅b 的缩放结果,然后由于 gcd ( 2 , 3 ) = 1 \gcd(2,3)=1 gcd(2,3)=1,从而可以将它们组合出最终结果。
令整数 e ≥ 1 , m ≥ 1 e \ge 1,m\ge 1 e≥1,m≥1,满足 2 e − 1 < m ≤ 2 e 2^{e-1}< m \le 2^e 2e−1<m≤2e,给定两个多项式 a , b ∈ R [ x ] a,b \in R[x] a,b∈R[x],那么,
第一步:令 k = ⌈ m / 2 ⌉ k=\lceil m/2 \rceil k=⌈m/2⌉,计算 K = 2 k , M = 2 m , E = 2 e K=2^k, M=2^m, E=2^e K=2k,M=2m,E=2e,定义 A = R [ y ] / ( y K + 1 ) A=R[y]/(y^K+1) A=R[y]/(yK+1)。如果 m m m 是偶数(此时 M / K = K = 2 m / 2 M/K=K=2^{m/2} M/K=K=2m/2),则 y y y 就是 2 M / K 2M/K 2M/K 次本原单位根;如果 m m m 是奇数(此时 M / K = 2 ( m − 1 ) / 2 M/K=2^{(m-1)/2} M/K=2(m−1)/2 而 K = 2 ( m + 1 ) / 2 K=2^{(m+1)/2} K=2(m+1)/2),则 y 2 y^2 y2 就是 2 M / K 2M/K 2M/K 次本原单位根。总之,本原单位根存在。
第二步:令 k = ⌈ m / 2 ⌉ k=\lceil m/2 \rceil k=⌈m/2⌉,计算 K = 3 k , M = 3 m , E = 3 e K=3^k, M=3^m, E=3^e K=3k,M=3m,E=3e,定义 A = R [ y ] / ( y 2 K + y K + 1 ) A=R[y]/(y^{2K}+y^K+1) A=R[y]/(y2K+yK+1)。如果 m m m 是偶数(此时 M / K = K = 3 m / 2 M/K=K=3^{m/2} M/K=K=3m/2),则 y y y 就是 3 M / K 3M/K 3M/K 次本原单位根;如果 m m m 是奇数(此时 M / K = 3 ( m − 1 ) / 2 M/K=3^{(m-1)/2} M/K=3(m−1)/2 而 K = 3 ( m + 1 ) / 2 K=3^{(m+1)/2} K=3(m+1)/2),则 y 3 y^3 y3 就是 3 M / K 3M/K 3M/K 次本原单位根。总之,本原单位根存在。
第三步:给定 a , b ∈ R [ x ] a,b \in R[x] a,b∈R[x],满足 deg a + deg b < n \deg a+\deg b < n dega+degb<n,
不过,虽然上述算法支持任意的环 R R R 下的 R [ x ] R[x] R[x] 中多项式的快速乘法,但是实际效率存疑。如果基环 R R R 的性质足够好(存在恰当的本原根,缩放因子可逆),那么还是 FFT 以及它的 Nussbaumer 等变体的效率更好。