问题:给定多项式 A ( x ) = Σ i = 0 n a i x i , B ( x ) = Σ i = 0 m b i x i A(x) = \Sigma_{i = 0}^n a_i x^i, B(x) = \Sigma_{i = 0}^m b_i x^i A(x)=Σi=0naixi,B(x)=Σi=0mbixi 的系数 a 0.. n , b 0.. m a_{0 .. n}, b_{0 .. m} a0..n,b0..m,求其多项式乘积 C ( x ) = A ( x ) B ( x ) = Σ i = 0 m + n c i x i C(x) = A(x) B(x) = \Sigma_{i = 0}^{m + n} c_i x^i C(x)=A(x)B(x)=Σi=0m+ncixi 的各项系数 c 0.. n + m c_{0 .. n + m} c0..n+m,以下不妨设 n > m n > m n>m。
朴素算法:计算 c i = Σ j = 0 i a j b i − j c_i = \Sigma_{j = 0}^i a_j b_{i - j} ci=Σj=0iajbi−j,时间复杂度 O ( n 2 ) O(n^2) O(n2)。
多项式乘法的快速傅里叶变换(FFT)算法:
第一步,找到最小的
N
N
N,满足
N
≥
n
+
m
N \geq n + m
N≥n+m 且
N
N
N 为 2 的整数幂,将多项式
A
(
x
)
A(x)
A(x) 和
B
(
x
)
B(x)
B(x) 高次项系数补
0
0
0,补至
x
N
−
1
x^{N - 1}
xN−1 项为止,至此
A
(
x
)
A(x)
A(x) 和
B
(
x
)
B(x)
B(x) 以及积
C
(
x
)
C(x)
C(x) 都有
N
N
N 个系数;
第二步,用 FFT 将
A
(
x
)
A(x)
A(x) 和
B
(
x
)
B(x)
B(x) 由系数表示转为点值表示,即将
a
0
,
a
1
,
.
.
,
a
N
−
1
a_0, a_1, .., a_{N - 1}
a0,a1,..,aN−1 转化为
A
(
ω
N
0
)
,
A
(
ω
N
1
)
,
.
.
,
A
(
ω
N
N
−
1
)
A(\omega_N^0), A(\omega_N^1), .., A(\omega_N^{N - 1})
A(ωN0),A(ωN1),..,A(ωNN−1),其中所取的
N
N
N 个样本点是方程
ω
N
=
1
\omega^N = 1
ωN=1 的
N
N
N 个复根,即满足
ω
N
k
=
e
2
π
i
k
N
=
cos
2
π
k
N
+
i
sin
2
π
k
N
,
i
=
−
1
\omega_N^k = e^{\frac{2 \pi i k}{N}} = \cos \frac{2 \pi k}{N} + i \sin \frac{2 \pi k}{N}, i = \sqrt{-1}
ωNk=eN2πik=cosN2πk+isinN2πk,i=−1,
B
(
x
)
B(x)
B(x) 也是同理;
第三步,计算
C
(
ω
N
k
)
=
A
(
ω
N
k
)
B
(
ω
N
k
)
C(\omega_N^k) = A(\omega_N^k) B(\omega_N^k)
C(ωNk)=A(ωNk)B(ωNk),得出多项式
C
(
x
)
C(x)
C(x) 的点值表示;
第四步,用 FFT 将
C
(
x
)
C(x)
C(x) 由点值表示转为系数表示,这一步和第二步都可以在
Θ
(
n
log
n
)
\Theta(n \log n)
Θ(nlogn) 的时间复杂度下完成;
第五步,删去系数为
0
0
0 的高次项,保留到最高项
c
n
+
m
x
n
+
m
c_{n + m} x^{n + m}
cn+mxn+m。
总时间复杂度
O
(
n
log
n
)
O(n \log n)
O(nlogn)。
FFT 具体细节见下文,参考代码如下,其中 F F T ( a , l ) FFT(a, l) FFT(a,l) 函数将 a [ 0.. 2 l ] a[0 .. 2^l] a[0..2l] 由参数表示转为点值表示, F F T N ( a , l ) FFTN(a, l) FFTN(a,l) 函数将 a [ 0.. 2 l ] a[0 .. 2^l] a[0..2l] 由点值表示转为参数表示。
import math
def BitReverse(p, l):
q, r = [], [0]
for i in range(1, 1 << l):
r.append(r[i >> 1] >> 1 | (i & 1) << l - 1)
for ri in r:
q.append(p[ri])
return q
def IterativeFFT(a, l, g):
a = BitReverse(a, l)
for s in range(l):
m = 2 << s
wm = complex(math.cos(2 * math.pi / m), g * math.sin(2 * math.pi / m))
for k in range(0, 1 << l, m):
w = complex(1)
for j in range(m >> 1):
u, t = a[k + j], w * a[k + j + (m >> 1)]
a[k + j], a[k + j + (m >> 1)] = u + t, u - t
w *= wm
return a
def FFT(a, l):
return IterativeFFT(a, l, 1)
def FFTN(a, l):
return [ai / (1 << l) for ai in IterativeFFT(a, l, -1)]
由于 FFT 引入复数和浮点运算,使得运算结果和标准答案间存在由小数运算导致的系统误差。考虑到复数域上方程 z N = 1 z^N = 1 zN=1 与模 p p p 剩余类域上方程 x N ≡ 1 ( m o d p ) x^N \equiv 1 (mod \ p) xN≡1(mod p) 的同构性,若 ∃ x N ∈ [ 1 , p − 1 ] \exist x_N \in [1, p - 1] ∃xN∈[1,p−1] 使得 x N N ≡ 1 ( m o d p ) x_N^N \equiv 1 (mod \ p) xNN≡1(mod p) 且对于 ∀ i , j ∈ [ 1 , N ] \forall i, j \in [1, N] ∀i,j∈[1,N],若 i ≠ j i \neq j i=j 则 x N i ≢ x N j ( m o d p ) x_N^i \not\equiv x_N^j (mod \ p) xNi≡xNj(mod p),则 x N x_N xN 在模 p p p 意义下与 FFT 中的 ω N \omega_N ωN 作用相同,可以代替以避免引入复数和浮点运算。以上就是数论变换(NTT)的简要概括。
关于复数基础知识的简述
令 i = − 1 , ∀ x , y ∈ R i = \sqrt{-1}, \forall x, y \in \mathbb{R} i=−1,∀x,y∈R,有复数 z = x + i y ∈ C z = x + iy \in \mathbb{C} z=x+iy∈C,其中 x x x 称作 z z z 的实部, y y y 称作 z z z 的虚部。特别的,当 x = 0 x = 0 x=0,即 z = i y z = iy z=iy 时, z z z 可被称作纯虚数。还需了解的, z = x + i y z = x + iy z=x+iy 与 z ˉ = x − i y \bar{z} = x - iy zˉ=x−iy 互为共轭复数,满足 z z ˉ = ( x + i y ) ( x − i y ) = x 2 + y 2 z \bar{z} = (x + iy) (x - iy) = x^2 + y^2 zzˉ=(x+iy)(x−iy)=x2+y2(注意,这里两个虚部非零的复数的乘积为一个实数)。定义复数 z = x + i y z = x + iy z=x+iy 的模 ∣ z ∣ = x 2 + y 2 \left| z \right| = \sqrt{x^2 + y^2} ∣z∣=x2+y2,则有公式 z z ˉ = ∣ z ∣ 2 z \bar{z} = \left| z \right| ^2 zzˉ=∣z∣2。
关于复数运算,
∀
z
1
,
z
2
∈
C
,
k
∈
R
\forall z_1, z_2 \in \mathbb{C}, k \in \mathbb{R}
∀z1,z2∈C,k∈R,其中
z
1
=
x
1
+
i
y
1
,
z
2
=
x
2
+
i
y
2
z_1 = x_1 + iy_1, z_2 = x_2 + iy_2
z1=x1+iy1,z2=x2+iy2,有
z
1
+
z
2
=
(
x
1
+
i
y
1
)
+
(
x
2
+
i
y
2
)
=
(
x
1
+
x
2
)
+
i
(
y
1
+
y
2
)
k
z
1
=
k
(
x
1
+
i
y
1
)
=
(
k
x
1
)
+
i
(
k
y
1
)
z_1 + z_2 = (x_1 + iy_1) + (x_2 + iy_2) = (x_1 + x_2) + i(y_1 + y_2) \\ kz_1 = k(x_1 + iy_1) = (kx_1) + i(ky_1)
z1+z2=(x1+iy1)+(x2+iy2)=(x1+x2)+i(y1+y2)kz1=k(x1+iy1)=(kx1)+i(ky1)
特别的,当
k
=
−
1
k = -1
k=−1 时,有
−
z
2
=
−
(
x
2
+
i
y
2
)
=
(
−
x
2
)
+
i
(
−
y
2
)
=
−
x
2
−
i
y
2
z
1
−
z
2
=
(
x
1
+
i
y
1
)
−
(
x
2
+
i
y
2
)
=
(
x
1
−
x
2
)
+
i
(
y
1
−
y
2
)
-z_2 = -(x_2 + iy_2) = (-x_2) + i(-y_2) = -x_2 - iy_2 \\ z_1 - z_2 = (x_1 + iy_1) - (x_2 + iy_2) = (x_1 - x_2) + i(y_1 - y_2)
−z2=−(x2+iy2)=(−x2)+i(−y2)=−x2−iy2z1−z2=(x1+iy1)−(x2+iy2)=(x1−x2)+i(y1−y2)
关于乘除法运算,则利用公式
i
2
=
−
1
i^2 = -1
i2=−1 和
z
z
ˉ
=
∣
z
∣
2
z \bar{z} = \left| z \right| ^2
zzˉ=∣z∣2 化简得
z
1
z
2
=
(
x
1
+
i
y
1
)
(
x
2
+
i
y
2
)
=
x
1
x
2
+
i
x
1
y
2
+
i
y
1
x
2
+
i
2
y
1
y
2
=
(
x
1
x
2
−
y
1
y
2
)
+
i
(
x
1
y
2
+
y
1
x
2
)
z
1
z
2
=
x
1
+
i
y
1
x
2
+
i
y
2
=
(
x
1
+
i
y
1
)
(
x
2
−
i
y
2
)
(
x
2
+
i
y
2
)
(
x
2
−
i
y
2
)
=
(
x
1
x
2
+
y
1
y
2
)
+
i
(
y
1
x
2
−
x
1
y
2
)
x
2
2
+
y
2
2
=
x
1
x
2
+
y
1
y
2
x
2
2
+
y
2
2
+
i
y
1
x
2
−
x
1
y
2
x
2
2
+
y
2
2
z_1 z_2 = (x_1 + iy_1) (x_2 + iy_2) = x_1 x_2 + i x_1 y_2 + i y_1 x_2 + i^2 y_1 y_2 = (x_1 x_2 - y_1 y_2) + i(x_1 y_2 + y_1 x_2) \\ \frac{z_1}{z_2} = \frac{x_1 + iy_1}{x_2 + iy_2} = \frac{(x_1 + iy_1) (x_2 - iy_2)}{(x_2 + iy_2) (x_2 - iy_2)} = \frac{(x_1 x_2 + y_1 y_2) + i(y_1 x_2 - x_1 y_2)}{x_2^2 + y_2^2} = \frac{x_1 x_2 + y_1 y_2}{x_2^2 + y_2^2} + i \frac{y_1 x_2 - x_1 y_2}{x_2^2 + y_2^2}
z1z2=(x1+iy1)(x2+iy2)=x1x2+ix1y2+iy1x2+i2y1y2=(x1x2−y1y2)+i(x1y2+y1x2)z2z1=x2+iy2x1+iy1=(x2+iy2)(x2−iy2)(x1+iy1)(x2−iy2)=x22+y22(x1x2+y1y2)+i(y1x2−x1y2)=x22+y22x1x2+y1y2+ix22+y22y1x2−x1y2
由此可得出,复数域对于四则运算都是封闭的。
在复数坐标系下,任一复数 z = x + i y z = x + iy z=x+iy 等价于从原点 ( 0 , 0 ) (0, 0) (0,0) 到点 ( x , y ) (x, y) (x,y) 的向量,复数加减的几何意义即为对应向量加减,满足三角形法则和平行四边形法则。但为了理解复数乘除的几何意义,我们必须引入复数的指数表示。
对于任一复数
z
=
x
+
i
y
z = x + iy
z=x+iy,都可以转化成其指数表示
z
=
∣
z
∣
e
i
θ
=
e
ln
∣
z
∣
+
i
θ
z = \left| z \right| e^{i \theta} = e^{\ln{\left| z \right|} + i \theta}
z=∣z∣eiθ=eln∣z∣+iθ (其中
e
e
e 为自然对数),其中实数
θ
\theta
θ 满足条件
cos
θ
=
x
x
2
+
y
2
,
sin
θ
=
y
x
2
+
y
2
\cos{\theta} = \frac{x}{\sqrt{x^2 + y^2}}, \sin{\theta} = \frac{y}{\sqrt{x^2 + y^2}}
cosθ=x2+y2x,sinθ=x2+y2y(注意,
ln
∣
z
∣
+
i
θ
\ln{\left| z \right|} + i \theta
ln∣z∣+iθ 是个复数,即域
e
C
e^\mathbb{C}
eC 和复数域
C
\mathbb{C}
C 是等同的。另外,虽然
θ
\theta
θ 可以取遍实数,但值以
2
π
2\pi
2π 为周期)。证明二者的等价性,实际上就是证明欧拉恒等式
e
i
θ
=
cos
θ
+
i
sin
θ
e^{i \theta} = \cos{\theta} + i \sin{\theta}
eiθ=cosθ+isinθ
这里给出一种简明的证法。令
f
(
θ
)
=
e
−
i
θ
(
cos
θ
+
i
sin
θ
)
f(\theta) = e^{-i \theta} (\cos{\theta} + i \sin{\theta})
f(θ)=e−iθ(cosθ+isinθ)
对其求导得
d
d
θ
f
(
θ
)
=
e
−
i
θ
[
−
i
(
cos
θ
+
i
sin
θ
)
+
d
d
θ
(
cos
θ
+
i
sin
θ
)
]
≡
0
\frac{\mathrm{d}}{\mathrm{d} \theta} f(\theta)= e^{-i \theta}\left[-i(\cos{\theta + i \sin{\theta}}) + \frac{\mathrm{d}}{\mathrm{d} \theta} (\cos{\theta} + i \sin{\theta})\right] \equiv 0
dθdf(θ)=e−iθ[−i(cosθ+isinθ)+dθd(cosθ+isinθ)]≡0
即
f
(
θ
)
f(\theta)
f(θ) 为常值函数,而
f
(
0
)
=
1
f(0) = 1
f(0)=1,则有
f
(
θ
)
=
e
−
i
θ
(
cos
θ
+
i
sin
θ
)
≡
1
f(\theta) = e^{-i \theta} (\cos{\theta} + i \sin{\theta}) \equiv 1
f(θ)=e−iθ(cosθ+isinθ)≡1,即有恒等式
e
i
θ
=
cos
θ
+
i
sin
θ
e^{i \theta} = \cos{\theta} + i \sin{\theta}
eiθ=cosθ+isinθ,证毕。
关于
e
i
θ
e^{i \theta}
eiθ 到底如何定义,到目前为止并未给出一个明确答案,上文的证明看起来似乎也只是不严谨地将实数域中
d
d
x
e
k
x
=
k
e
k
x
\frac{\mathrm{d}}{\mathrm{d} x} e^{kx} = k e^{kx}
dxdekx=kekx 的结论扩展到了复数域。但事实上,关于
e
i
θ
e^{i \theta}
eiθ 的定义是基于级数的,而其在定义域上的延拓恰好保证了上述证明的严谨性。在实数域中,有级数
e
θ
=
1
+
θ
+
θ
2
2
+
θ
3
6
+
.
.
.
=
∑
k
=
0
∞
θ
k
k
!
cos
θ
=
1
−
θ
2
2
+
θ
4
24
−
.
.
.
=
∑
k
=
0
∞
(
−
1
)
k
θ
2
k
(
2
k
)
!
sin
θ
=
θ
−
θ
3
6
+
θ
5
120
−
.
.
.
=
∑
k
=
0
∞
(
−
1
)
k
θ
2
k
+
1
(
2
k
+
1
)
!
e^{\theta} = 1 + \theta + \frac{\theta^2}{2} + \frac{\theta^3}{6} + ... = \sum_{k = 0}^\infty \frac{\theta^k}{k!} \\ \cos{\theta} = 1 - \frac{\theta^2}{2} + \frac{\theta^4}{24} - ... = \sum_{k = 0}^\infty \frac{(-1)^k \theta^{2k}}{(2k)!} \\ \sin{\theta} = \theta - \frac{\theta^3}{6} + \frac{\theta^5}{120} - ... = \sum_{k = 0}^\infty \frac{(-1)^k \theta^{2k + 1}}{(2k + 1)!}
eθ=1+θ+2θ2+6θ3+...=k=0∑∞k!θkcosθ=1−2θ2+24θ4−...=k=0∑∞(2k)!(−1)kθ2ksinθ=θ−6θ3+120θ5−...=k=0∑∞(2k+1)!(−1)kθ2k+1
对于虚数
i
θ
i \theta
iθ,类比定义
e
i
θ
e^{i \theta}
eiθ 得
e
i
θ
=
1
+
i
θ
+
(
i
θ
)
2
2
+
(
i
θ
)
3
6
+
.
.
.
=
∑
k
=
0
∞
(
i
θ
)
k
k
!
e^{i \theta} = 1 + i \theta + \frac{(i \theta)^2}{2} + \frac{(i \theta)^3}{6} + ... = \sum_{k = 0}^\infty \frac{(i \theta)^k}{k!}
eiθ=1+iθ+2(iθ)2+6(iθ)3+...=k=0∑∞k!(iθ)k
由于
i
k
+
4
=
i
k
,
i
3
=
−
i
,
i
2
=
−
1
i^{k + 4} = i^k, i^3 = -i, i^2 = -1
ik+4=ik,i3=−i,i2=−1,化简上式得
e
i
θ
=
1
+
i
θ
−
θ
2
2
−
i
θ
3
6
+
.
.
.
=
∑
k
=
0
∞
(
−
1
)
k
[
θ
2
k
(
2
k
)
!
+
i
θ
2
k
+
1
(
2
k
+
1
)
!
]
=
cos
θ
+
i
sin
θ
e^{i \theta} = 1 + i \theta - \frac{\theta^2}{2} - i \frac{\theta^3}{6} + ... = \sum_{k = 0}^\infty (-1)^k \left[\frac{ \theta^{2k}}{(2k)!} + i \frac{\theta^{2k + 1}}{(2k + 1)!}\right] = \cos{\theta} + i \sin{\theta}
eiθ=1+iθ−2θ2−i6θ3+...=k=0∑∞(−1)k[(2k)!θ2k+i(2k+1)!θ2k+1]=cosθ+isinθ
于是,这里用级数再次证明了恒等式。
通过以上证明,得出复数的两种表示是等价的,这样可以用指数表示更容易理解复数乘除的几何意义。在复数坐标系下,任一复数
z
=
∣
z
∣
e
i
θ
z = \left| z \right| e^{i \theta}
z=∣z∣eiθ 对应模长为
∣
z
∣
\left| z \right|
∣z∣,方向为与实正半轴成
θ
\theta
θ 角的向量。将上文中的
z
1
,
z
2
z_1, z_2
z1,z2 转为指数表示
z
1
=
∣
z
1
∣
e
i
θ
1
,
z
2
=
∣
z
2
∣
e
i
θ
2
z_1 = \left| z_1 \right| e^{i \theta_1}, z_2 = \left| z_2 \right| e^{i \theta_2}
z1=∣z1∣eiθ1,z2=∣z2∣eiθ2,则复数乘除运算
z
1
z
2
=
∣
z
1
∣
∣
z
2
∣
e
i
(
θ
1
+
θ
2
)
z
1
z
2
=
∣
z
1
∣
∣
z
2
∣
e
i
(
θ
1
−
θ
2
)
z_1 z_2 = \left| z_1 \right| \left| z_2 \right| e^{i (\theta_1 + \theta_2)} \\ \frac{z_1}{z_2} = \frac{\left| z_1 \right|}{\left| z_2 \right|} e^{i (\theta_1 - \theta_2)}
z1z2=∣z1∣∣z2∣ei(θ1+θ2)z2z1=∣z2∣∣z1∣ei(θ1−θ2)
可见,复数相乘(除),等价于对应向量模长相乘(除),角度相加(减)。
这样,我们解释了上文中方程 ω N = 1 \omega^N = 1 ωN=1 的 N N N 个复根 ω N k = e 2 π i k N = cos 2 π k N + i sin 2 π k N \omega_N^k = e^{\frac{2 \pi i k}{N}} = \cos \frac{2 \pi k}{N} + i \sin \frac{2 \pi k}{N} ωNk=eN2πik=cosN2πk+isinN2πk 所涉及到的复数基础知识。
关于 FFT 分治策略的简述和复杂度分析
以 N = 8 N = 8 N=8 为例,说明 FFT 是怎样利用分治策略将问题规模缩减进行优化的。
令
A
(
x
)
=
a
0
x
0
+
a
1
x
1
+
a
2
x
2
+
a
3
x
3
+
a
4
x
4
+
a
5
x
5
+
a
6
x
6
+
a
7
x
7
A(x) = a_0x^0 + a_1x^1 + a_2x^2 + a_3x^3 + a_4x^4 + a_5x^5 + a_6x^6 + a_7x^7
A(x)=a0x0+a1x1+a2x2+a3x3+a4x4+a5x5+a6x6+a7x7,于是 FFT 算法求多项式
A
(
x
)
A(x)
A(x) 在
ω
8
0
,
ω
8
1
,
ω
8
2
,
ω
8
3
,
ω
8
4
,
ω
8
5
,
ω
8
6
,
ω
8
7
\omega_8^0, \omega_8^1, \omega_8^2, \omega_8^3, \omega_8^4, \omega_8^5, \omega_8^6, \omega_8^7
ω80,ω81,ω82,ω83,ω84,ω85,ω86,ω87 处的取值。
A
(
ω
8
0
)
=
a
0
(
ω
8
0
)
0
+
a
1
(
ω
8
0
)
1
+
a
2
(
ω
8
0
)
2
+
a
3
(
ω
8
0
)
3
+
a
4
(
ω
8
0
)
4
+
a
5
(
ω
8
0
)
5
+
a
6
(
ω
8
0
)
6
+
a
7
(
ω
8
0
)
7
A
(
ω
8
1
)
=
a
0
(
ω
8
1
)
0
+
a
1
(
ω
8
1
)
1
+
a
2
(
ω
8
1
)
2
+
a
3
(
ω
8
1
)
3
+
a
4
(
ω
8
1
)
4
+
a
5
(
ω
8
1
)
5
+
a
6
(
ω
8
1
)
6
+
a
7
(
ω
8
1
)
7
A
(
ω
8
2
)
=
a
0
(
ω
8
2
)
0
+
a
1
(
ω
8
2
)
1
+
a
2
(
ω
8
2
)
2
+
a
3
(
ω
8
2
)
3
+
a
4
(
ω
8
2
)
4
+
a
5
(
ω
8
2
)
5
+
a
6
(
ω
8
2
)
6
+
a
7
(
ω
8
2
)
7
A
(
ω
8
3
)
=
a
0
(
ω
8
3
)
0
+
a
1
(
ω
8
3
)
1
+
a
2
(
ω
8
3
)
2
+
a
3
(
ω
8
3
)
3
+
a
4
(
ω
8
3
)
4
+
a
5
(
ω
8
3
)
5
+
a
6
(
ω
8
3
)
6
+
a
7
(
ω
8
3
)
7
A
(
ω
8
4
)
=
a
0
(
ω
8
4
)
0
+
a
1
(
ω
8
4
)
1
+
a
2
(
ω
8
4
)
2
+
a
3
(
ω
8
4
)
3
+
a
4
(
ω
8
4
)
4
+
a
5
(
ω
8
4
)
5
+
a
6
(
ω
8
4
)
6
+
a
7
(
ω
8
4
)
7
A
(
ω
8
5
)
=
a
0
(
ω
8
5
)
0
+
a
1
(
ω
8
5
)
1
+
a
2
(
ω
8
5
)
2
+
a
3
(
ω
8
5
)
3
+
a
4
(
ω
8
5
)
4
+
a
5
(
ω
8
5
)
5
+
a
6
(
ω
8
5
)
6
+
a
7
(
ω
8
5
)
7
A
(
ω
8
6
)
=
a
0
(
ω
8
6
)
0
+
a
1
(
ω
8
6
)
1
+
a
2
(
ω
8
6
)
2
+
a
3
(
ω
8
6
)
3
+
a
4
(
ω
8
6
)
4
+
a
5
(
ω
8
6
)
5
+
a
6
(
ω
8
6
)
6
+
a
7
(
ω
8
6
)
7
A
(
ω
8
7
)
=
a
0
(
ω
8
7
)
0
+
a
1
(
ω
8
7
)
1
+
a
2
(
ω
8
7
)
2
+
a
3
(
ω
8
7
)
3
+
a
4
(
ω
8
7
)
4
+
a
5
(
ω
8
7
)
5
+
a
6
(
ω
8
7
)
6
+
a
7
(
ω
8
7
)
7
A(\omega_8^0) = a_0(\omega_8^0)^0 + a_1(\omega_8^0)^1 + a_2(\omega_8^0)^2 + a_3(\omega_8^0)^3 + a_4(\omega_8^0)^4 + a_5(\omega_8^0)^5 + a_6(\omega_8^0)^6 + a_7(\omega_8^0)^7 \\ A(\omega_8^1) = a_0(\omega_8^1)^0 + a_1(\omega_8^1)^1 + a_2(\omega_8^1)^2 + a_3(\omega_8^1)^3 + a_4(\omega_8^1)^4 + a_5(\omega_8^1)^5 + a_6(\omega_8^1)^6 + a_7(\omega_8^1)^7 \\ A(\omega_8^2) = a_0(\omega_8^2)^0 + a_1(\omega_8^2)^1 + a_2(\omega_8^2)^2 + a_3(\omega_8^2)^3 + a_4(\omega_8^2)^4 + a_5(\omega_8^2)^5 + a_6(\omega_8^2)^6 + a_7(\omega_8^2)^7 \\ A(\omega_8^3) = a_0(\omega_8^3)^0 + a_1(\omega_8^3)^1 + a_2(\omega_8^3)^2 + a_3(\omega_8^3)^3 + a_4(\omega_8^3)^4 + a_5(\omega_8^3)^5 + a_6(\omega_8^3)^6 + a_7(\omega_8^3)^7 \\ A(\omega_8^4) = a_0(\omega_8^4)^0 + a_1(\omega_8^4)^1 + a_2(\omega_8^4)^2 + a_3(\omega_8^4)^3 + a_4(\omega_8^4)^4 + a_5(\omega_8^4)^5 + a_6(\omega_8^4)^6 + a_7(\omega_8^4)^7 \\ A(\omega_8^5) = a_0(\omega_8^5)^0 + a_1(\omega_8^5)^1 + a_2(\omega_8^5)^2 + a_3(\omega_8^5)^3 + a_4(\omega_8^5)^4 + a_5(\omega_8^5)^5 + a_6(\omega_8^5)^6 + a_7(\omega_8^5)^7 \\ A(\omega_8^6) = a_0(\omega_8^6)^0 + a_1(\omega_8^6)^1 + a_2(\omega_8^6)^2 + a_3(\omega_8^6)^3 + a_4(\omega_8^6)^4 + a_5(\omega_8^6)^5 + a_6(\omega_8^6)^6 + a_7(\omega_8^6)^7 \\ A(\omega_8^7) = a_0(\omega_8^7)^0 + a_1(\omega_8^7)^1 + a_2(\omega_8^7)^2 + a_3(\omega_8^7)^3 + a_4(\omega_8^7)^4 + a_5(\omega_8^7)^5 + a_6(\omega_8^7)^6 + a_7(\omega_8^7)^7 \\
A(ω80)=a0(ω80)0+a1(ω80)1+a2(ω80)2+a3(ω80)3+a4(ω80)4+a5(ω80)5+a6(ω80)6+a7(ω80)7A(ω81)=a0(ω81)0+a1(ω81)1+a2(ω81)2+a3(ω81)3+a4(ω81)4+a5(ω81)5+a6(ω81)6+a7(ω81)7A(ω82)=a0(ω82)0+a1(ω82)1+a2(ω82)2+a3(ω82)3+a4(ω82)4+a5(ω82)5+a6(ω82)6+a7(ω82)7A(ω83)=a0(ω83)0+a1(ω83)1+a2(ω83)2+a3(ω83)3+a4(ω83)4+a5(ω83)5+a6(ω83)6+a7(ω83)7A(ω84)=a0(ω84)0+a1(ω84)1+a2(ω84)2+a3(ω84)3+a4(ω84)4+a5(ω84)5+a6(ω84)6+a7(ω84)7A(ω85)=a0(ω85)0+a1(ω85)1+a2(ω85)2+a3(ω85)3+a4(ω85)4+a5(ω85)5+a6(ω85)6+a7(ω85)7A(ω86)=a0(ω86)0+a1(ω86)1+a2(ω86)2+a3(ω86)3+a4(ω86)4+a5(ω86)5+a6(ω86)6+a7(ω86)7A(ω87)=a0(ω87)0+a1(ω87)1+a2(ω87)2+a3(ω87)3+a4(ω87)4+a5(ω87)5+a6(ω87)6+a7(ω87)7
由于
ω
8
4
=
ω
2
1
=
−
1
\omega_8^4 = \omega_2^1 = -1
ω84=ω21=−1,故
∀
k
∈
{
0
,
1
,
2
,
3
}
,
ω
8
4
+
k
=
−
ω
8
k
\forall k \in \{0, 1, 2, 3\}, \omega_8^{4 + k} = -\omega_8^k
∀k∈{0,1,2,3},ω84+k=−ω8k,有
(
ω
8
4
+
k
)
m
=
{
(
ω
8
k
)
m
m
=
2
t
−
(
ω
8
k
)
m
m
=
2
t
+
1
(\omega_8^{4+k})^m = \left\{\begin{aligned} (\omega_8^k)^m & \quad m = 2t \\ -(\omega_8^k)^m & \quad m = 2t+1 \\ \end{aligned}\right.
(ω84+k)m={(ω8k)m−(ω8k)mm=2tm=2t+1
将
ω
8
4
,
ω
8
5
,
ω
8
6
,
ω
8
7
\omega_8^4, \omega_8^5, \omega_8^6, \omega_8^7
ω84,ω85,ω86,ω87 代换成
ω
8
0
,
ω
8
1
,
ω
8
2
,
ω
8
3
\omega_8^0, \omega_8^1, \omega_8^2, \omega_8^3
ω80,ω81,ω82,ω83,并分类得
A
(
ω
8
0
)
=
[
a
0
(
ω
8
0
)
0
+
a
2
(
ω
8
0
)
2
+
a
4
(
ω
8
0
)
4
+
a
6
(
ω
8
0
)
6
]
+
[
a
1
(
ω
8
0
)
1
+
a
3
(
ω
8
0
)
3
+
a
5
(
ω
8
0
)
5
+
a
7
(
ω
8
0
)
7
]
A
(
ω
8
4
)
=
[
a
0
(
ω
8
0
)
0
+
a
2
(
ω
8
0
)
2
+
a
4
(
ω
8
0
)
4
+
a
6
(
ω
8
0
)
6
]
−
[
a
1
(
ω
8
0
)
1
+
a
3
(
ω
8
0
)
3
+
a
5
(
ω
8
0
)
5
+
a
7
(
ω
8
0
)
7
]
A
(
ω
8
1
)
=
[
a
0
(
ω
8
1
)
0
+
a
2
(
ω
8
1
)
2
+
a
4
(
ω
8
1
)
4
+
a
6
(
ω
8
1
)
6
]
+
[
a
1
(
ω
8
1
)
1
+
a
3
(
ω
8
1
)
3
+
a
5
(
ω
8
1
)
5
+
a
7
(
ω
8
1
)
7
]
A
(
ω
8
5
)
=
[
a
0
(
ω
8
1
)
0
+
a
2
(
ω
8
1
)
2
+
a
4
(
ω
8
1
)
4
+
a
6
(
ω
8
1
)
6
]
−
[
a
1
(
ω
8
1
)
1
+
a
3
(
ω
8
1
)
3
+
a
5
(
ω
8
1
)
5
+
a
7
(
ω
8
1
)
7
]
A
(
ω
8
2
)
=
[
a
0
(
ω
8
2
)
0
+
a
2
(
ω
8
2
)
2
+
a
4
(
ω
8
2
)
4
+
a
6
(
ω
8
2
)
6
]
+
[
a
1
(
ω
8
2
)
1
+
a
3
(
ω
8
2
)
3
+
a
5
(
ω
8
2
)
5
+
a
7
(
ω
8
2
)
7
]
A
(
ω
8
6
)
=
[
a
0
(
ω
8
2
)
0
+
a
2
(
ω
8
2
)
2
+
a
4
(
ω
8
2
)
4
+
a
6
(
ω
8
2
)
6
]
−
[
a
1
(
ω
8
2
)
1
+
a
3
(
ω
8
2
)
3
+
a
5
(
ω
8
2
)
5
+
a
7
(
ω
8
2
)
7
]
A
(
ω
8
3
)
=
[
a
0
(
ω
8
3
)
0
+
a
2
(
ω
8
3
)
2
+
a
4
(
ω
8
3
)
4
+
a
6
(
ω
8
3
)
6
]
+
[
a
1
(
ω
8
3
)
1
+
a
3
(
ω
8
3
)
3
+
a
5
(
ω
8
3
)
5
+
a
7
(
ω
8
3
)
7
]
A
(
ω
8
7
)
=
[
a
0
(
ω
8
3
)
0
+
a
2
(
ω
8
3
)
2
+
a
4
(
ω
8
3
)
4
+
a
6
(
ω
8
3
)
6
]
−
[
a
1
(
ω
8
3
)
1
+
a
3
(
ω
8
3
)
3
+
a
5
(
ω
8
3
)
5
+
a
7
(
ω
8
3
)
7
]
A(\omega_8^0) = \left[a_0(\omega_8^0)^0 + a_2(\omega_8^0)^2 + a_4(\omega_8^0)^4 + a_6(\omega_8^0)^6 \right] + \left[a_1(\omega_8^0)^1 + a_3(\omega_8^0)^3 + a_5(\omega_8^0)^5 + a_7(\omega_8^0)^7 \right] \\ A(\omega_8^4) = \left[a_0(\omega_8^0)^0 + a_2(\omega_8^0)^2 + a_4(\omega_8^0)^4 + a_6(\omega_8^0)^6 \right] - \left[a_1(\omega_8^0)^1 + a_3(\omega_8^0)^3 + a_5(\omega_8^0)^5 + a_7(\omega_8^0)^7 \right] \\ ~\\ A(\omega_8^1) = \left[a_0(\omega_8^1)^0 + a_2(\omega_8^1)^2 + a_4(\omega_8^1)^4 + a_6(\omega_8^1)^6 \right] + \left[a_1(\omega_8^1)^1 + a_3(\omega_8^1)^3 + a_5(\omega_8^1)^5 + a_7(\omega_8^1)^7 \right] \\ A(\omega_8^5) = \left[a_0(\omega_8^1)^0 + a_2(\omega_8^1)^2 + a_4(\omega_8^1)^4 + a_6(\omega_8^1)^6 \right] - \left[a_1(\omega_8^1)^1 + a_3(\omega_8^1)^3 + a_5(\omega_8^1)^5 + a_7(\omega_8^1)^7 \right] \\ ~\\ A(\omega_8^2) = \left[a_0(\omega_8^2)^0 + a_2(\omega_8^2)^2 + a_4(\omega_8^2)^4 + a_6(\omega_8^2)^6 \right] + \left[a_1(\omega_8^2)^1 + a_3(\omega_8^2)^3 + a_5(\omega_8^2)^5 + a_7(\omega_8^2)^7 \right] \\ A(\omega_8^6) = \left[a_0(\omega_8^2)^0 + a_2(\omega_8^2)^2 + a_4(\omega_8^2)^4 + a_6(\omega_8^2)^6 \right] - \left[a_1(\omega_8^2)^1 + a_3(\omega_8^2)^3 + a_5(\omega_8^2)^5 + a_7(\omega_8^2)^7 \right] \\ ~\\ A(\omega_8^3) = \left[a_0(\omega_8^3)^0 + a_2(\omega_8^3)^2 + a_4(\omega_8^3)^4 + a_6(\omega_8^3)^6 \right] + \left[a_1(\omega_8^3)^1 + a_3(\omega_8^3)^3 + a_5(\omega_8^3)^5 + a_7(\omega_8^3)^7 \right] \\ A(\omega_8^7) = \left[a_0(\omega_8^3)^0 + a_2(\omega_8^3)^2 + a_4(\omega_8^3)^4 + a_6(\omega_8^3)^6 \right] - \left[a_1(\omega_8^3)^1 + a_3(\omega_8^3)^3 + a_5(\omega_8^3)^5 + a_7(\omega_8^3)^7 \right] \\
A(ω80)=[a0(ω80)0+a2(ω80)2+a4(ω80)4+a6(ω80)6]+[a1(ω80)1+a3(ω80)3+a5(ω80)5+a7(ω80)7]A(ω84)=[a0(ω80)0+a2(ω80)2+a4(ω80)4+a6(ω80)6]−[a1(ω80)1+a3(ω80)3+a5(ω80)5+a7(ω80)7] A(ω81)=[a0(ω81)0+a2(ω81)2+a4(ω81)4+a6(ω81)6]+[a1(ω81)1+a3(ω81)3+a5(ω81)5+a7(ω81)7]A(ω85)=[a0(ω81)0+a2(ω81)2+a4(ω81)4+a6(ω81)6]−[a1(ω81)1+a3(ω81)3+a5(ω81)5+a7(ω81)7] A(ω82)=[a0(ω82)0+a2(ω82)2+a4(ω82)4+a6(ω82)6]+[a1(ω82)1+a3(ω82)3+a5(ω82)5+a7(ω82)7]A(ω86)=[a0(ω82)0+a2(ω82)2+a4(ω82)4+a6(ω82)6]−[a1(ω82)1+a3(ω82)3+a5(ω82)5+a7(ω82)7] A(ω83)=[a0(ω83)0+a2(ω83)2+a4(ω83)4+a6(ω83)6]+[a1(ω83)1+a3(ω83)3+a5(ω83)5+a7(ω83)7]A(ω87)=[a0(ω83)0+a2(ω83)2+a4(ω83)4+a6(ω83)6]−[a1(ω83)1+a3(ω83)3+a5(ω83)5+a7(ω83)7]
再由公式
(
ω
8
k
)
2
m
=
(
ω
4
k
)
m
(\omega_8^k)^{2m} = (\omega_4^k)^m
(ω8k)2m=(ω4k)m,带入得
A
(
ω
8
0
)
=
[
a
0
(
ω
4
0
)
0
+
a
2
(
ω
4
0
)
1
+
a
4
(
ω
4
0
)
2
+
a
6
(
ω
4
0
)
3
]
+
ω
8
0
[
a
1
(
ω
4
0
)
0
+
a
3
(
ω
4
0
)
1
+
a
5
(
ω
4
0
)
2
+
a
7
(
ω
4
0
)
3
]
A
(
ω
8
4
)
=
[
a
0
(
ω
4
0
)
0
+
a
2
(
ω
4
0
)
1
+
a
4
(
ω
4
0
)
2
+
a
6
(
ω
4
0
)
3
]
−
ω
8
0
[
a
1
(
ω
4
0
)
0
+
a
3
(
ω
4
0
)
1
+
a
5
(
ω
4
0
)
2
+
a
7
(
ω
4
0
)
3
]
A
(
ω
8
1
)
=
[
a
0
(
ω
4
1
)
0
+
a
2
(
ω
4
1
)
1
+
a
4
(
ω
4
1
)
2
+
a
6
(
ω
4
1
)
3
]
+
ω
8
1
[
a
1
(
ω
4
1
)
0
+
a
3
(
ω
4
1
)
1
+
a
5
(
ω
4
1
)
2
+
a
7
(
ω
4
1
)
3
]
A
(
ω
8
5
)
=
[
a
0
(
ω
4
1
)
0
+
a
2
(
ω
4
1
)
1
+
a
4
(
ω
4
1
)
2
+
a
6
(
ω
4
1
)
3
]
−
ω
8
1
[
a
1
(
ω
4
1
)
0
+
a
3
(
ω
4
1
)
1
+
a
5
(
ω
4
1
)
2
+
a
7
(
ω
4
1
)
3
]
A
(
ω
8
2
)
=
[
a
0
(
ω
4
2
)
0
+
a
2
(
ω
4
2
)
1
+
a
4
(
ω
4
2
)
2
+
a
6
(
ω
4
2
)
3
]
+
ω
8
2
[
a
1
(
ω
4
2
)
0
+
a
3
(
ω
4
2
)
1
+
a
5
(
ω
4
2
)
2
+
a
7
(
ω
4
2
)
3
]
A
(
ω
8
6
)
=
[
a
0
(
ω
4
2
)
0
+
a
2
(
ω
4
2
)
1
+
a
4
(
ω
4
2
)
2
+
a
6
(
ω
4
2
)
3
]
−
ω
8
2
[
a
1
(
ω
4
2
)
0
+
a
3
(
ω
4
2
)
1
+
a
5
(
ω
4
2
)
2
+
a
7
(
ω
4
2
)
3
]
A
(
ω
8
3
)
=
[
a
0
(
ω
4
3
)
0
+
a
2
(
ω
4
3
)
1
+
a
4
(
ω
4
3
)
2
+
a
6
(
ω
4
3
)
3
]
+
ω
8
3
[
a
1
(
ω
4
3
)
0
+
a
3
(
ω
4
3
)
1
+
a
5
(
ω
4
3
)
2
+
a
7
(
ω
4
3
)
3
]
A
(
ω
8
7
)
=
[
a
0
(
ω
4
3
)
0
+
a
2
(
ω
4
3
)
1
+
a
4
(
ω
4
3
)
2
+
a
6
(
ω
4
3
)
3
]
−
ω
8
3
[
a
1
(
ω
4
3
)
0
+
a
3
(
ω
4
3
)
1
+
a
5
(
ω
4
3
)
2
+
a
7
(
ω
4
3
)
3
]
A(\omega_8^0) = \left[a_0(\omega_4^0)^0 + a_2(\omega_4^0)^1 + a_4(\omega_4^0)^2 + a_6(\omega_4^0)^3 \right] + \omega_8^0 \left[a_1(\omega_4^0)^0 + a_3(\omega_4^0)^1 + a_5(\omega_4^0)^2 + a_7(\omega_4^0)^3 \right] \\ A(\omega_8^4) = \left[a_0(\omega_4^0)^0 + a_2(\omega_4^0)^1 + a_4(\omega_4^0)^2 + a_6(\omega_4^0)^3 \right] - \omega_8^0 \left[a_1(\omega_4^0)^0 + a_3(\omega_4^0)^1 + a_5(\omega_4^0)^2 + a_7(\omega_4^0)^3 \right] \\ ~\\ A(\omega_8^1) = \left[a_0(\omega_4^1)^0 + a_2(\omega_4^1)^1 + a_4(\omega_4^1)^2 + a_6(\omega_4^1)^3 \right] + \omega_8^1 \left[a_1(\omega_4^1)^0 + a_3(\omega_4^1)^1 + a_5(\omega_4^1)^2 + a_7(\omega_4^1)^3 \right] \\ A(\omega_8^5) = \left[a_0(\omega_4^1)^0 + a_2(\omega_4^1)^1 + a_4(\omega_4^1)^2 + a_6(\omega_4^1)^3 \right] - \omega_8^1 \left[a_1(\omega_4^1)^0 + a_3(\omega_4^1)^1 + a_5(\omega_4^1)^2 + a_7(\omega_4^1)^3 \right] \\ ~\\ A(\omega_8^2) = \left[a_0(\omega_4^2)^0 + a_2(\omega_4^2)^1 + a_4(\omega_4^2)^2 + a_6(\omega_4^2)^3 \right] + \omega_8^2 \left[a_1(\omega_4^2)^0 + a_3(\omega_4^2)^1 + a_5(\omega_4^2)^2 + a_7(\omega_4^2)^3 \right] \\ A(\omega_8^6) = \left[a_0(\omega_4^2)^0 + a_2(\omega_4^2)^1 + a_4(\omega_4^2)^2 + a_6(\omega_4^2)^3 \right] - \omega_8^2 \left[a_1(\omega_4^2)^0 + a_3(\omega_4^2)^1 + a_5(\omega_4^2)^2 + a_7(\omega_4^2)^3 \right] \\ ~\\ A(\omega_8^3) = \left[a_0(\omega_4^3)^0 + a_2(\omega_4^3)^1 + a_4(\omega_4^3)^2 + a_6(\omega_4^3)^3 \right] + \omega_8^3 \left[a_1(\omega_4^3)^0 + a_3(\omega_4^3)^1 + a_5(\omega_4^3)^2 + a_7(\omega_4^3)^3 \right] \\ A(\omega_8^7) = \left[a_0(\omega_4^3)^0 + a_2(\omega_4^3)^1 + a_4(\omega_4^3)^2 + a_6(\omega_4^3)^3 \right] - \omega_8^3 \left[a_1(\omega_4^3)^0 + a_3(\omega_4^3)^1 + a_5(\omega_4^3)^2 + a_7(\omega_4^3)^3 \right] \\
A(ω80)=[a0(ω40)0+a2(ω40)1+a4(ω40)2+a6(ω40)3]+ω80[a1(ω40)0+a3(ω40)1+a5(ω40)2+a7(ω40)3]A(ω84)=[a0(ω40)0+a2(ω40)1+a4(ω40)2+a6(ω40)3]−ω80[a1(ω40)0+a3(ω40)1+a5(ω40)2+a7(ω40)3] A(ω81)=[a0(ω41)0+a2(ω41)1+a4(ω41)2+a6(ω41)3]+ω81[a1(ω41)0+a3(ω41)1+a5(ω41)2+a7(ω41)3]A(ω85)=[a0(ω41)0+a2(ω41)1+a4(ω41)2+a6(ω41)3]−ω81[a1(ω41)0+a3(ω41)1+a5(ω41)2+a7(ω41)3] A(ω82)=[a0(ω42)0+a2(ω42)1+a4(ω42)2+a6(ω42)3]+ω82[a1(ω42)0+a3(ω42)1+a5(ω42)2+a7(ω42)3]A(ω86)=[a0(ω42)0+a2(ω42)1+a4(ω42)2+a6(ω42)3]−ω82[a1(ω42)0+a3(ω42)1+a5(ω42)2+a7(ω42)3] A(ω83)=[a0(ω43)0+a2(ω43)1+a4(ω43)2+a6(ω43)3]+ω83[a1(ω43)0+a3(ω43)1+a5(ω43)2+a7(ω43)3]A(ω87)=[a0(ω43)0+a2(ω43)1+a4(ω43)2+a6(ω43)3]−ω83[a1(ω43)0+a3(ω43)1+a5(ω43)2+a7(ω43)3]
设
A
[
0
]
(
x
)
=
a
0
x
0
+
a
2
x
1
+
a
4
x
2
+
a
6
x
3
,
A
[
1
]
(
x
)
=
a
1
x
0
+
a
3
x
1
+
a
5
x
2
+
a
7
x
3
A^{[0]}(x) = a_0x^0 + a_2x^1 + a_4x^2 + a_6x^3, A^{[1]}(x) = a_1x^0 + a_3x^1 + a_5x^2 + a_7x^3
A[0](x)=a0x0+a2x1+a4x2+a6x3,A[1](x)=a1x0+a3x1+a5x2+a7x3,则有
A
(
ω
8
0
)
=
A
[
0
]
(
ω
4
0
)
+
ω
8
0
A
[
1
]
(
ω
4
0
)
A
(
ω
8
4
)
=
A
[
0
]
(
ω
4
0
)
−
ω
8
0
A
[
1
]
(
ω
4
0
)
A
(
ω
8
1
)
=
A
[
0
]
(
ω
4
1
)
+
ω
8
1
A
[
1
]
(
ω
4
1
)
A
(
ω
8
5
)
=
A
[
0
]
(
ω
4
1
)
−
ω
8
1
A
[
1
]
(
ω
4
1
)
A
(
ω
8
2
)
=
A
[
0
]
(
ω
4
2
)
+
ω
8
2
A
[
1
]
(
ω
4
2
)
A
(
ω
8
6
)
=
A
[
0
]
(
ω
4
2
)
−
ω
8
2
A
[
1
]
(
ω
4
2
)
A
(
ω
8
3
)
=
A
[
0
]
(
ω
4
3
)
+
ω
8
3
A
[
1
]
(
ω
4
3
)
A
(
ω
8
7
)
=
A
[
0
]
(
ω
4
3
)
−
ω
8
3
A
[
1
]
(
ω
4
3
)
A(\omega_8^0) = A^{[0]}(\omega_4^0) + \omega_8^0 A^{[1]}(\omega_4^0) \\ A(\omega_8^4) = A^{[0]}(\omega_4^0) - \omega_8^0 A^{[1]}(\omega_4^0) \\ ~\\ A(\omega_8^1) = A^{[0]}(\omega_4^1) + \omega_8^1 A^{[1]}(\omega_4^1) \\ A(\omega_8^5) = A^{[0]}(\omega_4^1) - \omega_8^1 A^{[1]}(\omega_4^1) \\ ~\\ A(\omega_8^2) = A^{[0]}(\omega_4^2) + \omega_8^2 A^{[1]}(\omega_4^2) \\ A(\omega_8^6) = A^{[0]}(\omega_4^2) - \omega_8^2 A^{[1]}(\omega_4^2) \\ ~\\ A(\omega_8^3) = A^{[0]}(\omega_4^3) + \omega_8^3 A^{[1]}(\omega_4^3) \\ A(\omega_8^7) = A^{[0]}(\omega_4^3) - \omega_8^3 A^{[1]}(\omega_4^3) \\
A(ω80)=A[0](ω40)+ω80A[1](ω40)A(ω84)=A[0](ω40)−ω80A[1](ω40) A(ω81)=A[0](ω41)+ω81A[1](ω41)A(ω85)=A[0](ω41)−ω81A[1](ω41) A(ω82)=A[0](ω42)+ω82A[1](ω42)A(ω86)=A[0](ω42)−ω82A[1](ω42) A(ω83)=A[0](ω43)+ω83A[1](ω43)A(ω87)=A[0](ω43)−ω83A[1](ω43)
经过以上步骤,问题转化成了求多项式 A [ 0 ] ( x ) A^{[0]}(x) A[0](x) 在 ω 4 0 , ω 4 1 , ω 4 2 , ω 4 3 \omega_4^0, \omega_4^1, \omega_4^2, \omega_4^3 ω40,ω41,ω42,ω43 处的取值和多项式 A [ 1 ] ( x ) A^{[1]}(x) A[1](x) 在 ω 4 0 , ω 4 1 , ω 4 2 , ω 4 3 \omega_4^0, \omega_4^1, \omega_4^2, \omega_4^3 ω40,ω41,ω42,ω43 两个子问题,而子问题和原问题本质上是同一个问题的不同规模情境。对于一个规模为 N N N 的问题,FFT 算法经过以上一次迭代将其分解为两个规模为 N 2 \frac{N}{2} 2N 的问题和 N N N 次简单加减运算,用时间公式表示为 T ( N ) = 2 T ( N 2 ) + N T(N) = 2T(\frac{N}{2}) + N T(N)=2T(2N)+N,解得 T ( N ) = Θ ( N log N ) T(N) = \Theta(N \log N) T(N)=Θ(NlogN)。
另外需注意,以上分析过程是自顶而下的,但实际 FFT 实现是自底而上的,并且额外空间复杂度为 O ( 1 ) O(1) O(1)。具体实现过程见上文代码,此处不再赘述。
关于 NTT 的举例简述
以模数 998244353 为例,简述 NTT 与 FFT 的异同。
998244353 的原根为 3,这意味着 3 998244352 ≡ 1 ( m o d 998244353 ) 3^{998244352} \equiv 1 (mod \ 998244353) 3998244352≡1(mod 998244353) 并且在模 998244353 意义下集合 { 3 0 , 3 1 , . . . , 3 998244351 } \{3^0, 3^1, ..., 3^{998244351}\} {30,31,...,3998244351} 中的元素与集合 { 1 , 2 , . . . , 998244352 } \{1, 2, ..., 998244352\} {1,2,...,998244352} 中的元素一一对应(如 3 0 3^0 30 对应 1 1 1, 3 1 3^1 31 对应 3 3 3, 3 2 3^2 32 对应 9 9 9 等等),这说明在模 998244353 意义下 3 的作用和 FFT 中的 ω 998244352 \omega_{998244352} ω998244352 等价。考虑到 FFT 算法要求 N N N 必须是 2 的正整数幂,而 998244352 = 7 ∗ 17 ∗ 2 23 = 119 ∗ 2 23 998244352 = 7 * 17 * 2^{23} = 119 * 2^{23} 998244352=7∗17∗223=119∗223,所以 NTT 算法在模数 998244353 下处理多项式的次数上限就是 2 23 2^{23} 223,这点不同于 FFT 算法,因为 FFT 的理论上限是无限,或者说受限于机器数的精度表示。
具体来说,当处理 N = 2 l N = 2^l N=2l 规模的数据时( l ≤ 23 l \leq 23 l≤23),NTT 算法使用的单位根为 x = 3 998244352 N = 3 119 ∗ 2 23 − l ( m o d 998244353 ) x = 3^\frac{998244352}{N} = 3^{119 * 2^{23 - l}}(mod \ 998244353) x=3N998244352=3119∗223−l(mod 998244353),这样可以保证 x N ≡ 1 ( m o d 998244353 ) x ^ N \equiv 1 (mod \ 998244353) xN≡1(mod 998244353) 并且 x 0 , x 1 , . . . , x N − 1 x^0, x^1, ..., x^{N-1} x0,x1,...,xN−1 在模 998244353 下各不相等。与之相对的,由于 3 和 332748118 在模 998244353 下互逆,在进行点值转回系数时,使用的单位逆根为 x − 1 = 33274811 8 998244352 N = 33274811 8 119 ∗ 2 23 − l ( m o d 998244353 ) x^{-1} = 332748118^\frac{998244352}{N} = 332748118^{119 * 2^{23 - l}}(mod \ 998244353) x−1=332748118N998244352=332748118119∗223−l(mod 998244353)。