新概念洋務軟件密碼學FHE之NTT()Matrix-based NTT
ChrisChenFour-step NTT 推导
我们知道,在具体的硬件实现中,我们往往把大规模的数据存储为矩阵的形式,因为这样既方便索引,也方便并行计算。因此我们可以考虑将最初的N个采样值存储为矩阵形式,矩阵大小为N1×N2 (N1,N2∈Z+且N1×N2=N),这样我们就可以多行并行计算。
以16 point NTT为例,如图,我们可以将16 point NTT分解为4个4 point NTT并行计算,提高效率。
PWC NTT
原始公式
z[k]=i=0∑N−1x(i)ωNik modp(1)
where ωN=gNp−1modq
矩阵分解
现对N进行如下分解:
N=N1×N2, N1,N2∈Z+(2)
此时输入向量x可排列为N2×N1矩阵,我们采用X来表示;输出向量z可排列为N1×N2矩阵,我们采用Z来表示。
规定下标
将向量转化为矩阵后,我们需要对(1)下标重新规定(reindexing):
{k=k1+N2k2, k1∈[0,N2−1] k2∈[0,N1−1]i =i1+N1i2, i1∈[0,N1−1] i2∈[0,N2−1](3)
此时输入矩阵可索引为X[i2,i1],输出矩阵可索引为Z[k2,k1]
注:此处X和Z形状不同,是因为中间需要进行一次转置。
推导
注:为了推导方便,以下公式将省略modq
将(3)式代入(1)式,可得
z[k1+N2k2]=i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)ωN(i1+N1i2)(k1+N2k2)=i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)ωNi1k1ωNi1N2k2ωNi2N1k1ωNi2k2N1N2(4)
注意到{N=N1×N2,ωN=gNp−1=gN1×N2p−1,所以(4)式中的各个ω可化简为
⎩⎨⎧ωNi1k1=ωN1N2i1k1ωni1N2k2=ωN1i1k2ωni2N1k1=ωN2i2k1ωNi2k2N1N2=g(p−1)i2k2≡1(5)
将(5)代入(4)可得
z[k1+N2k2]=i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)ωN1N2i1k1ωN1i1k2ωN2i2k1=N1-point PWC NTTi1=0∑N1−1[dot productωN1N2i1k1⋅N2-point PWC NTTi2=0∑N2−1x(i1+N1i2)ωN2i2k1]ωN1i1k2(6)
观察
-
逐列进行PWC NTT
注意到(6)式中的∑i2=0N2−1x(i1+N1i2)ωN2i2k1即为对N2× N1矩阵X的第i1列进行PWC NTT变换
记变换后的矩阵为Y(Y亦为N2×N1矩阵)
-
点乘旋转因子(twisting factors)
而后矩阵Y逐个元素乘上旋转因子ωN1N2i1k1
Y′[k1,i1]=ωN1N2i1k1Y[k1,i1] (7)
-
逐行进行PWC NTT
将(7)代入(6)式可得
z[k1+N2k2]=i1=0∑N1−1Y′[k1,i1]ωN1i1k2(8)
该式实为对矩阵Y′的第k1行进行PWC NTT变换。
-
转置
注意到(8)中等号右边得到的矩阵形状为N2×N1,要想得到最终的输出矩阵Z(N1×N2),我们需要再对等号右边的矩阵进行转置,得到N1×N2矩阵。
总结
PWC INTT
原始公式
z[k]=N−1i=0∑N−1x(i)ωN−ik modp(1)
where ωN=gNp−1modq
注:N−1指的是N在modq意义下的乘法逆元。
推导
注意到PWC INTT和PWC NTT的公式基本无异,只不过N次单位根取的是ωN的乘法逆元ωN−1,以及最后需要和N的乘法逆元相乘。由于求乘法逆元的运算性质和求-1次方相同,于是
N−1=(N1N2)−1=N1−1N2−1(2)
最终(1)式可化为
z[k1+N2k2]=N1−1N2−1i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)ωN1N2−i1k1ωN1−i1k2ωN2−i2k1=N1-point PWC INTTN1−1i1=0∑N1−1[dot productωN1N2−i1k1⋅N2-point PWC INTTN2−1i2=0∑N2−1x(i1+N1i2)ωN2−i2k1]ωN1−i1k2(3)
观察与总结
我们进行与PWC NTT类似的观察,可得PWC INTT的矩阵分解版本步骤如下:
NWC NTT
原始公式
z[k]=i=0∑N−1x(i)γ2NiωNik modp(1)
where
{ωN=gNp−1modpγ2N=ωNmodp=g2Np−1modp
矩阵分解
现对N进行如下分解:
N=N1×N2, N1,N2∈Z+(2)
此时输入向量x可排列为N2×N1矩阵,我们采用X来表示;输出向量z可排列为N1×N2矩阵,我们采用Z来表示。
规定下标
将向量转化为矩阵后,我们需要对(1)下标重新规定(reindexing):
{k=k1+N2k2, k1∈[0,N2−1] k2∈[0,N1−1]i =i1+N1i2, i1∈[0,N1−1] i2∈[0,N2−1](3)
此时输入矩阵可索引为X[i2,i1],输出矩阵可索引为Z[k2,k1]
注:此处X和Z形状不同,是因为中间需要进行一次转置。
推导
注:为了推导方便,以下公式将省略modq
将(3)式代入(1)式,可得
z[k1+N2k2]=i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)γ2Ni1+N1i2ωN(i1+N1i2)(k1+N2k2)=i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)γ2Ni1γ2NN1i2ωNi1k1ωNi1N2k2ωNi2N1k1ωNi2k2N1N2(4)
注意到⎩⎨⎧N=N1×N2,ωN=gNp−1=gN1×N2p−1γ2N=g2N1×2N2p−1,所以(4)式中的各个ω可化简为
⎩⎨⎧ωNi1k1=ωN1N2i1k1ωni1N2k2=ωN1i1k2ωni2N1k1=ωN2i2k1ωNi2k2N1N2=g(p−1)i2k2≡1{γ2Ni1=γ2Ni1γ2NN1i2=γ2N2i2(5)
将(5)代入(6)可得
z[k1+N2k2]=i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)γ2Ni1γ2N2i2ωN1N2i1k1ωN1i1k2ωN2i2k1=N1-point PWC NTTi1=0∑N1−1[dot productωN1N2i1k1γ2Ni1⋅N2-point NWC NTTi2=0∑N2−1x(i1+N1i2)γ2N2i2ωN2i2k1]ωN1i1k2(6)
观察
-
逐列进行NWC NTT
注意到(6)式中的∑i2=0N2−1x(i1+N1i2)γ2N2i2ωN2i2k1即为对N2× N1矩阵X的第i1列进行NWC NTT变换
记变换后的矩阵为Y(Y亦为N2×N1矩阵)
-
点乘旋转因子(twisting factors)
而后矩阵Y逐个元素乘上旋转因子ωN1N2i1k1γ2Ni1
Y′[k1,i1]=ωN1N2i1k1γ2Ni1Y[k1,i1] (7)
-
逐行进行PWC NTT
将(7)代入(8)式可得
z[k1+N2k2]=i1=0∑N1−1Y′[k1,i1]ωN1i1k2(8)
该式实为对矩阵Y′的第k1行进行PWC NTT变换。
-
转置
注意到(8)中等号右边得到的矩阵形状为N2×N1,要想得到最终的输出矩阵Z(N1×N2),我们需要再对等号右边的矩阵进行转置,得到N1×N2矩阵。
总结
NWC INTT
原始公式
z[k]=N−1γ2N−ki=0∑N−1x(i)ωN−ik modp(1)
where
{ωN=gNp−1modpγ2N=ωNmodp=g2Np−1modp
矩阵分解
现对N进行如下分解:
N=N1×N2, N1,N2∈Z+(2)
此时输入向量x可排列为N2×N1矩阵,我们采用X来表示;输出向量z可排列为N1×N2矩阵,我们采用Z来表示。
规定下标
将向量转化为矩阵后,我们需要对(1)下标重新规定(reindexing):
{k=k1+N2k2, k1∈[0,N2−1] k2∈[0,N1−1]i =i1+N1i2, i1∈[0,N1−1] i2∈[0,N2−1](3)
此时输入矩阵可索引为X[i2,i1],输出矩阵可索引为Z[k2,k1]
注:此处X和Z形状不同,是因为中间需要进行一次转置。
推导
注:为了推导方便,以下公式将省略modq
将(3)式代入(1)式,可得
z[k1+N2k2]=N−1γ2N−(k1+N2k2)i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)ωN−(i1+N1i2)(k1+N2k2)=N−1i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)γ2N−k1γ2N−N2k2ωN−i1k1ωN−i1N2k2ωN−i2N1k1ωN−i2k2N1N2(4)
注意到⎩⎨⎧N=N1×N2,ωN−1=g−Np−1=g−N1×N2p−1γ2N−1=g−2N1×2N2p−1,所以(4)式中的各个ω可化简为
⎩⎨⎧ωN−i1k1=ωN1N2−i1k1ωn−i1N2k2=ωN1−i1k2ωn−i2N1k1=ωN2−i2k1ωN−i2k2N1N2=g−(p−1)i2k2≡1{γ2N−i1=γ2N−k1γ2N−N2k2=γ2N1−k2(5)
另外,正如其数学表示,求乘法逆元的运算性质和求−1次方是一样的。这意味着
N−1=(N1N2)−1=N1−1N2−1(6)
将(5)和(6)代入(4)可得
z[k1+N2k2]=N1−1N2−1γ2N−k1γ2N1−k2i1=0∑N1−1i2=0∑N2−1x(i1+N1i2)ωN1N2−i1k1ωN1−i1k2ωN2−i2k1=N1-point NWC INTTN1−1i1=0∑N1−1[dot productωN1N2−i1k1γ2N−k1⋅N2-point PWC INTTN2−1i2=0∑N2−1x(i1+N1i2)ωN2−i2k1]ωN1−i1k2γ2N1−k2(7)
观察与总结
我们进行与NWC NTT类似的观察,可以发现NWC INTT的矩阵分解步骤为:
总结
在将N维向量排成N2×N1矩阵后,各个版本的NTT、INTT运算步骤如下:
- PWC NTT:逐列PWC NTT→点乘→逐行PWC NTT→转置
- PWC INTT:逐列PWC INTT→点乘→逐行PWC INTT→转置
- NWC NTT:逐列NWC NTT→点乘→逐行PWC INTT→转置
- NWC INTT:逐列PWC INTT→点乘→逐行NWC INTT→转置
注意NWC矩阵分解后的子运算中既有NWC,又有PWC。