提示:Kyber中的NTT(Number Theoretic Transforms)
NTT(Number Theoretic Transforms)(一)
前言
数论变换(number-theoretic transform, NTT)是离散傅里叶变换(DFT)在数论基础上的实现;快速数论变换(fast number-theoretic transform, FNTT)是 快速傅里叶变换(FFT)在数论基础上的实现。针对具有代数结构的格密码算法,其中的多项式乘法为主要的核心算子,目前多数具有代数结构的格密码算法均通过NTT进行多项式乘法加速。本文以NIST公布的标准算法Kyber为例,以此介绍NTT算法的实现原理。
一、中国剩余定理(CRT)
Kyber中的多项式乘法均取自多项式环
R
q
=
Z
q
/
(
x
n
+
1
)
R_q=\Z_q/(x^{n}+1)
Rq=Zq/(xn+1),其中第三轮的Kyber中
q
=
3329
=
2
8
+
1
q=3329=2^8+1
q=3329=28+1,
n
=
256
n=256
n=256。由于
256
∣
∣
(
q
−
1
)
256||(q-1)
256∣∣(q−1),所以有限域
Z
q
\Z_q
Zq中存在256次本原单位根,但不存在512次本原单位根,因此
(
x
n
+
1
)
m
o
d
q
(x^{n}+1)\ mod\ q
(xn+1) mod q可分解为128个二次多项式。令
ζ
=
17
ζ=17
ζ=17为该256次本原单位根,因此
ζ
,
ζ
3
,
ζ
5
,
⋯
,
ζ
255
ζ,ζ^3,ζ^5,⋯,ζ^{255}
ζ,ζ3,ζ5,⋯,ζ255便为
Z
q
\Z_q
Zq中所有的256次单位根,固有如下式子:
x
n
+
1
=
(
x
2
−
ζ
)
(
x
2
−
ζ
3
)
⋯
(
x
2
−
ζ
255
)
m
o
d
q
x^n+1=(x^2-ζ)(x^2-ζ^3 )⋯(x^2-ζ^{255})\ mod \ q
xn+1=(x2−ζ)(x2−ζ3)⋯(x2−ζ255) mod q于是由中国剩余定理有:
Z
q
/
(
x
256
+
1
)
=
Z
q
/
∏
i
=
0
127
(
x
2
−
ζ
2
i
+
1
)
≅
Z
q
/
(
x
2
−
ζ
)
⨂
⋯
⨂
Z
q
/
(
x
2
−
ζ
255
)
\Z_q/(x^{256}+1)=\Z_q/\prod \limits_{i=0}^{127}(x^2-ζ^{2i+1}) ≅\Z_q/(x^2-ζ)⨂⋯⨂Z_q/(x^2-ζ^{255})
Zq/(x256+1)=Zq/i=0∏127(x2−ζ2i+1)≅Zq/(x2−ζ)⨂⋯⨂Zq/(x2−ζ255) 具体的分解过程可通过平方差公式得到更详细的分解过程,首先
Z
q
/
(
x
256
+
1
)
\Z_q/(x^{256} +1)
Zq/(x256+1),由于
ζ
256
=
1
\zeta^{256}=1
ζ256=1,所以
ζ
128
=
−
1
\zeta^{128}=-1
ζ128=−1,于是有
Z
q
/
(
x
256
+
1
)
=
Z
q
/
(
x
256
−
ζ
128
)
\Z_q/(x^{256}+1)=\Z_q/(x^{256}-\zeta^{128})
Zq/(x256+1)=Zq/(x256−ζ128),由平方差公式便有
Z
q
/
(
x
256
−
ζ
128
)
≅
Z
q
/
(
x
2
−
ζ
64
)
⊗
Z
q
/
(
x
2
−
ζ
192
)
\Z_q/(x^{256}-ζ^{128})≅\Z_q/(x^2-ζ^{64})\otimes\Z_q/(x^2-ζ^{192})
Zq/(x256−ζ128)≅Zq/(x2−ζ64)⊗Zq/(x2−ζ192)其中
Z
q
/
(
x
2
−
ζ
192
)
\Z_q/(x^2-ζ^{192})
Zq/(x2−ζ192)是由
x
2
+
ζ
64
=
x
2
−
ζ
128
⋅
ζ
64
x^2+ζ^{64}=x^2-ζ^{128}\cdot ζ^{64}
x2+ζ64=x2−ζ128⋅ζ64得来。由此继续向下利用平方差公式进行分解,直到最后的
Z
q
/
(
x
2
−
ζ
2
b
r
v
(
0
)
+
1
)
⊗
Z
q
/
(
x
2
−
ζ
2
b
r
v
(
1
)
+
1
)
⊗
⋯
⊗
Z
q
/
(
x
2
−
ζ
2
b
r
v
(
127
)
+
1
)
\Z_q/(x^2-\zeta^{2brv(0)+1})\otimes\Z_q/(x^2-\zeta^{2brv(1)+1})\otimes⋯\otimes\Z_q/(x^2-\zeta^{2brv(127)+1})
Zq/(x2−ζ2brv(0)+1)⊗Zq/(x2−ζ2brv(1)+1)⊗⋯⊗Zq/(x2−ζ2brv(127)+1) 便不可再分。其中
b
r
v
(
i
)
brv(i)
brv(i)表示为
i
i
i的
log
n
−
1
\log n-1
logn−1位二进制表示比特翻转,即Kyber文档中的
b
r
7
(
i
)
br_7 (i)
br7(i)。比特翻转的顺序结果是由于每次对第二个加的式子使用平方差公式时均需要乘上
ζ
128
\zeta^{128}
ζ128使其变成满足平方差公式的形式。详见下图(图片来源于知乎)。
故Kyber中多项式可表示为:
(
f
m
o
d
(
x
2
−
ζ
)
,
f
m
o
d
(
x
2
−
ζ
2
b
r
v
(
1
)
+
1
)
,
⋯
,
f
m
o
d
(
x
2
−
ζ
2
b
r
v
(
127
)
+
1
)
)
(f\ mod\ (x^2-ζ), f\ mod\ (x^2-ζ^{2brv(1)+1}),⋯, f\ mod\ (x^2-ζ^{2brv(127)+1}))
(f mod (x2−ζ),f mod (x2−ζ2brv(1)+1),⋯,f mod (x2−ζ2brv(127)+1))
所以f(x)的NTT表示为:
N
T
T
(
f
)
=
f
^
(
x
)
=
f
^
0
+
f
^
1
x
+
⋯
+
f
^
255
x
255
NTT(f)=\hat f(x)=\hat f _0+\hat f _1 x+⋯+\hat f _{255} x^{255}
NTT(f)=f^(x)=f^0+f^1x+⋯+f^255x255
其中:
f
^
2
i
=
∑
j
=
0
127
f
2
j
⋅
ζ
(
2
b
r
v
(
i
)
+
1
)
j
;
\hat f_{2i}=\sum\limits_{j=0}\limits^{127}f_{2j}\cdot \zeta^{(2brv(i)+1)j};
f^2i=j=0∑127f2j⋅ζ(2brv(i)+1)j;
f
^
2
i
+
1
=
∑
j
=
0
127
f
2
j
+
1
⋅
ζ
(
2
b
r
v
(
i
)
+
1
)
j
.
\hat f_{2i+1}=\sum\limits_{j=0}\limits^{127}f_{2j+1}\cdot \zeta^{(2brv(i)+1)j}.
f^2i+1=j=0∑127f2j+1⋅ζ(2brv(i)+1)j.也可表示为:
N
T
T
(
f
)
=
f
^
(
x
)
=
(
f
^
0
+
f
^
1
x
,
f
^
2
+
f
^
3
x
,
⋯
,
f
^
254
+
f
^
255
x
)
.
NTT(f)=\hat f (x)=(\hat f_0+\hat f_1 x,\hat f_2+\hat f_3 x,⋯,\hat f _{254}+\hat f_{255}x).
NTT(f)=f^(x)=(f^0+f^1x,f^2+f^3x,⋯,f^254+f^255x).
于是
h
(
x
)
=
f
(
x
)
⋅
g
(
x
)
h(x)=f(x)\cdot g(x)
h(x)=f(x)⋅g(x)利用NTT计算便为:
h
^
(
x
)
=
f
^
(
x
)
⋅
g
^
(
x
)
=
(
h
^
0
+
h
^
1
x
,
h
^
2
+
h
^
3
x
,
⋯
,
h
^
254
+
h
^
255
x
)
.
\hat h(x)=\hat f(x)\cdot \hat g(x)=(\hat h_0+\hat h_1 x,\hat h_2+\hat h_3 x,⋯,\hat h_{254}+\hat h_{255}x).
h^(x)=f^(x)⋅g^(x)=(h^0+h^1x,h^2+h^3x,⋯,h^254+h^255x).其中:
h
^
2
i
+
h
^
2
i
+
1
x
=
(
f
^
2
i
+
f
^
2
i
+
1
x
)
⋅
(
g
^
2
i
+
g
^
2
i
+
1
x
)
m
o
d
x
2
−
ζ
2
i
+
1
\hat h_{2i}+\hat h_{2i+1} x=(\hat f_{2i}+\hat f_{2i+1}x)\cdot(\hat g_{2i}+\hat g_{2i+1} x) \ mod\ x^2-ζ^{2i+1}
h^2i+h^2i+1x=(f^2i+f^2i+1x)⋅(g^2i+g^2i+1x) mod x2−ζ2i+1故
h
^
2
i
=
f
^
2
i
⋅
g
^
2
i
+
f
^
2
i
+
1
⋅
g
^
2
i
+
1
⋅
ζ
2
i
+
1
;
\hat h_{2i}=\hat f_{2i}\cdot \hat g_{2i}+\hat f_{2i+1}\cdot \hat g_{2i+1}\cdot \zeta^{2i+1};
h^2i=f^2i⋅g^2i+f^2i+1⋅g^2i+1⋅ζ2i+1;
h
^
2
i
+
1
=
f
^
2
i
⋅
g
^
2
i
+
1
+
f
^
2
i
+
1
⋅
g
^
2
i
.
\hat h_{2i+1}=\hat f_{2i}\cdot \hat g_{2i+1}+\hat f_{2i+1}\cdot \hat g_{2i}.
h^2i+1=f^2i⋅g^2i+1+f^2i+1⋅g^2i.那么如何快速的计算
f
^
2
i
\hat f_{2i}
f^2i和
f
^
2
i
+
1
\hat f_{2i+1}
f^2i+1以及其逆变换呢?这可以从快速傅里叶变换(FFT)中得到启发。
二、离散傅里叶变换(DFT)
n
−
1
n-1
n−1次多项式有两种表述方式,一种便是由
n
n
n个系数直接写出,另一种便是利用插值多项式原理,
n
n
n个不同变量的函数值唯一决定了一个多项式。即
f
(
x
)
f(x)
f(x)可以表示为
f
0
+
f
1
x
+
⋯
+
f
n
−
1
x
n
−
1
f_0+f_1 x+⋯+f_{n-1} x^{n-1}
f0+f1x+⋯+fn−1xn−1,也可表述为满足
n
n
n个函数值对
(
x
0
,
f
(
x
0
)
)
,
⋯
,
(
x
n
−
1
,
f
(
x
n
−
1
)
)
(x_0,f(x_0)),⋯,(x_{n-1},f(x_{n-1}))
(x0,f(x0)),⋯,(xn−1,f(xn−1))的
n
−
1
n-1
n−1多项式,其中
x
i
≠
x
j
x_i\neq x_j
xi=xj,
i
≠
j
i\neq j
i=j。通过这两种等价表述,
h
(
x
)
=
f
(
x
)
⋅
g
(
x
)
h(x)=f(x)\cdot g(x)
h(x)=f(x)⋅g(x)可通过计算
(
x
0
,
f
(
x
0
)
⋅
g
(
x
0
)
)
,
⋯
,
(
x
(
n
−
1
)
,
f
(
x
n
−
1
)
⋅
g
(
x
n
−
1
)
)
(x_0,f(x_0)\cdot g(x_0)),⋯,(x_(n-1),f(x_{n-1})\cdot g(x_{n-1}))
(x0,f(x0)⋅g(x0)),⋯,(x(n−1),f(xn−1)⋅g(xn−1))得到。于是可寻找
n
n
n个不同的自变量
x
0
,
x
1
,
⋯
,
x
n
−
1
x_0,x_1,⋯,x_{n-1}
x0,x1,⋯,xn−1,分别计算
f
(
x
i
)
f(x_i)
f(xi)和
g
(
x
i
)
g(x_i)
g(xi),再分别进行相乘即可得到
n
n
n个
h
(
x
)
h(x)
h(x)的不同点对,再利用插值多项式的计算方法便可得到最终的乘积。
在离散傅里叶变换(DFT)中,上述
n
n
n个不同的自变量取
n
n
n次单位根即可,即
w
n
k
=
e
2
π
i
⋅
k
/
n
w_n^k=e^{2πi\cdot k/n}
wnk=e2πi⋅k/n,其中
k
=
0
,
1
,
2
,
⋯
,
n
−
1
k=0,1,2,⋯,n-1
k=0,1,2,⋯,n−1;NTT便取有限域中的
n
n
n个本原单位根。于是离散傅里叶变换即为计算
f
(
e
2
π
i
⋅
k
/
n
)
f(e^{2πi\cdot k/n})
f(e2πi⋅k/n),所以
f
(
x
)
f(x)
f(x)的离散傅里叶变换公式为:
F
k
=
∑
j
=
0
n
−
1
f
j
⋅
(
e
2
π
i
⋅
k
/
n
)
j
=
∑
j
=
0
n
−
1
f
j
⋅
e
2
k
j
π
i
/
n
F_k=\sum\limits_{j=0}\limits^{n-1}f_j\cdot (e^{2πi\cdot k/n})^j=\sum\limits_{j=0}\limits^{n-1}f_j\cdot e^{2kjπi/n}
Fk=j=0∑n−1fj⋅(e2πi⋅k/n)j=j=0∑n−1fj⋅e2kjπi/n.逆变换便是由
(
F
0
,
F
1
,
⋯
,
F
n
−
1
)
(F_0,F_1,⋯,F_{n-1})
(F0,F1,⋯,Fn−1)计算
(
f
0
,
f
1
,
⋯
,
f
n
−
1
)
(f_0,f_1,⋯,f_{n-1})
(f0,f1,⋯,fn−1),上述式子利用矩阵的形式表示为:
(
F
0
F
1
⋮
F
n
−
1
)
=
(
1
1
⋯
1
1
e
2
π
i
⋅
1
/
n
⋯
(
e
2
π
i
⋅
1
/
n
)
n
−
1
⋮
⋮
⋮
⋮
1
e
2
π
i
⋅
(
n
−
1
)
/
n
⋯
(
e
2
π
i
⋅
(
n
−
1
)
/
n
)
n
−
1
)
⋅
(
f
0
f
1
⋮
f
n
−
1
)
\begin{pmatrix} F_0\\ F_1\\ \vdots\\ F_{n-1} \end{pmatrix} = \begin{pmatrix} 1 & 1 & \cdots & 1 \\ 1 & e^{2πi\cdot1/n} & \cdots & (e^{2πi\cdot1/n})^{n-1}\\ \vdots & \vdots & \vdots & \vdots \\ 1 & e^{2πi\cdot(n-1)/n} & \cdots & (e^{2πi\cdot(n-1)/n})^{n-1} \end{pmatrix}\cdot\begin{pmatrix} f_0\\ f_1\\ \vdots\\ f_{n-1} \end{pmatrix}
F0F1⋮Fn−1
=
11⋮11e2πi⋅1/n⋮e2πi⋅(n−1)/n⋯⋯⋮⋯1(e2πi⋅1/n)n−1⋮(e2πi⋅(n−1)/n)n−1
⋅
f0f1⋮fn−1
所以有:
(
f
0
f
1
⋮
f
n
−
1
)
=
(
1
1
⋯
1
1
e
2
π
i
⋅
1
/
n
⋯
(
e
2
π
i
⋅
1
/
n
)
n
−
1
⋮
⋮
⋮
⋮
1
e
2
π
i
⋅
(
n
−
1
)
/
n
⋯
(
e
2
π
i
⋅
(
n
−
1
)
/
n
)
n
−
1
)
−
1
⋅
(
F
0
F
1
⋮
F
n
−
1
)
\begin{pmatrix} f_0\\ f_1\\ \vdots\\ f_{n-1} \end{pmatrix} = \begin{pmatrix} 1 & 1 & \cdots & 1 \\ 1 & e^{2πi\cdot1/n} & \cdots & (e^{2πi\cdot1/n})^{n-1}\\ \vdots & \vdots & \vdots & \vdots \\ 1 & e^{2πi\cdot(n-1)/n} & \cdots & (e^{2πi\cdot(n-1)/n})^{n-1} \end{pmatrix}^{-1}\cdot\begin{pmatrix} F_0\\ F_1\\ \vdots\\ F_{n-1} \end{pmatrix}
f0f1⋮fn−1
=
11⋮11e2πi⋅1/n⋮e2πi⋅(n−1)/n⋯⋯⋮⋯1(e2πi⋅1/n)n−1⋮(e2πi⋅(n−1)/n)n−1
−1⋅
F0F1⋮Fn−1
因为由单位根构成的系数矩阵为一个范德蒙德矩阵,所以该矩阵的逆容易求出,即:
(
f
0
f
1
⋮
f
n
−
1
)
=
1
n
(
1
1
⋯
1
1
e
−
2
π
i
⋅
1
/
n
⋯
(
e
−
2
π
i
⋅
1
/
n
)
n
−
1
⋮
⋮
⋮
⋮
1
e
−
2
π
i
⋅
(
n
−
1
)
/
n
⋯
(
e
−
2
π
i
⋅
(
n
−
1
)
/
n
)
n
−
1
)
⋅
(
F
0
F
1
⋮
F
n
−
1
)
\begin{pmatrix} f_0\\ f_1\\ \vdots\\ f_{n-1} \end{pmatrix} = \frac{1}{n} \begin{pmatrix} 1 & 1 & \cdots & 1 \\ 1 & e^{-2πi\cdot1/n} & \cdots & (e^{-2πi\cdot1/n})^{n-1}\\ \vdots & \vdots & \vdots & \vdots \\ 1 & e^{-2πi\cdot(n-1)/n} & \cdots & (e^{-2πi\cdot(n-1)/n})^{n-1} \end{pmatrix}\cdot\begin{pmatrix} F_0\\ F_1\\ \vdots\\ F_{n-1} \end{pmatrix}
f0f1⋮fn−1
=n1
11⋮11e−2πi⋅1/n⋮e−2πi⋅(n−1)/n⋯⋯⋮⋯1(e−2πi⋅1/n)n−1⋮(e−2πi⋅(n−1)/n)n−1
⋅
F0F1⋮Fn−1
故离散傅里叶逆变换为:
f
j
=
1
n
∑
k
=
0
n
−
1
F
k
⋅
(
e
−
2
π
i
⋅
j
/
n
)
k
=
1
n
∑
k
=
0
n
−
1
F
k
⋅
e
−
2
k
j
π
i
/
n
f_j=\frac{1}{n}\sum\limits_{k=0}\limits^{n-1}F_k\cdot (e^{-2πi\cdot j/n})^k=\frac{1}{n}\sum\limits_{k=0}\limits^{n-1}F_k\cdot e^{-2kjπi/n}
fj=n1k=0∑n−1Fk⋅(e−2πi⋅j/n)k=n1k=0∑n−1Fk⋅e−2kjπi/n 类似地,也可得到NTT及其INTT的计算公式。此时可以分为两种情形,
Z
q
\Z_q
Zq中存在
2
n
2n
2n次本原单位根(Dilithium)和只存在
n
n
n次本原单位根(Kyber)。一般讨论n为2的方幂的情形,如不满足则对多项式的高次系数填充0即可。
对于第一种情形,由于
Z
q
\Z_q
Zq中存在
2
n
2n
2n次本原单位根
ζ
2
n
\zeta_{2n}
ζ2n,于是
x
n
+
1
x^n+1
xn+1可以完全分解为
n
n
n个1次多项式,
(
ζ
2
n
,
ζ
2
n
3
,
⋯
,
ζ
2
n
2
n
−
1
)
∈
Z
q
(\zeta_{2n},\zeta_{2n}^3,⋯,\zeta_{2n}^{2n-1})\in\Z_q
(ζ2n,ζ2n3,⋯,ζ2n2n−1)∈Zq即为
n
n
n个
n
n
n次本原单位根,因此可以通过上述离散傅里叶变换的方式进行NTT变换,只需将其中的
n
n
n次单位根变为本原单位根即可。即
f
^
k
=
∑
k
=
0
n
−
1
f
j
⋅
(
ζ
2
n
2
k
+
1
)
j
=
∑
k
=
0
n
−
1
f
j
⋅
ζ
2
n
(
2
k
+
1
)
j
;
\hat f_k=\sum\limits_{k=0}\limits^{n-1}f_j\cdot (\zeta_{2n}^{2k+1})^j=\sum\limits_{k=0}\limits^{n-1}f_j\cdot\zeta_{2n}^{(2k+1)j};
f^k=k=0∑n−1fj⋅(ζ2n2k+1)j=k=0∑n−1fj⋅ζ2n(2k+1)j;
f
j
=
1
n
∑
k
=
0
n
−
1
f
^
k
⋅
(
ζ
2
n
−
(
2
j
+
1
)
)
k
=
1
n
∑
k
=
0
n
−
1
f
^
k
⋅
ζ
2
n
−
(
2
j
+
1
)
k
.
f_j=\frac{1}{n}\sum\limits_{k=0}\limits^{n-1}\hat f_k\cdot(\zeta_{2n}^{-(2j+1)})^k=\frac{1}{n}\sum\limits_{k=0}\limits^{n-1}\hat f_k\cdot\zeta_{2n}^{-(2j+1)k}.
fj=n1k=0∑n−1f^k⋅(ζ2n−(2j+1))k=n1k=0∑n−1f^k⋅ζ2n−(2j+1)k. 也可通过第一章中中国剩余定理的原理得到。但与第一章中不同之处在于此时可使用平方差公式分解至一次多项式,即:
Z
q
/
(
x
n
+
1
)
≅
Z
q
/
(
x
−
ζ
)
⊗
Z
q
/
(
x
−
ζ
3
)
⋯
⊗
Z
q
/
(
x
−
ζ
2
n
−
1
)
.
\Z_q/(x^n+1)≅\Z_q/(x-ζ)\otimes\Z_q/(x-ζ^3)⋯\otimes\Z_q/(x-ζ^{2n-1}) .
Zq/(xn+1)≅Zq/(x−ζ)⊗Zq/(x−ζ3)⋯⊗Zq/(x−ζ2n−1). 将
ζ
2
k
+
1
\zeta^{2k+1}
ζ2k+1分别代入
f
(
x
)
f(x)
f(x)便得到了在
Z
q
/
(
x
−
ζ
2
k
+
1
)
\Z_q/(x-\zeta^{2k+1})
Zq/(x−ζ2k+1)处的模数,即NTT变换后的NTT多项式系数,与上述
f
^
k
\hat f_k
f^k一致。
对于NTT,当有限域
Z
q
\Z_q
Zq中包含
2
n
2n
2n次本原单位根时,
(
ζ
2
n
,
ζ
2
n
3
,
⋯
,
ζ
2
n
2
n
−
1
)
∈
Z
q
(\zeta_{2n},\zeta_{2n}^3,⋯,\zeta_{2n}^{2n-1})\in\Z_q
(ζ2n,ζ2n3,⋯,ζ2n2n−1)∈Zq,
(
f
(
ζ
2
n
)
,
f
(
ζ
2
n
3
)
,
⋯
,
f
(
ζ
2
n
2
n
−
1
)
)
∈
Z
q
(f(\zeta_{2n}),f(\zeta_{2n}^3),⋯,f(\zeta_{2n}^{2n-1}))\in\Z_q
(f(ζ2n),f(ζ2n3),⋯,f(ζ2n2n−1))∈Zq,所也可以如此进行计算。但若不存在
2
n
2n
2n次本原单位根,只存在
n
n
n次本原单位根时,该方法便无法奏效,因为
Z
q
\Z_q
Zq中不存在这样的函数对,所以无法以此方式来表示多项式。
如若为第二种情形则稍微复杂一些,此时通过第一章的中国剩余定理的方式更好理解NTT。NTT逆变换也可通过矩阵的方式得到,此时NTT变化对应的矩阵变为:
(
f
^
0
f
^
2
⋮
f
^
n
−
2
f
^
1
⋮
f
^
n
−
1
)
=
(
A
0
0
A
)
⋅
(
f
0
f
2
⋮
f
n
−
2
f
1
⋮
f
n
−
1
)
\begin{pmatrix} \hat f_0\\ \hat f_2\\ \vdots\\ \hat f_{n-2}\\ \hat f_1 \\ \vdots\\ \hat f_{n-1} \end{pmatrix} = \begin{pmatrix} A & 0 \\ 0 & A \end{pmatrix}\cdot\begin{pmatrix} f_0\\ f_2\\ \vdots\\ f_{n-2}\\ f_1\\ \vdots\\ f_{n-1} \end{pmatrix}
f^0f^2⋮f^n−2f^1⋮f^n−1
=(A00A)⋅
f0f2⋮fn−2f1⋮fn−1
其中:
A
=
(
1
ζ
n
(
2
b
r
log
n
−
1
(
0
)
+
1
)
×
1
⋯
ζ
n
(
2
b
r
log
n
−
1
(
0
)
+
1
)
×
n
−
2
2
1
ζ
n
(
2
b
r
log
n
−
1
(
1
)
+
1
)
×
1
⋯
ζ
n
(
2
b
r
log
n
−
1
(
0
)
+
1
)
×
n
−
2
2
⋮
⋮
⋮
⋮
1
ζ
n
(
2
b
r
log
n
−
1
(
n
−
2
2
)
+
1
)
×
1
⋯
ζ
n
(
2
b
r
log
n
−
1
(
n
−
2
2
)
+
1
)
×
n
−
2
2
)
n
2
×
n
2
A=\begin{pmatrix} 1 & \zeta_n^{(2br_{\log n-1}(0)+1)\times1} & \cdots & \zeta_n^{(2br_{\log n-1}(0)+1)\times\frac{n-2}{2}} \\ 1 & \zeta_n^{(2br_{\log n-1}(1)+1)\times1} & \cdots & \zeta_n^{(2br_{\log n-1}(0)+1)\times\frac{n-2}{2}}\\ \vdots & \vdots & \vdots & \vdots \\ 1 & \zeta_n^{(2br_{\log n-1}(\frac{n-2}{2})+1)\times1} & \cdots & \zeta_n^{(2br_{\log n-1}(\frac{n-2}{2})+1)\times\frac{n-2}{2}} \end{pmatrix}_{\frac{n}{2}\times\frac{n}{2}}
A=
11⋮1ζn(2brlogn−1(0)+1)×1ζn(2brlogn−1(1)+1)×1⋮ζn(2brlogn−1(2n−2)+1)×1⋯⋯⋮⋯ζn(2brlogn−1(0)+1)×2n−2ζn(2brlogn−1(0)+1)×2n−2⋮ζn(2brlogn−1(2n−2)+1)×2n−2
2n×2n 由分块矩阵的求逆公式有
(
A
0
0
A
)
−
1
=
(
A
−
1
0
0
A
−
1
)
\begin{pmatrix} A & 0 \\ 0 & A \end{pmatrix}^{-1} =\begin{pmatrix} A^{-1} & 0 \\ 0 & A^{-1} \end{pmatrix}
(A00A)−1=(A−100A−1)所以上述逆变换变为了求A的逆,其中A是一个范德蒙矩阵,所以逆矩阵为:
A
−
1
=
(
1
ζ
n
−
(
2
b
r
log
n
−
1
(
0
)
+
1
)
×
1
⋯
ζ
n
−
(
2
b
r
log
n
−
1
(
0
)
+
1
)
×
n
−
2
2
1
ζ
n
−
(
2
b
r
log
n
−
1
(
1
)
+
1
)
×
1
⋯
ζ
n
−
(
2
b
r
log
n
−
1
(
0
)
+
1
)
×
n
−
2
2
⋮
⋮
⋮
⋮
1
ζ
n
−
(
2
b
r
log
n
−
1
(
n
−
2
2
)
+
1
)
×
1
⋯
ζ
n
−
(
2
b
r
log
n
−
1
(
n
−
2
2
)
+
1
)
×
n
−
2
2
)
n
2
×
n
2
A^{-1}=\begin{pmatrix} 1 & \zeta_n^{-(2br_{\log n-1}(0)+1)\times1} & \cdots & \zeta_n^{-(2br_{\log n-1}(0)+1)\times\frac{n-2}{2}} \\ 1 & \zeta_n^{-(2br_{\log n-1}(1)+1)\times1} & \cdots & \zeta_n^{-(2br_{\log n-1}(0)+1)\times\frac{n-2}{2}}\\ \vdots & \vdots & \vdots & \vdots \\ 1 & \zeta_n^{-(2br_{\log n-1}(\frac{n-2}{2})+1)\times1} & \cdots & \zeta_n^{-(2br_{\log n-1}(\frac{n-2}{2})+1)\times\frac{n-2}{2}} \end{pmatrix}_{\frac{n}{2}\times\frac{n}{2}}
A−1=
11⋮1ζn−(2brlogn−1(0)+1)×1ζn−(2brlogn−1(1)+1)×1⋮ζn−(2brlogn−1(2n−2)+1)×1⋯⋯⋮⋯ζn−(2brlogn−1(0)+1)×2n−2ζn−(2brlogn−1(0)+1)×2n−2⋮ζn−(2brlogn−1(2n−2)+1)×2n−2
2n×2n 所以此时NTT逆变换为:
f
2
i
=
2
n
∑
j
=
0
n
/
2
−
1
f
^
2
j
⋅
ζ
n
−
(
2
b
r
log
n
−
1
(
i
)
+
1
)
j
;
f_{2i}=\frac{2}{n}\sum\limits_{j=0}\limits^{n/2-1}\hat f_{2j}\cdot\zeta_{n}^{-(2br_{\log n-1}(i)+1)j};
f2i=n2j=0∑n/2−1f^2j⋅ζn−(2brlogn−1(i)+1)j;
f
2
i
+
1
=
2
n
∑
j
=
0
n
/
2
−
1
f
^
2
j
+
1
⋅
ζ
n
−
(
2
b
r
log
n
−
1
(
i
)
+
1
)
j
.
f_{2i+1}=\frac{2}{n}\sum\limits_{j=0}\limits^{n/2-1}\hat f_{2j+1}\cdot\zeta_{n}^{-(2br_{\log n-1}(i)+1)j}.
f2i+1=n2j=0∑n/2−1f^2j+1⋅ζn−(2brlogn−1(i)+1)j.
三、快速离散傅里叶变换(FFT)
接下来介绍如何快速计算这些函数值。首先注意到单位根有如下性质(
n
n
n为2的方幂):
w
n
2
k
=
e
2
π
i
⋅
2
k
/
n
=
e
2
π
i
⋅
k
/
(
n
/
2
)
=
w
n
/
2
k
;
w_n^{2k}=e^{2πi\cdot2k/n}=e^{2πi\cdot k/(n/2)}=w_{n/2}^k;
wn2k=e2πi⋅2k/n=e2πi⋅k/(n/2)=wn/2k;
w
n
k
+
n
/
2
=
e
2
π
i
⋅
(
k
+
n
/
2
)
/
n
=
e
2
π
i
⋅
k
/
n
+
π
i
=
−
e
2
π
i
⋅
k
/
n
=
−
w
n
k
.
w_n^{k+n/2}=e^{2πi\cdot(k+n/2)/n}=e^{2πi\cdot k/n+πi}=-e^{2πi\cdot k/n}=-w_n^k.
wnk+n/2=e2πi⋅(k+n/2)/n=e2πi⋅k/n+πi=−e2πi⋅k/n=−wnk. 同理,有限域
Z
q
\Z_q
Zq中的
n
n
n次本原单位根(
n
n
n整除
q
−
1
q-1
q−1)也有该性质,令
ξ
\xi
ξ为
Z
q
\Z_q
Zq乘法群中的生成元,
n
n
n次单位根即为
ζ
n
=
ξ
(
q
−
1
)
/
n
\zeta_n=\xi^{(q-1)/n}
ζn=ξ(q−1)/n,于是有:
ζ
n
2
k
=
ξ
q
−
1
n
×
2
k
=
ξ
q
−
1
n
/
2
×
k
=
ζ
n
/
2
k
;
\zeta_n^{2k}=\xi^{\frac{q-1}{n}×2k}=\xi^{\frac{q-1}{n/2}×k}=\zeta_{n/2}^k;
ζn2k=ξnq−1×2k=ξn/2q−1×k=ζn/2k;
ζ
n
k
+
n
/
2
=
ξ
q
−
1
n
×
(
k
+
n
/
2
)
=
ξ
q
−
1
n
×
k
⋅
ξ
(
q
−
1
)
/
2
=
−
ζ
n
k
.
\zeta_n^{k+n/2}=\xi^{\frac{q-1}{n}×(k+n/2)}=\xi^{\frac{q-1}{n}×k}\cdot\xi^{(q-1)/2}=-\zeta_n^k.
ζnk+n/2=ξnq−1×(k+n/2)=ξnq−1×k⋅ξ(q−1)/2=−ζnk.接下来利用上述性质对
f
(
x
)
f(x)
f(x)进行处理。
f
(
x
)
=
f
0
+
f
1
x
+
f
2
x
2
+
⋯
+
f
n
−
2
x
n
−
2
+
f
n
−
1
x
n
−
1
=
f
0
+
f
2
x
2
+
⋯
+
f
n
−
2
x
n
−
2
+
x
(
f
1
+
f
3
x
2
+
⋯
+
f
n
−
1
x
n
−
2
)
≔
E
1
(
x
2
)
+
x
O
1
(
x
2
)
f(x)=f_0+f_1 x+f_2 x^2+⋯+f_{n-2} x^{n-2}+f_{n-1} x^{n-1}\\=f_0+f_2 x^2+⋯+f_{n-2} x^{n-2}+x(f_1+f_3 x^2+⋯+f_{n-1} x^{n-2} )≔E_1 (x^2 )+xO_1 (x^2)
f(x)=f0+f1x+f2x2+⋯+fn−2xn−2+fn−1xn−1=f0+f2x2+⋯+fn−2xn−2+x(f1+f3x2+⋯+fn−1xn−2):=E1(x2)+xO1(x2) 将
f
(
x
)
f(x)
f(x)按系数分为奇偶两部分,分别记为
E
1
(
x
2
)
E_1 (x^2)
E1(x2)和
O
1
(
x
2
)
O_1 (x^2)
O1(x2),其中
E
1
(
X
)
=
f
0
+
f
2
X
+
⋯
f
2
i
X
i
+
⋯
+
f
(
n
−
2
)
X
(
n
−
2
)
/
2
;
E_1 (X)=f_0+f_2 X+⋯f_{2i} X^i+⋯+f_(n-2) X^{(n-2)/2};
E1(X)=f0+f2X+⋯f2iXi+⋯+f(n−2)X(n−2)/2;
O
1
(
X
)
=
f
1
+
f
3
X
+
⋯
f
2
i
+
1
X
i
+
⋯
+
f
(
n
−
1
)
X
(
n
−
2
)
/
2
.
O_1 (X)=f_1+f_3 X+⋯f_{2i+1} X^i+⋯+f_(n-1) X^{(n-2)/2}.
O1(X)=f1+f3X+⋯f2i+1Xi+⋯+f(n−1)X(n−2)/2. 因此计算一个
n
−
1
n-1
n−1次多项式的值变为计算两个
(
n
−
2
)
/
2
(n-2)/2
(n−2)/2次多项式的函数值,当
k
<
n
/
2
k<n/2
k<n/2有
f
(
w
n
k
)
=
E
1
(
w
n
2
k
)
+
w
n
k
×
O
1
(
w
n
2
k
)
=
E
1
(
w
n
/
2
k
)
+
w
n
k
×
O
1
(
w
n
/
2
k
)
f(w_n^k )=E_1 (w_n^{2k})+w_n^k×O_1 (w_n^{2k})=E_1 (w_{n/2}^k )+w_n^k×O_1 (w_{n/2}^k )
f(wnk)=E1(wn2k)+wnk×O1(wn2k)=E1(wn/2k)+wnk×O1(wn/2k);当
k
′
=
k
+
n
/
2
k'=k+n/2
k′=k+n/2有
f
(
w
n
k
′
)
=
E
1
(
w
n
2
k
′
)
+
w
n
k
′
×
O
1
(
w
n
2
k
′
)
=
E
1
(
w
n
/
2
k
)
−
w
n
k
×
O
1
(
w
n
/
2
k
)
f(w_n^{k'})=E_1 (w_n^{2k'})+w_n^{k'}×O_1 (w_n^{2k'})=E_1 (w_{n/2}^k )-w_n^k×O_1 (w_{n/2}^k )
f(wnk′)=E1(wn2k′)+wnk′×O1(wn2k′)=E1(wn/2k)−wnk×O1(wn/2k)。所以计算
n
n
n个函数值变为了计算
n
/
2
n/2
n/2个函数值,且复杂度降低一半。然后继续往下分解函数,共
o
r
d
2
(
n
)
ord_2 (n)
ord2(n)次后不可再分解,因为此时的单位根不能继续往下分解,且复杂度不断降低一半,故两个
n
−
1
n-1
n−1次多项式的乘法计算复杂度由原来的
O
(
n
2
)
O(n^2)
O(n2)变为
O
(
n
log
n
)
O(n\logn )
O(nlogn)。
以上便是快速傅里叶变换(FFT)的计算思路,以下以一个7次多项式为例,即模多项式为
x
8
+
1
x^8+1
x8+1,
f
(
x
)
=
f
0
+
f
1
x
+
f
2
x
2
+
⋯
+
f
7
x
7
f(x)=f_0+f_1 x+f_2 x^2+⋯+f_7 x^7
f(x)=f0+f1x+f2x2+⋯+f7x7,模数
q
q
q满足
8
∣
(
q
−
1
)
8|(q-1)
8∣(q−1)。同样先考存在
2
n
2n
2n次本原单位根,即16次本原单位根,此时NTT可仿照FFT的计算思路。
接下来计算
f
(
ζ
16
k
)
f(\zeta_{16}^k)
f(ζ16k),
(
k
=
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
)
(k=1,3,5,7,9,11,13,15)
(k=1,3,5,7,9,11,13,15),由于
f
(
x
)
=
f
0
+
f
1
x
+
f
2
x
2
+
f
3
x
3
+
f
4
x
4
+
f
5
x
5
+
f
6
x
6
+
f
7
x
7
=
f
0
+
f
2
x
2
+
f
4
x
4
+
f
6
x
6
+
x
(
f
1
+
f
3
x
2
+
f
5
x
4
+
f
7
x
6
)
=
f
0
+
f
4
x
4
+
x
2
(
f
2
+
f
6
x
4
)
+
x
(
f
1
+
f
5
x
4
+
x
2
(
f
3
+
f
7
x
4
)
)
f(x)=f_0+f_1 x+f_2 x^2+f_3 x^3+f_4 x^4+f_5 x^5+f_6 x^6+f_7 x^7\\ =f_0+f_2 x^2+f_4 x^4+f_6 x^6+x(f_1+f_3 x^2+f_5 x^4+f_7 x^6 )\\ =f_0+f_4 x^4+x^2 (f_2+f_6 x^4 )+x(f_1+f_5 x^4+x^2 (f_3+f_7 x^4))
f(x)=f0+f1x+f2x2+f3x3+f4x4+f5x5+f6x6+f7x7=f0+f2x2+f4x4+f6x6+x(f1+f3x2+f5x4+f7x6)=f0+f4x4+x2(f2+f6x4)+x(f1+f5x4+x2(f3+f7x4)) 分别计算
f
0
+
f
4
x
4
f_0+f_4 x^4
f0+f4x4,
f
2
+
f
6
x
4
f_2+f_6 x^4
f2+f6x4,
f
1
+
f
5
x
4
f_1+f_5 x^4
f1+f5x4,
f
3
+
f
7
x
4
f_3+f_7 x^4
f3+f7x4在
ζ
1
6
k
\zeta_16^k
ζ16k时的取值,由于
ζ
16
4
k
=
ζ
4
k
\zeta_{16}^4k=\zeta_4^k
ζ164k=ζ4k,因此只需计算上面4个多项式在
ζ
4
1
\zeta_4^1
ζ41和
ζ
ζ
4
3
ζ\zeta_4^3
ζζ43处的取值即可,又因为
ζ
4
1
=
−
ζ
4
3
\zeta_4^1=-\zeta_4^3
ζ41=−ζ43,因此只需计算其中一个即可。即
f
0
′
=
f
0
+
f
4
⋅
ζ
4
1
,
f
4
′
=
f
0
−
f
4
⋅
ζ
4
1
;
f
2
′
=
f
2
+
f
6
⋅
ζ
4
1
,
f
6
′
=
f
2
−
f
6
⋅
ζ
4
1
;
f
1
′
=
f
1
+
f
5
⋅
ζ
4
1
,
f
5
′
=
f
1
−
f
5
⋅
ζ
4
1
;
f
3
′
=
f
3
+
f
7
⋅
ζ
4
1
,
f
7
′
=
f
3
−
f
7
⋅
ζ
4
1
.
f_0'=f_0+f_4\cdot\zeta_4^1,f_4'=f_0-f_4\cdot\zeta_4^1;\\ f_2'=f_2+f_6\cdot\zeta_4^1,f_6'=f_2-f_6\cdot\zeta_4^1;\\ f_1'=f_1+f_5\cdot\zeta_4^1,f_5'=f_1-f_5\cdot\zeta_4^1;\\ f_3'=f_3+f_7\cdot\zeta_4^1,f_7'=f_3-f_7\cdot\zeta_4^1.
f0′=f0+f4⋅ζ41,f4′=f0−f4⋅ζ41;f2′=f2+f6⋅ζ41,f6′=f2−f6⋅ζ41;f1′=f1+f5⋅ζ41,f5′=f1−f5⋅ζ41;f3′=f3+f7⋅ζ41,f7′=f3−f7⋅ζ41. 再往上一层,即
f
0
+
f
4
x
4
+
x
2
(
f
2
+
f
6
x
4
)
f_0+f_4 x^4+x^2 (f_2+f_6 x^4 )
f0+f4x4+x2(f2+f6x4)和
f
1
+
f
5
x
4
+
x
2
(
f
3
+
f
7
x
4
)
f_1+f_5 x^4+x^2 (f_3+f_7 x^4)
f1+f5x4+x2(f3+f7x4)。此处需要在原来的基础上乘
x
2
x^2
x2,即
ζ
16
2
k
=
ζ
8
k
\zeta_{16}^{2k}=\zeta_8^k
ζ162k=ζ8k,又因为
ζ
8
1
=
−
ζ
8
5
ζ_8^1=-ζ_8^5
ζ81=−ζ85,
ζ
8
3
=
−
ζ
8
7
ζ_8^3=-ζ_8^7
ζ83=−ζ87,而
x
4
x^4
x4处,即
(
x
2
)
2
(x^2 )^2
(x2)2又为
ζ
4
1
=
−
ζ
4
3
ζ_4^1=-ζ_4^3
ζ41=−ζ43,所以总的有8个值,即:
f
0
′
′
=
f
0
′
+
ζ
8
1
⋅
f
2
′
,
f
2
′
′
=
f
0
′
−
ζ
8
1
⋅
f
2
′
;
f
4
′
′
=
f
4
′
+
ζ
8
3
⋅
f
6
′
,
f
6
′
′
=
f
4
′
−
ζ
8
3
⋅
f
6
′
;
f
1
′
′
=
f
1
′
+
ζ
8
1
⋅
f
3
′
,
f
3
′
′
=
f
1
′
−
ζ
8
1
⋅
f
3
′
;
f
5
′
′
=
f
5
′
+
ζ
8
3
⋅
f
7
′
,
f
7
′
′
=
f
5
′
−
ζ
8
3
⋅
f
7
′
;
f_0''=f_0'+\zeta_8^1\cdot f_2', f_2''=f_0'-\zeta_8^1\cdot f_2';\\ f_4''=f_4'+\zeta_8^3\cdot f_6', f_6''=f_4'-\zeta_8^3\cdot f_6';\\ f_1''=f_1'+\zeta_8^1\cdot f_3', f_3''=f_1'-\zeta_8^1\cdot f_3';\\ f_5''=f_5'+\zeta_8^3\cdot f_7', f_7''=f_5'-\zeta_8^3\cdot f_7';
f0′′=f0′+ζ81⋅f2′,f2′′=f0′−ζ81⋅f2′;f4′′=f4′+ζ83⋅f6′,f6′′=f4′−ζ83⋅f6′;f1′′=f1′+ζ81⋅f3′,f3′′=f1′−ζ81⋅f3′;f5′′=f5′+ζ83⋅f7′,f7′′=f5′−ζ83⋅f7′; 最后,计算
f
0
+
f
4
x
4
+
x
2
(
f
2
+
f
6
x
4
)
+
x
(
f
1
+
f
5
x
4
+
x
2
(
f
3
+
f
7
x
4
)
)
f_0+f_4 x^4+x^2 (f_2+f_6 x^4 )+x(f_1+f_5 x^4+x^2 (f_3+f_7 x^4))
f0+f4x4+x2(f2+f6x4)+x(f1+f5x4+x2(f3+f7x4)),即
f
(
x
)
f(x)
f(x)。在上述的基础上此处出现了
x
x
x,即
ζ
16
k
ζ_{16}^k
ζ16k,因为
ζ
16
1
=
−
ζ
16
9
ζ_{16}^1=-ζ_{16}^9
ζ161=−ζ169,
ζ
16
3
=
−
ζ
16
11
ζ_{16}^3=-ζ_{16}^{11}
ζ163=−ζ1611,
ζ
16
5
=
−
ζ
16
13
ζ_{16}^5=-ζ_{16}^{13}
ζ165=−ζ1613,
ζ
16
7
=
−
ζ
16
15
ζ_{16}^7=-ζ_{16}^{15}
ζ167=−ζ1615。而平方后的值均已经计算了,所以这8个值为:
F
0
=
f
(
ζ
16
1
)
=
f
0
′
′
+
ζ
16
1
⋅
f
1
′
′
;
F
4
=
f
(
ζ
16
9
)
=
f
0
′
′
−
ζ
16
1
⋅
f
1
′
′
;
F
2
=
f
(
ζ
16
5
)
=
f
2
′
′
+
ζ
16
5
⋅
f
3
′
′
;
F
6
=
f
(
ζ
16
13
)
=
f
2
′
′
−
ζ
16
5
⋅
f
3
′
′
;
F
1
=
f
(
ζ
16
3
)
=
f
4
′
′
+
ζ
16
3
⋅
f
5
′
′
;
F
5
=
f
(
ζ
16
11
)
=
f
4
′
′
−
ζ
16
3
⋅
f
5
′
′
;
F
3
=
f
(
ζ
16
7
)
=
f
6
′
′
+
ζ
16
7
⋅
f
7
′
′
;
F
7
=
f
(
ζ
16
15
)
=
f
6
′
′
−
ζ
16
7
⋅
f
7
′
′
;
F_0=f(\zeta_{16}^1 )=f_0''+\zeta_{16}^1\cdot f_1'';\\ F_4=f(\zeta_{16}^9 )=f_0''-\zeta_{16}^1\cdot f_1'';\\ F_2=f(\zeta_{16}^5 )=f_2''+\zeta_{16}^5\cdot f_3'';\\ F_6=f(\zeta_{16}^{13})=f_2''-\zeta_{16}^5\cdot f_3'';\\ F_1=f(\zeta_{16}^3)=f_4''+\zeta_{16}^3\cdot f_5'';\\ F_5=f(\zeta_{16}^{11})=f_4''-\zeta_{16}^3\cdot f_5'';\\ F_3=f(\zeta_{16}^7 )=f_6''+\zeta_{16}^7\cdot f_7'';\\ F_7=f(\zeta_{16}^{15})=f_6''-\zeta_{16}^7\cdot f_7'';
F0=f(ζ161)=f0′′+ζ161⋅f1′′;F4=f(ζ169)=f0′′−ζ161⋅f1′′;F2=f(ζ165)=f2′′+ζ165⋅f3′′;F6=f(ζ1613)=f2′′−ζ165⋅f3′′;F1=f(ζ163)=f4′′+ζ163⋅f5′′;F5=f(ζ1611)=f4′′−ζ163⋅f5′′;F3=f(ζ167)=f6′′+ζ167⋅f7′′;F7=f(ζ1615)=f6′′−ζ167⋅f7′′;接下来将在下一篇文章中介绍NTT中与FFT类似的快速计算方法以及相应伪代码。欢迎大家交流指正。