NTT(Number Theoretic Transforms)(二)

提示: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(n1)x(n1)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++fn1ζn/4xn/21=(f0+fn/2ζn/4)+(f1+fn/2+1ζn/4)x++(fn/21+fn1ζn/4)xn/21. 同理右子节点模 ( 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} (f0fn/2ζn/4)+(f1fn/2+1ζn/4)x++(fn/21fn1ζn/4)xn/21
到了第三层,两边分别往下模 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=fkfk+n/2ζn/4,其中 0 ≤ k < n / 2 0≤k<n/2 0k<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′′=fkfk+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/2fk+3n/4ζ3n/8其中 0 ≤ k < n / 4 0≤k<n/4 0k<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∣(q1)。此次不存在16次本原单位根,即 16 ∤ ( q − 1 ) 16\nmid(q-1) 16(q1)
第二层左子节点为模 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 ) (f0f4ζ2),(f1f5ζ2),(f2f6ζ2),(f3f7ζ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 ) (f0f2ζ)=(f0+f2ζ5),(f1f3ζ)=(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 ) (f4f6ζ)=(f4+f6ζ5),(f1f3ζ)=(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=fkfk+4ζ2,其中 0 ≤ k < 4 0\le k<4 0k<4

五、蝶形结构

由上述计算过程便可看出FFT中的蝶形结构,还是以7次多项式为例,类似地,当存在2n次即16次本原单位根时,NNT可进行和FFT一样的计算思想。
蝶形单元
总体计算情况如下所示。
NTT
其中 φ = ζ 16 \varphi=\zeta_{16} φ=ζ16 ω = φ 2 \omega=\varphi^2 ω=φ2,类似NTT逆变换也同样具有蝶形结构:
INTT
通过第四章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_{\log⁡n-1}(1)} ζbrlogn1(1), ζ b r log ⁡ ⁡ n − 1 ( 2 ) \zeta^{br_{\log⁡n-1}(2)} ζbrlogn1(2) ζ b r log ⁡ ⁡ n − 1 ( 3 ) \zeta^{br_{\log⁡n-1}(3)} ζbrlogn1(3) ζ b r log ⁡ ⁡ n − 1 ( 5 ) \zeta^{br_{\log⁡n-1}(5)} ζbrlogn1(5) ⋯ \cdots 。此时NTT蝶形变换为:蝶形单元2
其中 0 ≤ k < n 2 j − 1 0≤k<\frac{n}{2^{j-1}} 0k<2j1n j j j为NTT变换的层级, r r r为从0开始的前 2 j − 2 2^{j-2} 2j2个偶数。根据此规律可以写出如下伪代码。

六、伪代码

首先是正序下的NTT变换,即伪代码中层数 j j j从1到 log ⁡ n − 1 \log n-1 logn1

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 log⁡n-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 log⁡n-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 logn1到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 log⁡n-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 log⁡n-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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值