多项式乘法问题的快速傅里叶变换算法简述

问题:给定多项式 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=0iajbij,时间复杂度 O ( n 2 ) O(n^2) O(n2)

多项式乘法的快速傅里叶变换(FFT)算法:
第一步,找到最小的 N N N,满足 N ≥ n + m N \geq n + m Nn+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} xN1 项为止,至此 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,..,aN1 转化为 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(ωNN1),其中所取的 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) xN1(mod p) 的同构性,若 ∃ x N ∈ [ 1 , p − 1 ] \exist x_N \in [1, p - 1] xN[1,p1] 使得 x N N ≡ 1 ( m o d   p ) x_N^N \equiv 1 (mod \ p) xNN1(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) xNixNj(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,yR,有复数 z = x + i y ∈ C z = x + iy \in \mathbb{C} z=x+iyC,其中 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ˉ=xiy 互为共轭复数,满足 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)(xiy)=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ˉ=z2

关于复数运算, ∀ z 1 , z 2 ∈ C , k ∈ R \forall z_1, z_2 \in \mathbb{C}, k \in \mathbb{R} z1,z2C,kR,其中 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)=x2iy2z1z2=(x1+iy1)(x2+iy2)=(x1x2)+i(y1y2)
关于乘除法运算,则利用公式 i 2 = − 1 i^2 = -1 i2=1 z z ˉ = ∣ z ∣ 2 z \bar{z} = \left| z \right| ^2 zzˉ=z2 化简得
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=(x1x2y1y2)+i(x1y2+y1x2)z2z1=x2+iy2x1+iy1=(x2+iy2)(x2iy2)(x1+iy1)(x2iy2)=x22+y22(x1x2+y1y2)+i(y1x2x1y2)=x22+y22x1x2+y1y2+ix22+y22y1x2x1y2
由此可得出,复数域对于四则运算都是封闭的。

在复数坐标系下,任一复数 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=zeiθ=elnz+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+y2 x,sinθ=x2+y2 y(注意, ln ⁡ ∣ z ∣ + i θ \ln{\left| z \right|} + i \theta lnz+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(θ)=eiθ(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(θ)=eiθ[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(θ)=eiθ(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=0k!θkcosθ=12θ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=0k!(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θ2i6θ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=zeiθ 对应模长为 ∣ 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=z1eiθ1,z2=z2eiθ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=z1z2ei(θ1+θ2)z2z1=z2z1ei(θ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) 39982443521(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=717223=119223,所以 NTT 算法在模数 998244353 下处理多项式的次数上限就是 2 23 2^{23} 223,这点不同于 FFT 算法,因为 FFT 的理论上限是无限,或者说受限于机器数的精度表示。

具体来说,当处理 N = 2 l N = 2^l N=2l 规模的数据时( l ≤ 23 l \leq 23 l23),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=3119223l(mod 998244353),这样可以保证 x N ≡ 1 ( m o d   998244353 ) x ^ N \equiv 1 (mod \ 998244353) xN1(mod 998244353) 并且 x 0 , x 1 , . . . , x N − 1 x^0, x^1, ..., x^{N-1} x0,x1,...,xN1 在模 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) x1=332748118N998244352=332748118119223l(mod 998244353)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值