数论变换(NTT)及其变体

参考文献:

  1. Chung C M M, Hwang V, Kannwischer M J, et al. NTT multiplication for NTT-unfriendly rings: New speed records for Saber and NTRU on Cortex-M4 and AVX2[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2021: 159-188.
  2. Boemer F, Kim S, Seifu G, et al. Intel HEXL: accelerating homomorphic encryption with intel AVX512-IFMA52[C]//Proceedings of the 9th on Workshop on Encrypted Computing & Applied Homomorphic Cryptography. 2021: 57-62.

CRT

R R R是基环 (base ring),那么 R [ x ] R[x] R[x]是一元多项式环。

如果 f , g ∈ R [ x ] f,g \in R[x] f,gR[x] g c d ( f , g ) = 1 gcd(f,g)=1 gcd(f,g)=1,那么存在环同构
ϕ : R [ x ] / ( f ( x ) g ( x ) ) ≅ R [ x ] / ( f ( x ) ) × R [ x ] / ( g ( x ) ) ϕ ( h ) = ( h m o d    f ,   h m o d    g ) \begin{aligned} \phi:R[x]/(f(x)g(x)) &\cong R[x]/(f(x)) \times R[x]/(g(x))\\ \phi(h) &= (h \mod{f},\, h \mod{g}) \end{aligned} ϕ:R[x]/(f(x)g(x))ϕ(h)R[x]/(f(x))×R[x]/(g(x))=(hmodf,hmodg)
且:
i f ϕ ( h ) = ( h f ,   h g ) l e t g f − 1 ⋅ g ≡ 1 m o d    f f g − 1 ⋅ f ≡ 1 m o d    g t h e n h ≡ h f ⋅ g ⋅ g f − 1 + h g ⋅ f ⋅ f g − 1 m o d    f g \begin{aligned} if &\\ & \phi(h) = (h_f,\, h_g)\\ let &\\ & g_f^{-1} \cdot g \equiv 1 \mod{f}\\ & f_g^{-1} \cdot f \equiv 1 \mod{g}\\ then &\\ & h \equiv h_f \cdot g \cdot g_f^{-1} + h_g \cdot f \cdot f_g^{-1} \mod{fg}\\ \end{aligned} ifletthenϕ(h)=(hf,hg)gf1g1modffg1f1modghhfggf1+hgffg1modfg

(cyclic) NTT 【模 x 2 k − 1 x^{2^k}-1 x2k1

  • FFT是DFT的快速算法,对于 n n n长向量,计算复杂度为 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)

  • NTT是工作在素域上 R = F p R=F_p R=Fp的FFT,因此它不含复数运算,计算结果没有舍入误差。

  • n = 2 k n=2^k n=2k,NTT需要寻找 x n − 1 x^n-1 xn1的本原单位根: ξ ∈ F p \xi \in F_p ξFp

  • ∃ ξ ∈ F p    ⟺    n ∣ p − 1 \exist \xi \in F_p \iff n|p-1 ξFpnp1,形如 p = 2 k p ′ + 1 p=2^kp'+1 p=2kp+1的素数,叫做NTT友好的素数 (NTT-friendly prime)

  • 给定本原元 g ∈ F p g \in F_p gFp,那么n次本原单位根为: ξ n = g p − 1 n \xi_n = g^{\frac{p-1}{n}} ξn=gnp1

  • 易知: g c d ( x − ξ i , x − ξ j ) = 1 ,   i ≢ j gcd(x-\xi^i,x-\xi^j)=1,\,i \not \equiv j gcd(xξi,xξj)=1,ij,利用CRT:
    ϕ : R [ x ] / ( x n − 1 ) → R [ x ] / ( x − 1 ) × R [ x ] / ( x − ξ ) × ⋯ × R [ x ] / ( x − ξ n − 1 ) \begin{aligned} \phi:R[x]/(x^n-1) \rightarrow R[x]/(x-1) \times R[x]/(x-\xi) \times \cdots \times R[x]/(x-\xi^{n-1})\\ \end{aligned} ϕ:R[x]/(xn1)R[x]/(x1)×R[x]/(xξ)××R[x]/(xξn1)

  • 如果 f ( x ) = ∑ i = 0 n f i x i f(x)=\sum_{i=0}^nf_ix^i f(x)=i=0nfixi,那么 f ( x ) ≡ f ( a ) m o d    x − a f(x) \equiv f(a) \mod{x-a} f(x)f(a)modxa;因此,上式为: ϕ ( f ) = [ f ( 1 ) , f ( ξ ) , ⋯   , f ( ξ n − 1 ) ] \phi(f)=[f(1),f(\xi),\cdots,f(\xi^{n-1})] ϕ(f)=[f(1),f(ξ),,f(ξn1)]

  • 当我们只关注多项式乘积时,分解的顺序不重要。由于 n = 2 k n=2^k n=2k,可利用CT蝴蝶或者GS蝴蝶实现NTT,注意比特反序

  • 由于DFT和IDFT公式相似,所以也可以用NTT计算IDFT:将 ξ \xi ξ替换为 ξ − 1 \xi^{-1} ξ1,并将结果再乘以 1 n \frac{1}{n} n1

  • 将环元素 f ( x ) ∈ R [ x ] / ( x n − 1 ) f(x) \in R[x]/(x^n-1) f(x)R[x]/(xn1)写作 n n n长的系数向量: [ f n − 1 , ⋯   , f 1 , f 0 ] [f_{n-1},\cdots,f_1,f_0] [fn1,,f1,f0]

  • 环元素乘法 h ( x ) = f ( x ) g ( x ) m o d    x n − 1 h(x) = f(x)g(x) \mod{x^n-1} h(x)=f(x)g(x)modxn1    ⟺    \iff 系数向量循环卷积 h k = f ( k ) ⊛ g ( k ) : = ∑ t = 0 n − 1 f ( k − t ) g t h_k = f(k) \circledast g(k) := \sum_{t=0}^{n-1}f_{(k-t)}g_{t} hk=f(k)g(k):=t=0n1f(kt)gt,这里 ( k − t ) : = k − t m o d    n (k-t) := k-t \mod{n} (kt):=ktmodn

  • 对于 f , g ∈ R [ x ] / ( x n − 1 ) f,g \in R[x]/(x^n-1) f,gR[x]/(xn1),做NTT分别得到 [ f ( ξ ) , ⋯   , f ( ξ n − 1 ) , f ( ξ n ) ] [f(\xi),\cdots,f(\xi^{n-1}),f(\xi^n)] [f(ξ),,f(ξn1),f(ξn)] [ g ( ξ ) , ⋯   , g ( ξ n − 1 ) , g ( ξ n ) ] [g(\xi),\cdots,g(\xi^{n-1}),g(\xi^n)] [g(ξ),,g(ξn1),g(ξn)]

  • f ( x ) g ( x )    ⟺    [ f ( ξ j ) g ( ξ j ) ] f(x)g(x) \iff [f(\xi^j)g(\xi^j)] f(x)g(x)[f(ξj)g(ξj)],左边是多项式乘积(向量卷积),右边是阵列乘积

NTT变体

Negacyclic NTT【模 x 2 k − 1 + 1 , 2 k ∣ q − 1 x^{2^{k-1}}+1,2^k \mid q-1 x2k1+1,2kq1

  • 对于 R [ x ] / ( x n + 1 ) R[x]/(x^n+1) R[x]/(xn+1),其上多项式乘法是反循环卷积 (Negacyclic convolution)。

  • 第一种解法 (直接使用NTT第 j = 1 j=1 j=1层的下半部分)

    • 如果 n = 2 k − 1 n=2^{k-1} n=2k1,寻找 2 n 2n 2n次本原单位根: ξ 2 n ∈ R \xi_{2n} \in R ξ2nR;由于 ( x 2 n − 1 ) = ( x n + 1 ) ( x n − 1 ) (x^{2n}-1)=(x^n+1)(x^n-1) (x2n1)=(xn+1)(xn1),且 g c d ( x n + 1 , x n − 1 ) = 1 gcd(x^n+1,x^n-1)=1 gcd(xn+1,xn1)=1,因此 R [ x ] / ( x 2 n − 1 ) ≅ R [ x ] / ( x n + 1 ) × R [ x ] / ( x n − 1 ) R[x]/(x^{2n}-1) \cong R[x]/(x^n+1) \times R[x]/(x^n-1) R[x]/(x2n1)R[x]/(xn+1)×R[x]/(xn1)

    • x 2 n − 1 x^{2n}-1 x2n1的所有根是 { ξ 2 n , ξ 2 n 2 , ⋯   , ξ 2 n 2 n } \{\xi_{2n},\xi_{2n}^2,\cdots,\xi_{2n}^{2n}\} {ξ2n,ξ2n2,,ξ2n2n},而 x n − 1 x^{n}-1 xn1的所有根是 { ξ 2 n 2 , ξ 2 n 4 , ⋯   , ξ 2 n 2 n } \{\xi_{2n}^2,\xi_{2n}^4,\cdots,\xi_{2n}^{2n}\} {ξ2n2,ξ2n4,,ξ2n2n},因此 x n + 1 x^{n}+1 xn+1的所有根是 { ξ 2 n 1 , ξ 2 n 3 , ⋯   , ξ 2 n 2 n − 1 } \{\xi_{2n}^1,\xi_{2n}^3,\cdots,\xi_{2n}^{2n-1}\} {ξ2n1,ξ2n3,,ξ2n2n1}

    • R [ x ] / ( x n + 1 ) ≅ R [ x ] / ( x − ξ ) × ⋯ × R [ x ] / ( x − ξ 2 n − 1 ) R[x]/(x^n+1) \cong R[x]/(x-\xi) \times \cdots \times R[x]/(x-\xi^{2n-1}) R[x]/(xn+1)R[x]/(xξ)××R[x]/(xξ2n1)

    • x n + 1 x^n+1 xn+1的Negacyclic NTT,可以看做模 x 2 n − 1 x^{2n}-1 x2n1的(cyclic) NTT的一半:先对长度 n n n { f i } \{f_i\} {fi}补零到 2 n 2n 2n长序列,计算NTT,截取结果 { f ( ξ 1 ) , f ( ξ 3 ) , ⋯   , f ( ξ 2 n − 1 ) } \{f(\xi^1),f(\xi^3),\cdots,f(\xi^{2n-1})\} {f(ξ1),f(ξ3),,f(ξ2n1)}

    • 对于IDFT,直接用上述 Negacyclic NTT 实现即可。

  • 第二种解法 (感觉更好理解)

    • Y = ξ 2 n X Y=\xi_{2n} X Y=ξ2nX,则 R [ X ] / ( X n + 1 ) ≅ R [ Y ] / ( Y n − 1 ) R[X]/(X^n+1) \cong R[Y]/(Y^n-1) R[X]/(Xn+1)R[Y]/(Yn1)
      ϕ ( ∑ i = 0 n − 1 f i x i ) : = ∑ i = 0 n − 1 f i ξ − i ( ξ x ) i = ∑ i = 0 n − 1 ( f i ξ − i ) y i ϕ − 1 ( ∑ i = 0 n − 1 g i y i ) : = ∑ i = 0 n − 1 g i ξ i ( ξ − 1 y ) i = ∑ i = 0 n − 1 ( g i ξ i ) x i \begin{aligned} \phi(\sum_{i=0}^{n-1}f_ix^i) :=& \sum_{i=0}^{n-1}f_i \xi^{-i} (\xi x)^i = \sum_{i=0}^{n-1}(f_i \xi^{-i}) y^i\\ \phi^{-1}(\sum_{i=0}^{n-1}g_iy^i) :=& \sum_{i=0}^{n-1}g_i \xi^{i} (\xi^{-1} y)^i = \sum_{i=0}^{n-1}(g_i \xi^{i}) x^i\\ \end{aligned} ϕ(i=0n1fixi):=ϕ1(i=0n1giyi):=i=0n1fiξi(ξx)i=i=0n1(fiξi)yii=0n1giξi(ξ1y)i=i=0n1(giξi)xi

    • 先把 f ( x ) ∈ R [ X ] / ( X n + 1 ) f(x) \in R[X]/(X^n+1) f(x)R[X]/(Xn+1)映射到 g = ϕ ( f ) ∈ R [ Y ] / ( Y n − 1 ) g = \phi(f) \in R[Y]/(Y^n-1) g=ϕ(f)R[Y]/(Yn1),然后做(cyclic) NTT得到 { g ( 1 ) , g ( ξ ) , ⋯   , g ( ξ n − 1 ) } \{g(1),g(\xi),\cdots,g(\xi^{n-1})\} {g(1),g(ξ),,g(ξn1)}

    • 对于IDFT,先用NTT从 { g ( ξ j ) } \{g(\xi^j)\} {g(ξj)}得到 g ∈ R [ Y ] / ( Y n − 1 ) g \in R[Y]/(Y^n-1) gR[Y]/(Yn1),然后输出 f = ϕ − 1 ( g ) f=\phi^{-1}(g) f=ϕ1(g)

Incomplete NTTs【模 x h ⋅ 2 k − 1 , 2 k ∣ q − 1 x^{h \cdot 2^k}-1,2^k \mid q-1 xh2k1,2kq1

  • 对于 f ∈ R [ x ] / ( x n − 1 ) ,   n = h ⋅ 2 k ,   2 k ∣ q − 1 f \in R[x]/(x^n-1),\,n=h \cdot 2^k,\,2^k \mid q-1 fR[x]/(xn1),n=h2k,2kq1,使用FFT对它做 k k k层分解,得到 2 k 2^k 2k R [ x ] / ( x h − ξ i ) R[x]/(x^{h}-\xi_i) R[x]/(xhξi)的直积: [ f m o d    x h − ξ i , ⋯   ] [f \mod{x^{h}-\xi_i},\cdots] [fmodxhξi,]
  • 对于 f , g ∈ R [ x ] / ( x n − 1 ) f,g \in R[x]/(x^n-1) f,gR[x]/(xn1),做不完全NTT,分别得到 [ f 1 , ⋯   , f 2 k ] [f_1,\cdots,f_{2^k}] [f1,,f2k] [ g 1 , ⋯   , g 2 k ] [g_1,\cdots,g_{2^k}] [g1,,g2k]
  • 大卷积 f ( x ) g ( x ) f(x)g(x) f(x)g(x)    ⟺    \iff 若干小卷积 [ f j ( x ) g j ( x ) ] [f_j(x)g_j(x)] [fj(x)gj(x)],左右两边都是多项式乘积
  • 对于固定参数 p , n p,n p,n的商环 F p [ x ] / ( x n − 1 ) F_p[x]/(x^n-1) Fp[x]/(xn1),根据硬件实现的差异 (寄存器、运算器的数目,支持运算数的比特长度),选择合适的分解层数,对于小卷积直接使用经典算法即可。

Good’s Trick【模 x h ⋅ 2 k − 1 , 2 k ∣ q − 1 x^{h \cdot 2^k}-1,2^k \mid q-1 xh2k1,2kq1

  • 对于 R [ x ] / ( x n − 1 ) R[x]/(x^n-1) R[x]/(xn1),假如 n = h ⋅ 2 k n=h \cdot 2^k n=h2k,其中 h h h是奇数。我们令 x = y w x=yw x=yw,且 y 2 k − 1 = − 1 ,   w h − 1 + w h − 2 + ⋯ + w = − 1 y^{2^{k-1}}=-1,\,w^{h-1}+w^{h-2}+\cdots+w=-1 y2k1=1,wh1+wh2++w=1

  • 做映射:
    ϕ : R [ x ] / ( x h ⋅ 2 k ) → R [ y , w ] x i ↦ y i m o d    2 k w i m o d    h \begin{aligned} \phi: & R[x]/(x^{h \cdot 2^k}) \rightarrow R[y,w]\\ & x^i \mapsto y^{i \mod{2^k}} w^{i \mod{h}} \end{aligned} ϕ:R[x]/(xh2k)R[y,w]xiyimod2kwimodh
    b ( y , w ) = ϕ ( a ( x ) ) b(y,w)=\phi(a(x)) b(y,w)=ϕ(a(x)),则: deg ⁡ y b < 2 k ,   deg ⁡ w b < h \deg_y b < 2^k,\,\deg_w b < h degyb<2k,degwb<h

  • b ( y , w ) = ∑ i = 0 h − 1 w i b i ( y ) b(y,w)=\sum_{i=0}^{h-1}w^ib_i(y) b(y,w)=i=0h1wibi(y),其中 b i ( y ) ∈ R [ y ] / ( y 2 k − 1 ) b_i(y) \in R[y]/(y^{2^k}-1) bi(y)R[y]/(y2k1)

  • Good’s Permutation:用一维阵列 a [ i ] a[i] a[i]记录 a ( x ) = ∑ i = 0 h ⋅ 2 k − 1 a i x i a(x) = \sum_{i=0}^{h \cdot 2^k -1}a_ix^i a(x)=i=0h2k1aixi;用二维阵列 b [ i ] [ j ] b[i][j] b[i][j]记录 b ( y , w ) = ∑ i = 0 h − 1 ∑ j = 0 2 k − 1 b i j w i y j b(y,w) = \sum_{i=0}^{h-1}\sum_{j=0}^{2^k-1}b_{ij}w^iy^j b(y,w)=i=0h1j=02k1bijwiyj,其中的每一行 b [ i ] b[i] b[i]记录了 b i ( y ) b_i(y) bi(y)

  • a ∈ R [ x ] / ( x h ⋅ 2 k − 1 ) a \in R[x]/(x^{h \cdot 2^k}-1) aR[x]/(xh2k1),我们映射到 b = ϕ ( a ) = ∑ i = 0 h − 1 w i b i ( y ) b=\phi(a)=\sum_{i=0}^{h-1}w^ib_i(y) b=ϕ(a)=i=0h1wibi(y);然后对每一行 b [ i ] b[i] b[i],并行地做 h h h次大小 2 k 2^k 2k的NTT,得到NTT域结果:阵列 B [ i ] [ j ] B[i][j] B[i][j]

  • 对于 b 1 ( y , w ) = ∑ i = 0 h − 1 w i b i ( 1 ) ( y ) b_1(y,w)=\sum_{i=0}^{h-1}w^ib_i^{(1)}(y) b1(y,w)=i=0h1wibi(1)(y) b 2 ( y , w ) = ∑ i = 0 h − 1 w i b i ( 2 ) ( y ) b_2(y,w)=\sum_{i=0}^{h-1}w^ib_i^{(2)}(y) b2(y,w)=i=0h1wibi(2)(y),乘积为:
    b 1 ( y , w ) b 2 ( y , w ) = ∑ t = 0 h − 1 ∑ i = 0 h − 1 [ b t − i ( 1 ) ( y ) b i ( 2 ) ( y ) ] w t m o d    w h − 1 b_1(y,w)b_2(y,w) = \sum_{t=0}^{h-1}\sum_{i=0}^{h-1} [b_{t-i}^{(1)}(y) b_i^{(2)}(y)] w^t \mod{w^h-1} b1(y,w)b2(y,w)=t=0h1i=0h1[bti(1)(y)bi(2)(y)]wtmodwh1
    且: b ( 3 ) ( y ) = ∑ i = 0 h − 1 b t − i ( 1 ) ( y ) b i ( 2 ) ( y )    ⟺    ∀ j ,   b ( 3 ) ( ξ j ) = ∑ i = 0 h − 1 b t − i ( 1 ) ( ξ j ) b i ( 2 ) ( ξ j ) b^{(3)}(y) = \sum_{i=0}^{h-1} b_{t-i}^{(1)}(y) b_i^{(2)}(y) \iff \forall j,\, b^{(3)}(\xi^j) = \sum_{i=0}^{h-1} b_{t-i}^{(1)}(\xi^j) b_i^{(2)}(\xi^j) b(3)(y)=i=0h1bti(1)(y)bi(2)(y)j,b(3)(ξj)=i=0h1bti(1)(ξj)bi(2)(ξj)

  • 多项式乘积

    • 对于 a 1 , a 2 ∈ R [ x ] / ( x h ⋅ 2 k − 1 ) a_1,a_2 \in R[x]/(x^{h \cdot 2^k}-1) a1,a2R[x]/(xh2k1),为了计算 a 1 ( x ) a 2 ( x ) a_1(x)a_2(x) a1(x)a2(x),我们先得到 B 1 [ i ] [ j ] ,   B 2 [ i ] [ j ] B_1[i][j],\,B_2[i][j] B1[i][j],B2[i][j]
    • 阵列的第 j j j列,表示定点 y = ξ j y=\xi^j y=ξj处的关于 w w w的模 w h − 1 w^h-1 wh1的多项式
    • B 1 B_1 B1 B 2 B_2 B2的第 j j j列做循环卷积 (这对应于 h = 1 h=1 h=1时的阵列乘),也就是定点 y = ξ j y=\xi^j y=ξj处的关于 w w w的两个多项式乘积: b 1 ( y , w ) b 2 ( y , w )    ⟺    [ ∑ i = 0 h − 1 b t − i ( 1 ) ( ξ j ) b i ( 2 ) ( ξ j ) m o d    w h − 1 ] b_1(y,w)b_2(y,w) \iff [\sum_{i=0}^{h-1} b_{t-i}^{(1)}(\xi^j) b_i^{(2)}(\xi^j) \mod{w^h-1}] b1(y,w)b2(y,w)[i=0h1bti(1)(ξj)bi(2)(ξj)modwh1]
    • 最后,对结果阵列 B 3 B_3 B3做并行的 h h h个INTT,得到 b 3 = b 1 b 2 b_3=b_1b_2 b3=b1b2,并输出结果 a 3 = ϕ − 1 ( b 3 ) = a 1 a 2 a_3=\phi^{-1}(b_3) = a_1a_2 a3=ϕ1(b3)=a1a2
  • 复杂度: 2 h   O ( 2 k log ⁡ 2 k ) + 2 k   O ( h 2 ) = O ( 2 n log ⁡ n h ) + O ( n h ) 2h\,O(2^k\log 2^k) + 2^k\,O(h^2) = O(2n\log\dfrac{n}{h})+O(nh) 2hO(2klog2k)+2kO(h2)=O(2nloghn)+O(nh);当 h → 1 h \rightarrow 1 h1时为 O ( n log ⁡ n ) O(n \log n) O(nlogn),当 h → n h \rightarrow n hn时为 O ( n 2 ) O(n^2) O(n2)

    也就是说,对于 n = h ∗ 2 0 n=h*2^0 n=h20,对于 R [ x ] / ( x n − 1 ) R[x]/(x^n-1) R[x]/(xn1)上的多项式乘积 NTT 没用?奥,我们可以模 x n ′ − 1 x^{n'}-1 xn1嘛,保证 n ′ > 2 n n'>2n n>2n就行了。

  • 为什么我觉得它和不完全NTT一模一样呢?

环嵌入【模 q ≠ 2 k p ′ + 1 q \not = 2^kp'+1 q=2kp+1

  • 如果我们需要计算 Z q [ x ] / ( x n − 1 ) Z_q[x]/(x^n-1) Zq[x]/(xn1)上的多项式乘积,但是 n = 2 k ∤ q − 1 n=2^k \not \mid q-1 n=2kq1,即 q ≠ 2 k p ′ + 1 q \not = 2^kp'+1 q=2kp+1,于是 Z q Z_q Zq中不存在n次本原单位根。
  • 对于 f , g ∈ Z q [ x ] / ( x n − 1 ) f,g \in Z_q[x]/(x^n-1) f,gZq[x]/(xn1),令它们的系数范围是: f i ,   g i  mod ±   q ∈ [ − q 2 , q 2 ) f_i,\,g_i \text{ mod}^\pm\, q \in [-\dfrac{q}{2},\dfrac{q}{2}) fi,gi mod±q[2q,2q)。容易知道,多项式乘积 f ( x ) g ( x ) f(x)g(x) f(x)g(x)的每一项的绝对值大小至多是 n q 2 4 \dfrac{nq^2}{4} 4nq2
  • 我们选取一个NTT友好的大素数 p > n q 2 2 p > \dfrac{nq^2}{2} p>2nq2,满足 n ∣ p − 1 n \mid p-1 np1
  • 我们把 f , g ∈ Z q [ x ] / ( x n − 1 ) f,g \in Z_q[x]/(x^n-1) f,gZq[x]/(xn1)映射到 f ′ , g ′ ∈ Z p [ x ] / ( x n − 1 ) f',g' \in Z_p[x]/(x^n-1) f,gZp[x]/(xn1),这里就是简单的系数嵌入 ϕ : a ∈ Z p ↦ a ∈ Z q \phi:a \in Z_p \mapsto a \in Z_q ϕ:aZpaZq
  • f , g f,g f,g嵌入到 Z p [ x ] / ( x n − 1 ) Z_p[x]/(x^n-1) Zp[x]/(xn1)中得到 f ′ , g ′ f',g' f,g,计算多项式乘积,然后简单取模即可: f ( x ) g ( x ) ≡ f ′ ( x ) g ′ ( x ) m o d    q f(x)g(x) \equiv f'(x)g'(x) \mod{q} f(x)g(x)f(x)g(x)modq
  • 由于 p > n q 2 2 p > \dfrac{nq^2}{2} p>2nq2,因此乘积的系数不会模掉 p p p,所以上述结果一定正确。由于 n ∣ p − 1 n \mid p-1 np1,因此可以利用NTT加速多项式乘法。

多模数【模 q ≠ 2 k p ′ + 1 q \not = 2^kp'+1 q=2kp+1

  • 这是解决 n = 2 k ∤ q − 1 n=2^k \not \mid q-1 n=2kq1的另一种方案。

  • 我们挑选一系列的NTT友好的小素数 { p j } \{p_j\} {pj},满足 n ∣ p j − 1 n \mid p_j-1 npj1 P = ∏ j p j > n q 2 2 P=\prod_j p_j > \dfrac{nq^2}{2} P=jpj>2nq2

  • 我们把 f , g ∈ Z q [ x ] / ( x n − 1 ) f,g \in Z_q[x]/(x^n-1) f,gZq[x]/(xn1)映射到 f ′ , g ′ ∈ Z P [ x ] / ( x n − 1 ) f',g' \in Z_P[x]/(x^n-1) f,gZP[x]/(xn1),这里也是简单的系数嵌入。计算 f ′ ( x ) g ′ ( x ) m o d    q f'(x)g'(x)\mod{q} f(x)g(x)modq即可,且由于 P > n q 2 2 P > \dfrac{nq^2}{2} P>2nq2,所以结果一定正确。

  • 根据CRT,定义如下双射 (因为 g c d ( p i , p j ) = 1 gcd(p_i,p_j)=1 gcd(pi,pj)=1):
    ϕ : f ′ m o d    P ↦ [ f ′ m o d    p 1 ,    ⋯   ,    f ′ m o d    p s ] \begin{aligned} \phi:f'\mod{P} \mapsto [f'\mod{p_1},\,\,\cdots,\,\,f'\mod{p_s}] \end{aligned} ϕ:fmodP[fmodp1,,fmodps]
    利用CRT的求解公式,当然是可以的;但有一种更高效的迭代算法,Garner’s Algorithm

    假设有同余方程组 u ≡ u i m o d    p i u \equiv u_i \mod{p_i} uuimodpi,且满足: ∣ u i ∣ < p i 2 ,   ∣ u ∣ < P 2 |u_i|<\dfrac{p_i}{2},\,|u|<\dfrac{P}{2} ui<2pi,u<2P

    那么,
    y 1 = u 1 y 2 = y 1 + ( ( u 2 − y 1 ) m 2 m o d    ± p 2 ) ⋅ p 1 y 3 = y 2 + ( ( u 3 − y 2 ) m 3 m o d    ± p 3 ) ⋅ p 1 p 2 ⋮ y s = y s − 1 + ( ( u s − y s − 1 ) m s m o d    ± p s ) ⋅ p 1 p 2 ⋯ p s − 1 \begin{aligned} y_1 &= u_1\\ y_2 &= y_1 + ((u_2-y_1)m_2 \mod{{}^\pm p_2}) \cdot p_1\\ y_3 &= y_2 + ((u_3-y_2)m_3 \mod{{}^\pm p_3}) \cdot p_1p_2\\ & \vdots\\ y_s &= y_{s-1} + ((u_s-y_{s-1})m_s \mod{{}^\pm p_s}) \cdot p_1p_2\cdots p_{s-1}\\ \end{aligned} y1y2y3ys=u1=y1+((u2y1)m2mod±p2)p1=y2+((u3y2)m3mod±p3)p1p2=ys1+((usys1)msmod±ps)p1p2ps1
    其中 m i : = ( p 1 p 2 ⋯ p i − 1 ) − 1 m o d    ± p i m_i:=(p_1p_2\cdots p_{i-1})^{-1} \mod{{}^\pm p_i} mi:=(p1p2pi1)1mod±pi,那么 u = y s u=y_s u=ys

    算法结果正确,且对于小的 s s s,上述迭代算法比CRT更高效

  • 计算多项式乘法

    • f , g f,g f,g嵌入到 Z p [ x ] / ( x n − 1 ) Z_p[x]/(x^n-1) Zp[x]/(xn1)中得到 f ′ , g ′ f',g' f,g
    • 做映射,得到 [ f i ′ ( x ) m o d    p i ] ,   [ g i ′ ( x ) m o d    p i ] [f'_i(x) \mod{p_i}],\,[g'_i(x) \mod{p_i}] [fi(x)modpi],[gi(x)modpi]
    • 对每个对应的分量,分别计算多项式乘积 (利用NTT),得到序列 [ ( f ′ g ′ ) i ( x ) m o d    p i ] [(f'g')_i(x) \mod{p_i}] [(fg)i(x)modpi]
    • 求解方程组 ( f ′ g ′ ) ≡ ( f ′ g ′ ) i m o d    p i (f'g') \equiv (f'g')_i \mod{p_i} (fg)(fg)imodpi,最后 ( f g ) ≡ ( f ′ g ′ ) m o d    q (fg) \equiv (f'g') \mod{q} (fg)(fg)modq

总结

  • 快速数论变换 ( NTT) 实现时域、频域之间的快速转换。使用DFT的卷积性质,可加速 Z q [ x ] / ( x n − 1 ) Z_q[x]/(x^n-1) Zq[x]/(xn1)上多项式乘积的计算。时间复杂度: 2   O ( n log ⁡ n ) + O ( n ) = O ( n log ⁡ n ) 2\,O(n \log n)+O(n) = O(n \log n) 2O(nlogn)+O(n)=O(nlogn)
  • 一、对于环 Z q [ x ] / ( x n − 1 ) ,   n ∣ q − 1 ,   n = 2 k Z_q[x]/(x^n-1),\, n \mid q-1,\, n=2^k Zq[x]/(xn1),nq1,n=2k,用NTT可以直接求解。
  • 二、对于环 Z q [ x ] / ( x n + 1 ) ,   n ∣ q − 1 ,   n = 2 k − 1 Z_q[x]/(x^n+1),\, n \mid q-1,\, n=2^{k-1} Zq[x]/(xn+1),nq1,n=2k1,用Negacyclic NTT,做映射,在 Z q [ Y ] / ( Y n − 1 ) Z_q[Y]/(Y^n-1) Zq[Y]/(Yn1)上利用NTT求解。
  • 三、对于环 Z q [ x ] / ( x n − 1 ) ,   n ∣ q − 1 ,   n = h ⋅ 2 k Z_q[x]/(x^n-1),\, n \mid q-1,\, n=h \cdot 2^k Zq[x]/(xn1),nq1,n=h2k,用Good’s Trick,将一元多项式映射为二元多项式 (以一元多项式为系数的一元多项式),然后利用NTT求解。
  • 四、对于环 Z q [ x ] / ( x n − 1 ) ,   n ∤ q − 1 ,   n = 2 k Z_q[x]/(x^n-1),\, n \not \mid q-1,\, n=2^k Zq[x]/(xn1),nq1,n=2k,用环嵌入,找到一个NTT友好的素数 n ∣ p − 1 n \mid p-1 np1,然后用NTT求解。
  • 五、对于环 Z q [ x ] / ( x n − 1 ) ,   n ∤ q − 1 ,   n = 2 k Z_q[x]/(x^n-1),\, n \not \mid q-1,\, n=2^k Zq[x]/(xn1),nq1,n=2k,用多模数,找到一系列NTT友好的素数 n ∣ p i − 1 n \mid p_i-1 npi1,然后用NTT分别求解,并用CRT组合结果。
  • 六、对于环 Z q [ x ] / ( x n − 1 ) ,   n ∣ q − 1 ,   n = h Z_q[x]/(x^n-1),\, n \mid q-1,\, n=h Zq[x]/(xn1),nq1,n=h h h h是奇数,那么直接用Good’s Trick对多项式乘积没有帮助。我们可以寻找 n ′ = h ′ × 2 k > 2 n n'=h' \times 2^k > 2n n=h×2k>2n,并寻找相应的 n ′ ∣ q ′ − 1 n' \mid q'-1 nq1;然后在 Z q ′ [ x ] / ( x n ′ − 1 ) Z_{q'}[x]/(x^{n'}-1) Zq[x]/(xn1)上计算多项式乘积,最后结果 f g = ( f ′ g ′ ) m o d    q , x n − 1 fg = (f'g') \mod{q,x^n-1} fg=(fg)modq,xn1即可。 要保证两个n长多项式一次相乘后不会模 x n ′ − 1 x^{n'}-1 xn1,以保证最终结果正确,所以要 n ′ > 2 n n' > 2n n>2n
  • 七、对于环 Z q [ x ] / ( x n − 1 ) ,   n ∤ q − 1 ,   n = h ⋅ 2 k Z_q[x]/(x^n-1),\, n \not \mid q-1,\, n=h \cdot 2^k Zq[x]/(xn1),nq1,n=h2k,先用环嵌入或者多模数,使得 n ∣ p − 1 n \mid p-1 np1或者 n ∣ p i − 1 n \mid p_i-1 npi1;这样问题就转化为了若干个问题“三”;用Good’s Trick,将一元多项式映射为二元多项式,然后利用NTT求解。
  • 我们可以解决“六”和“七”,也就是说,对于任意的参数 q , n q,n q,n,环 Z q [ x ] / ( x n ± 1 ) Z_q[x]/(x^n \pm 1) Zq[x]/(xn±1)上多项式乘积都可以用NTT快速计算。
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《初等数论及其应用》是一本关于数论的教材,介绍了数论的基本概念、定理和证明方法,并探讨了数论在实际问题中的应用。 数论数学的一个分支,研究整数的性质和规律。《初等数论及其应用》首先介绍了整数、素数、最大公因数和最小公倍数等基本概念。然后讨论了素数的性质,包括素数的无穷性、素数分布的规律和素数定理等。接着介绍了数论中的重要定理,如费马小定理、欧拉定理和中国剩余定理等,以及它们的证明方法。此外,书中还包含了一些经典的数论问题和解法,如高斯平方和、尼科彻斯定理和无穷数列求和等。 除了介绍基本概念和定理外,该书还强调了数论在密码学、编码理论和计算机科学等领域中的应用。其中,密码学是数论的一个重要应用方向,通过利用数论中的一些难题和性质,可以设计出安全可靠的密码算法。此外,编码理论是应用数论研究信号编码和纠错编码的一门学科,数论中的一些技术和方法对编码理论的研究具有重要意义。计算机科学领域也广泛应用了数论中的一些概念和方法,如素数测试、大整数运算和随机数生成等。 总之,《初等数论及其应用》是一本系统介绍数论基本概念、定理和应用的教材。通过学习该书,读者可以了解数论的基础知识,掌握数论的基本方法和证明技巧,并了解数论在实际问题中的广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值