提示:Kyber中的NTT(Number Theoretic Transforms)
前言
接上一章内容NTT(Number Theoretic Transforms)(一),本章继续以Kyber为例介绍NTT的快速计算方法。
四、NTT的递归
上一章描述了FFT和一种情形的NTT的递归计算思路,然而这种方式对于不存在
2
n
2n
2n次本原单位根的情形并不适用,于是接下来介绍具有一般性的NTT递归计算方式。
通过中国剩余定理对多项式环的分解可以看出,NTT与FFT的具有相似的层分解方式,即将多项式系数按奇次项系数和偶次项系数进行划分,逐层向下分解。但不同之处在于,FFT是利用单位根在最底层的幂次进行约减计算,然后往上递归。而NTT却是将
f
(
x
)
f(x)
f(x)从上往下进行模约减,最终得到的模数便是NTT变换后的结果。
对于初始层,
f
(
x
)
≡
f
0
+
f
1
x
+
⋯
+
f
(
n
−
1
)
x
(
n
−
1
)
m
o
d
x
n
+
1
f(x)≡f_0+f_1 x+⋯+f_(n-1) x^(n-1) mod x^n+1
f(x)≡f0+f1x+⋯+f(n−1)x(n−1)modxn+1,以
Z
q
\Z_q
Zq中只存在
n
n
n次本原单位根为例,Kyber即为该种情形。
到了第二层,
f
(
x
)
f(x)
f(x)要分别模至
Z
q
/
(
x
n
/
2
−
ζ
n
/
4
)
\Z_q/(x^{n/2}-\zeta^{n/4})
Zq/(xn/2−ζn/4)和
Z
q
/
(
x
n
/
2
+
ζ
n
/
4
)
\Z_q/(x^{n/2}+\zeta^{n/4})
Zq/(xn/2+ζn/4)中,于是左边的左子节点多项式便是将次数大于
n
/
2
n/2
n/2的高次项中的
x
n
/
2
x^{n/2}
xn/2替换为
ζ
n
/
4
ζ^{n/4}
ζn/4。即:
L
0
(
x
)
=
f
0
+
f
1
x
+
⋯
+
f
n
/
2
⋅
ζ
n
/
4
+
f
n
/
2
+
1
⋅
ζ
n
/
4
x
+
⋯
+
f
n
−
1
⋅
ζ
n
/
4
⋅
x
n
/
2
−
1
=
(
f
0
+
f
n
/
2
⋅
ζ
n
/
4
)
+
(
f
1
+
f
n
/
2
+
1
⋅
ζ
n
/
4
)
x
+
⋯
+
(
f
n
/
2
−
1
+
f
n
−
1
⋅
ζ
n
/
4
)
x
n
/
2
−
1
.
L_0 (x)=f_0+f_1 x+⋯+f_{n/2}\cdot\zeta^{n/4}+f_{n/2+1}\cdot\zeta^{n/4} x+⋯+f_{n-1}\cdot\zeta^{n/4}\cdot x^{n/2-1}\\ =(f_0+f_{n/2}\cdot\zeta^{n/4})+(f_1+f_{n/2+1}\cdot\zeta^{n/4})x+⋯+(f_{n/2-1}+f_{n-1}\cdot\zeta^{n/4}) x^{n/2-1}.
L0(x)=f0+f1x+⋯+fn/2⋅ζn/4+fn/2+1⋅ζn/4x+⋯+fn−1⋅ζn/4⋅xn/2−1=(f0+fn/2⋅ζn/4)+(f1+fn/2+1⋅ζn/4)x+⋯+(fn/2−1+fn−1⋅ζn/4)xn/2−1. 同理右子节点模
(
x
n
/
2
+
ζ
n
/
4
)
(x^{n/2}+\zeta^{n/4})
(xn/2+ζn/4)为:
(
f
0
−
f
n
/
2
⋅
ζ
n
/
4
)
+
(
f
1
−
f
n
/
2
+
1
⋅
ζ
n
/
4
)
x
+
⋯
+
(
f
n
/
2
−
1
−
f
n
−
1
⋅
ζ
n
/
4
)
x
n
/
2
−
1
(f_0-f_{n/2}\cdot\zeta^{n/4})+(f_1-f_{n/2+1}\cdot\zeta^{n/4})x+⋯+(f_{n/2-1}-f_{n-1}\cdot\zeta^{n/4}) x^{n/2-1}
(f0−fn/2⋅ζn/4)+(f1−fn/2+1⋅ζn/4)x+⋯+(fn/2−1−fn−1⋅ζn/4)xn/2−1
到了第三层,两边分别往下模
x
n
/
4
−
ζ
n
/
8
x^{n/4}-\zeta^{n/8}
xn/4−ζn/8、
x
n
/
4
+
ζ
n
/
8
x^{n/4}+\zeta^{n/8}
xn/4+ζn/8和
x
n
/
4
+
ζ
3
n
/
8
x^{n/4}+\zeta^{3n/8}
xn/4+ζ3n/8和
x
n
/
4
−
ζ
3
n
/
8
x^{n/4}-\zeta^{3n/8}
xn/4−ζ3n/8。
依次往下,直到最后一层,即为NTT的变换系数。若存在
2
n
2n
2n次本原单位根则过程略有不同,首先第二层变为
Z
q
/
(
x
n
/
2
−
ζ
2
n
n
/
2
)
\Z_q/(x^{n/2}-\zeta_{2n}^{n/2})
Zq/(xn/2−ζ2nn/2)和
Z
q
/
(
x
n
/
2
+
ζ
2
n
n
/
2
)
\Z_q/(x^{n/2}+\zeta_{2n}^{n/2})
Zq/(xn/2+ζ2nn/2),最后一层即为
Z
q
/
(
x
−
ζ
2
n
2
b
r
(
i
)
+
1
)
\Z_q/(x-\zeta_{2n}^{2br(i)+1})
Zq/(x−ζ2n2br(i)+1)。
由此可以看出NTT的计算为自上而下的递归计算,首先计算第二层的
f
k
′
=
f
k
+
f
k
+
n
/
2
⋅
ζ
n
/
4
f_k'=f_k+f_{k+n/2}\cdot\zeta^{n/4}
fk′=fk+fk+n/2⋅ζn/4,
f
k
+
n
/
2
′
=
f
k
−
f
k
+
n
/
2
⋅
ζ
n
/
4
f_{k+n/2}'=f_k-f_{k+n/2}\cdot\zeta^{n/4}
fk+n/2′=fk−fk+n/2⋅ζn/4,其中
0
≤
k
<
n
/
2
0≤k<n/2
0≤k<n/2。然后分别计算第二层左子节点到第三层的归约,即第三层左边的左右两个子节点为:
f
k
′
′
=
f
k
′
+
f
k
+
n
/
4
′
⋅
ζ
n
/
8
f_k''=f_k'+f_{k+n/4}'\cdot\zeta^{n/8}
fk′′=fk′+fk+n/4′⋅ζn/8,
f
k
+
n
/
4
′
′
=
f
k
′
−
f
k
+
n
/
4
′
⋅
ζ
n
/
8
f_{k+n/4}''=f_k'-f_{k+n/4}'\cdot\zeta^{n/8}
fk+n/4′′=fk′−fk+n/4′⋅ζn/8;右边的左右两个子节点为:
f
k
+
n
/
2
′
′
=
f
k
+
n
/
2
′
+
f
k
+
3
n
/
4
′
⋅
ζ
3
n
/
8
f_{k+n/2}''=f_{k+n/2}'+f_{k+3n/4}'\cdot\zeta^{3n/8}
fk+n/2′′=fk+n/2′+fk+3n/4′⋅ζ3n/8,
f
k
+
3
n
/
4
′
′
=
f
k
+
n
/
2
′
−
f
k
+
3
n
/
4
′
⋅
ζ
3
n
/
8
f_{k+3n/4}''=f_{k+n/2}'-f_{k+3n/4}'\cdot\zeta^{3n/8}
fk+3n/4′′=fk+n/2′−fk+3n/4′⋅ζ3n/8其中
0
≤
k
<
n
/
4
0≤k<n/4
0≤k<n/4。以此递归往下。
同样以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)。此次不存在16次本原单位根,即
16
∤
(
q
−
1
)
16\nmid(q-1)
16∤(q−1)。
第二层左子节点为模
Z
q
/
(
x
4
−
ζ
2
)
\Z_q/(x^4-\zeta^2 )
Zq/(x4−ζ2):
(
f
0
+
f
4
⋅
ζ
2
)
,
(
f
1
+
f
5
⋅
ζ
2
)
,
(
f
2
+
f
6
⋅
ζ
2
)
,
(
f
3
+
f
7
⋅
ζ
2
)
(f_0+f_4\cdot\zeta^2 ),(f_1+f_5\cdot\zeta^2 ),(f_2+f_6\cdot\zeta^2 ),(f_3+f_7\cdot\zeta^2 )
(f0+f4⋅ζ2),(f1+f5⋅ζ2),(f2+f6⋅ζ2),(f3+f7⋅ζ2) 右子节点为模
Z
q
/
(
x
4
+
ζ
2
)
=
Z
q
/
(
x
4
−
ζ
6
)
\Z_q/(x^4+\zeta^2 )=\Z_q/(x^4-\zeta^6 )
Zq/(x4+ζ2)=Zq/(x4−ζ6):
(
f
0
−
f
4
⋅
ζ
2
)
,
(
f
1
−
f
5
⋅
ζ
2
)
,
(
f
2
−
f
6
⋅
ζ
2
)
,
(
f
3
−
f
7
⋅
ζ
2
)
(f_0-f_4\cdot\zeta^2 ),(f_1-f_5\cdot\zeta^2 ),(f_2-f_6\cdot\zeta^2 ),(f_3-f_7\cdot\zeta^2 )
(f0−f4⋅ζ2),(f1−f5⋅ζ2),(f2−f6⋅ζ2),(f3−f7⋅ζ2) 第三层左左子节点则为模
Z
q
/
(
x
2
−
ζ
)
\Z_q/(x^2-\zeta)
Zq/(x2−ζ):
(
f
0
′
+
f
2
′
⋅
ζ
)
,
(
f
1
′
+
f
3
′
⋅
ζ
)
(f_0'+f_2'\cdot\zeta),(f_1'+f_3'\cdot\zeta)
(f0′+f2′⋅ζ),(f1′+f3′⋅ζ) 左右子节点则为模
Z
q
/
(
x
2
+
ζ
)
=
Z
q
/
(
x
2
−
ζ
5
)
\Z_q/(x^2+\zeta)=\Z_q/(x^2-\zeta^5 )
Zq/(x2+ζ)=Zq/(x2−ζ5):
(
f
0
′
−
f
2
′
⋅
ζ
)
=
(
f
0
′
+
f
2
′
⋅
ζ
5
)
,
(
f
1
′
−
f
3
′
⋅
ζ
)
=
(
f
1
′
+
f
3
′
⋅
ζ
5
)
(f_0'-f_2'\cdot\zeta)=(f_0'+f_2'\cdot\zeta^5 ),(f_1'-f_3'\cdot\zeta)=(f_1'+f_3'\cdot\zeta^5 )
(f0′−f2′⋅ζ)=(f0′+f2′⋅ζ5),(f1′−f3′⋅ζ)=(f1′+f3′⋅ζ5) 右左子节点则为模
Z
q
/
(
x
2
−
ζ
3
)
\Z_q/(x^2-\zeta^3 )
Zq/(x2−ζ3):
(
f
4
′
+
f
6
′
⋅
ζ
3
)
,
(
f
5
′
+
f
7
′
⋅
ζ
3
)
(f_4'+f_6'\cdot\zeta^3),(f_5'+f_7'\cdot\zeta^3)
(f4′+f6′⋅ζ3),(f5′+f7′⋅ζ3) 右右子节点则为模
Z
q
/
(
x
2
+
ζ
3
)
=
Z
q
/
(
x
2
−
ζ
7
)
\Z_q/(x^2+\zeta^3 )=\Z_q/(x^2-\zeta^7 )
Zq/(x2+ζ3)=Zq/(x2−ζ7):
(
f
4
′
−
f
6
′
⋅
ζ
)
=
(
f
4
′
+
f
6
′
⋅
ζ
5
)
,
(
f
1
′
−
f
3
′
⋅
ζ
)
=
(
f
5
′
+
f
7
′
⋅
ζ
5
)
(f_4'-f_6'\cdot\zeta)=(f_4'+f_6'\cdot\zeta^5 ),(f_1'-f_3'\cdot\zeta)=(f_5'+f_7'\cdot\zeta^5 )
(f4′−f6′⋅ζ)=(f4′+f6′⋅ζ5),(f1′−f3′⋅ζ)=(f5′+f7′⋅ζ5) 其中
f
k
′
=
f
k
+
f
k
+
4
⋅
ζ
2
f_k'=f_k+f_{k+4}\cdot\zeta^2
fk′=fk+fk+4⋅ζ2,
f
k
+
4
′
=
f
k
−
f
k
+
4
⋅
ζ
2
f_{k+4}'=f_k-f_{k+4}\cdot\zeta^2
fk+4′=fk−fk+4⋅ζ2,其中
0
≤
k
<
4
0\le k<4
0≤k<4。
五、蝶形结构
由上述计算过程便可看出FFT中的蝶形结构,还是以7次多项式为例,类似地,当存在2n次即16次本原单位根时,NNT可进行和FFT一样的计算思想。
总体计算情况如下所示。
其中
φ
=
ζ
16
\varphi=\zeta_{16}
φ=ζ16,
ω
=
φ
2
\omega=\varphi^2
ω=φ2,类似NTT逆变换也同样具有蝶形结构:
通过第四章NTT的递归计算可以看出,一般情形的NTT同样具有蝶形结构。注意到第一层中约减本原单位根的幂为
ζ
n
/
4
\zeta^{n/4}
ζn/4,第二层为
ζ
n
/
8
\zeta^{n/8}
ζn/8,
ζ
3
n
/
8
\zeta^{3n/8}
ζ3n/8,通过找规律发现顺序依次为
ζ
b
r
log
n
−
1
(
1
)
\zeta^{br_{\logn-1}(1)}
ζbrlogn−1(1),
ζ
b
r
log
n
−
1
(
2
)
\zeta^{br_{\logn-1}(2)}
ζbrlogn−1(2),
ζ
b
r
log
n
−
1
(
3
)
\zeta^{br_{\logn-1}(3)}
ζbrlogn−1(3),
ζ
b
r
log
n
−
1
(
5
)
\zeta^{br_{\logn-1}(5)}
ζbrlogn−1(5) ,
⋯
\cdots
⋯。此时NTT蝶形变换为:
其中
0
≤
k
<
n
2
j
−
1
0≤k<\frac{n}{2^{j-1}}
0≤k<2j−1n ,
j
j
j为NTT变换的层级,
r
r
r为从0开始的前
2
j
−
2
2^{j-2}
2j−2个偶数。根据此规律可以写出如下伪代码。
六、伪代码
首先是正序下的NTT变换,即伪代码中层数 j j j从1到 log n − 1 \log n-1 logn−1。
Input:模数q,项数n=2^l,多项式系数(f_0,f_1,⋯,f_(n-1)),n次本原单位根ζ。
Output:NTT变换后系数F=(F_0,F_1,⋯,F_(n-1) )
1: for j from 1 to logn-1 do
2: m←2^j;r←0
3: for i from 0 to n-1 by 2n/m do
4: for k from 0 to n/m-1 do
5: t←f_(k+i+n/m)∙ζ^(br(m/2+r)) mod q;
6: u←f_(k+i);
7: f_(k+i)←u+t mod q;
8: f_(k+i+n/m)←u-t mod q;
9: end for
10: r←r+1
11: end for
12: end for
13: (F_0,F_1,⋯,F_(n-1)) = (f_0,f_1,⋯,f_(n-1))
14: return F=(F_0,F_1,⋯,F_(n-1))
相应NTT逆伪代码为:
Input:模数q,项数n=2^l,NTT系数(F_0,F_1,⋯,F_(n-1)),n次本原单位根ζ。
Output:NTT逆变换后系数(f_0,f_1,⋯,f_(n-1) )
1: for j from logn-1 to 1 do
2: m←2^j;r←0
3: for i from 0 to n-1 by 2n/m do
4: for k from 0 to n/m-1 do
5: t←(F_(k+i)+F_(k+i+n/m))/2 mod q;
6: u←(F_(k+i)-F_(k+i+n/m))/2 mod q;
7: F_(k+i)←t;
8: F_(k+i+2n/m)←u∙ζ^(-br(m/2+r) ) mod q
9: end for
10: r←r+1
11: end for
12: end for
13: (f_0,f_1,⋯,f_(n-1)) = (F_0,F_1,⋯,F_(n-1))
14: return f=(f_0,f_1,⋯,f_(n-1))
其次, j j j还可以从 log n − 1 \log n-1 logn−1到1。
Input:模数q,项数n=2^l,多项式系数(f_0,f_1,⋯,f_(n-1)),n次本原单位根ζ。
Output:NTT变换后系数F=(F_0,F_1,⋯,F_(n-1))
1: for j from logn-1 to 1 do
2: m←2^j;r←0
3: for i from 0 to n-1 by 2m do
4: for k from 0 to m-1 do
5: t←f_(k+i+m)∙ζ^(br(br(m/2)+r)) mod q;
6: u←f_(k+i);
7: f_(k+i)←u+t mod q;
8: f_(k+i+m)←u-t mod q;
9: end for
10: r←r+1
11: end for
12: end for
13: (F_0,F_1,⋯,F_(n-1)) = (f_0,f_1,⋯,f_(n-1))
14: return F=(F_0,F_1,⋯,F_(n-1))
此时NTT逆变换如下所示:
Input:模数q,项数n=2^l,NTT系数((F_0,F_1,⋯,F_(n-1)),n次本原单位根ζ。
Output:NTT逆变换后系数(f_0,f_1,⋯,f_(n-1))
1: for j from 1 to logn-1do
2: m←2^j;r←0
3: for i from 0 to n-1 by 2m do
4: for k from 0 to m-1 do
5: t←(f ̂_(k+i)+f ̂_(k+i+m))/2 mod q;
6: u←(f ̂_(k+i)-f ̂_(k+i+m))/2 mod q;
7: f ̂_(k+i)←t;
8: f ̂_(k+i+m/2)←u∙ζ^(-br(br(m/2)+r)) mod q;
9: end for
10: r←r+1
11: end for
12: end for
13: (f_0,f_1,⋯,f_(n-1)) = (F_0,F_1,⋯,F_(n-1))
14: return f=(f_0,f_1,⋯,f_(n-1))