【NTT(Number Theoretic Transforms)(一)】

提示: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∣∣(q1),所以有限域 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=0127(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 logn1位二进制表示比特翻转,即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=0127f2jζ(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=0127f2j+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^2ig^2i+f^2i+1g^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^2ig^2i+1+f^2i+1g^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 n1次多项式有两种表述方式,一种便是由 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++fn1xn1,也可表述为满足 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)),,(xn1,f(xn1)) n − 1 n-1 n1多项式,其中 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(n1),f(xn1)g(xn1))得到。于是可寻找 n n n个不同的自变量 x 0 , x 1 , ⋯ , x n − 1 x_0,x_1,⋯,x_{n-1} x0,x1,,xn1,分别计算 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πik/n,其中 k = 0 , 1 , 2 , ⋯ , n − 1 k=0,1,2,⋯,n-1 k=0,1,2,,n1;NTT便取有限域中的 n n n个本原单位根。于是离散傅里叶变换即为计算 f ( e 2 π i ⋅ k / n ) f(e^{2πi\cdot k/n}) f(e2πik/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=0n1fj(e2πik/n)j=j=0n1fje2kjπi/n.逆变换便是由 ( F 0 , F 1 , ⋯ , F n − 1 ) (F_0,F_1,⋯,F_{n-1}) (F0,F1,,Fn1)计算 ( f 0 , f 1 , ⋯ , f n − 1 ) (f_0,f_1,⋯,f_{n-1}) (f0,f1,,fn1),上述式子利用矩阵的形式表示为:
( 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} F0F1Fn1 = 1111e2πi1/ne2πi(n1)/n1(e2πi1/n)n1(e2πi(n1)/n)n1 f0f1fn1 所以有: ( 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} f0f1fn1 = 1111e2πi1/ne2πi(n1)/n1(e2πi1/n)n1(e2πi(n1)/n)n1 1 F0F1Fn1 因为由单位根构成的系数矩阵为一个范德蒙德矩阵,所以该矩阵的逆容易求出,即: ( 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} f0f1fn1 =n1 1111e2πi1/ne2πi(n1)/n1(e2πi1/n)n1(e2πi(n1)/n)n1 F0F1Fn1 故离散傅里叶逆变换为: 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=0n1Fk(e2πij/n)k=n1k=0n1Fke2kjπ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,,ζ2n2n1)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=0n1fj(ζ2n2k+1)j=k=0n1fjζ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=0n1f^k(ζ2n(2j+1))k=n1k=0n1f^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ζ2n1). ζ 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,,ζ2n2n1)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(ζ2n2n1))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^2f^n2f^1f^n1 =(A00A) f0f2fn2f1fn1 其中: 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= 111ζn(2brlogn1(0)+1)×1ζn(2brlogn1(1)+1)×1ζn(2brlogn1(2n2)+1)×1ζn(2brlogn1(0)+1)×2n2ζn(2brlogn1(0)+1)×2n2ζn(2brlogn1(2n2)+1)×2n2 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=(A100A1)所以上述逆变换变为了求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}} A1= 111ζn(2brlogn1(0)+1)×1ζn(2brlogn1(1)+1)×1ζn(2brlogn1(2n2)+1)×1ζn(2brlogn1(0)+1)×2n2ζn(2brlogn1(0)+1)×2n2ζn(2brlogn1(2n2)+1)×2n2 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=0n/21f^2jζn(2brlogn1(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=0n/21f^2j+1ζn(2brlogn1(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πi2k/n=e2πik/(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πik/n+πi=e2πik/n=wnk. 同理,有限域 Z q \Z_q Zq中的 n n n次本原单位根( n n n整除 q − 1 q-1 q1)也有该性质,令 ξ \xi ξ Z q \Z_q Zq乘法群中的生成元, n n n次单位根即为 ζ n = ξ ( q − 1 ) / n \zeta_n=\xi^{(q-1)/n} ζn=ξ(q1)/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=ξnq1×2k=ξn/2q1×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=ξnq1×(k+n/2)=ξnq1×kξ(q1)/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++fn2xn2+fn1xn1=f0+f2x2++fn2xn2+x(f1+f3x2++fn1xn2):=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(n2)X(n2)/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(n1)X(n2)/2. 因此计算一个 n − 1 n-1 n1次多项式的值变为计算两个 ( n − 2 ) / 2 (n-2)/2 (n2)/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 n1次多项式的乘法计算复杂度由原来的 O ( n 2 ) O(n^2) O(n2)变为 O ( n log ⁡ ⁡ n ) O(n\log⁡n ) 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∣(q1)。同样先考存在 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=f0f4ζ41;f2=f2+f6ζ41,f6=f2f6ζ41;f1=f1+f5ζ41,f5=f1f5ζ41;f3=f3+f7ζ41,f7=f3f7ζ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+ζ81f2,f2′′=f0ζ81f2;f4′′=f4+ζ83f6,f6′′=f4ζ83f6;f1′′=f1+ζ81f3,f3′′=f1ζ81f3;f5′′=f5+ζ83f7,f7′′=f5ζ83f7; 最后,计算 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′′+ζ161f1′′;F4=f(ζ169)=f0′′ζ161f1′′;F2=f(ζ165)=f2′′+ζ165f3′′;F6=f(ζ1613)=f2′′ζ165f3′′;F1=f(ζ163)=f4′′+ζ163f5′′;F5=f(ζ1611)=f4′′ζ163f5′′;F3=f(ζ167)=f6′′+ζ167f7′′;F7=f(ζ1615)=f6′′ζ167f7′′;接下来将在下一篇文章中介绍NTT中与FFT类似的快速计算方法以及相应伪代码。欢迎大家交流指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值