经典的 NTT,其适用范围是NTT 友好素域上多项式商环

对于 NTT 不友好的素域上多项式商环,可以使用 Negacyclic NTT、Incomplete NTT、Good’s Trick、Multiple Moduli等等 NTT 变体

本文目的:

  • 基于 NTT,加速有限域元素的乘积。
  • 将 NTT 的适用范围,扩展到 NTT 友好有限域上多项式商环
  • 对于 NTT 不友好的有限域上多项式商环,给出相关的 NTT 变体

GF 上多项式

  • 一元多项式环:R=GF(q)[x]/(xn±1)R = GF(q)[x]/(x^n \pm 1)R=GF(q)[x]/(xn±1)

  • 一元多项式:f(x)∈Rf(x) \in Rf(x)∈R,表示为
    f(x)=∑i=0n−1f[i]xi,f[i]∈GF(q)f(x) = \sum_{i=0}^{n-1} f[i] x^i,\, f[i] \in GF(q) f(x)=i=0∑n−1​f[i]xi,f[i]∈GF(q)
    其中阵列f[]f[]f[]是f(x)f(x)f(x)的系数向量,f[]∈GF(q)nf[] \in GF(q)^nf[]∈GF(q)n

  • 假设素域是Fp≅ZpF_p \cong Z_pFp​≅Zp​且q=pdq=p^dq=pd,那么GF(q)≅Zp[x]/(m(x))GF(q) \cong Z_p[x]/(m(x))GF(q)≅Zp​[x]/(m(x)),这里的m(x)m(x)m(x)是ddd次极小多项式。

  • 有限域元素a∈GF(q)a \in GF(q)a∈GF(q),表示为
    a(x)=∑i=0d−1a[i]xi,a[i]∈Zpa(x) = \sum_{i=0}^{d-1} a[i] x^i,\, a[i] \in Z_p a(x)=i=0∑d−1​a[i]xi,a[i]∈Zp​
    其中阵列a[]a[]a[]是a(x)a(x)a(x)的系数向量,a[]∈Zpda[] \in Z_p^da[]∈Zpd​

NTT 加速整数乘法

  • 考虑Z2Z_2Z2​上多项式:a(x)=∑ia[i]xi∈Z2[x]a(x) = \sum_i a[i] x^i \in Z_2[x]a(x)=∑i​a[i]xi∈Z2​[x],其中a[]a[]a[]是多项式系数向量。

  • 任意的整数a∈Za \in Za∈Z,可以视作某个多项式a(x)a(x)a(x)在点x=2x=2x=2处的值:a=a(2)a=a(2)a=a(2);其中整数a∈Za \in Za∈Z对应的多项式a(x)∈Z2[x]a(x) \in Z_2[x]a(x)∈Z2​[x]的系数,就是aaa的二进制表示:bin(a)=a[]bin(a) = a[]bin(a)=a[]

  • 对于nnn比特整数a,b∈Za,b \in Za,b∈Z,它们的乘积不超过2n2n2n比特,因此我们在Z2[x]/(x2n−1)Z_2[x]/(x^{2n}-1)Z2​[x]/(x2n−1)上计算多项式乘积a(x)b(x)a(x)b(x)a(x)b(x),然后计算x=2x=2x=2处的值ab=(ab)(2)ab = (ab)(2)ab=(ab)(2)即可。这里使用了x2n−1x^{2n}-1x2n−1,而非x2n+1x^{2n}+1x2n+1,原因是n>0,(2n−1)2<22n−1n>0,\,(2^n-1)^2 < 2^{2n}-1n>0,(2n−1)2<22n−1

  • 我们使用NTT及其变体,来计算Z2[x]/(x2n−1)Z_2[x]/(x^{2n}-1)Z2​[x]/(x2n−1)上多项式的乘积,复杂度O(nlog⁡n)O(n \log n)O(nlogn)

  • 在CPU上,对于字大小 (32/64 bits) 整数:乘法大约2ipc2\,ipc2ipc (instructions per cycle),时延5cycles5\,cycles5cycles;加减法大约3ipc3\,ipc3ipc,时延1cycle1\,cycle1cycle;位运算的性能与加减法差不多。

  • 就是说对于字大小的整数的乘法,NTT意义不大。但是,对于大整数乘法,使用NTT依旧很有必要。

NTT 加速有限域元素的乘积

  • 本节考虑a,b∈GF(q)a,b \in GF(q)a,b∈GF(q),如何利用NTT计算域元素乘积:a⋅ba \cdot ba⋅b

  • 环嵌入

    • 将Zp[x]/(m(x))Z_p[x]/(m(x))Zp​[x]/(m(x))上元素系数嵌入到Zp′[x]/(xd′−1)Z_{p'}[x]/(x^{d'}-1)Zp′​[x]/(xd′−1)上:
      ϕ:a(x)=∑i=0d−1a[i]xi↦a′(x)=∑i=0d−1a′[i]xi+∑i=dd′−10⋅xi\phi: a(x) = \sum_{i=0}^{d-1} a[i] x^i \mapsto a'(x) = \sum_{i=0}^{d-1} a'[i] x^i + \sum_{i=d}^{d'-1} 0 \cdot x^i ϕ:a(x)=i=0∑d−1​a[i]xi↦a′(x)=i=0∑d−1​a′[i]xi+i=d∑d′−1​0⋅xi
      其中阵列a[]∈Zpda[] \in Z_p^da[]∈Zpd​是aaa的系数向量,阵列a′[]∈Zp′d′a'[] \in Z_{p'}^{d'}a′[]∈Zp′d′​是a′a'a′的系数向量,且a[i]=a′[i]∈Za[i]=a'[i] \in Za[i]=a′[i]∈Z

    • 保证d′=2k≥2d−1,p′>dp22d'= 2^k \ge 2d-1,\, p' > \dfrac{d p^2}{2}d′=2k≥2d−1,p′>2dp2​,p′p'p′是NTT友好的素数:2k∣p′−12^k \mid p'-12k∣p′−1;寻找满足约束且尽可能小的d′,p′d',\,p'd′,p′

    • 其实,如果d′=2k∣p−1d'=2^k \mid p-1d′=2k∣p−1,那么就不必寻找p′p'p′了,嵌入到Zp[x]/(xd′−1)Z_p[x]/(x^{d'}-1)Zp​[x]/(xd′−1)即可,从而稍微降低整数模乘的复杂度。

    • 易知,存在d′=2kd' = 2^kd′=2k次本原单位根ξ∈Zp′[x]\xi \in Z_{p'}[x]ξ∈Zp′​[x],于是可以用NTT加速多项式乘法。

    • 在计算过程中,模运算一律采用mod±p\text{mod}^\pm pmod±p,而非modp\mod pmodp,前者将范围约束在[−p2,p2)[-\frac{p}{2}, \frac{p}{2})[−2p​,2p​),后者将范围约束在[0,p)[0, p)[0,p)

    • 对于a,b∈Zp[x]/(m(x))a,b \in Z_p[x]/(m(x))a,b∈Zp​[x]/(m(x)),映射a′=ϕ(a),b′=ϕ(b)a'=\phi(a),\, b'=\phi(b)a′=ϕ(a),b′=ϕ(b),那么:a(x)b(x)≡a′(x)b′(x)modp,m(x)a(x)b(x) \equiv a'(x)b'(x) \mod p,m(x)a(x)b(x)≡a′(x)b′(x)modp,m(x)

  • 正确性分析:

    • ∀a,b∈GF(q)≅Zp[x]/(m(x)),deg⁡m(x)=d\forall a,b \in GF(q) \cong Z_p[x]/(m(x)),\,\deg{m(x)} = d∀a,b∈GF(q)≅Zp​[x]/(m(x)),degm(x)=d,若视作a,b∈Z[x]a,b \in Z[x]a,b∈Z[x],那么:
      a(x)b(x)=∑i=02d−2(∑j=0min⁡(i,d−1)a[j]b[i−j])xia(x)b(x) = \sum_{i=0}^{2d-2} (\sum_{j=0}^{\min(i,d-1)} a[j]b[i-j]) x^i a(x)b(x)=i=0∑2d−2​(j=0∑min(i,d−1)​a[j]b[i−j])xi
      其中a[j],b[i−j]∈[−p2,p2)a[j],b[i-j] \in [-\frac{p}{2}, \frac{p}{2})a[j],b[i−j]∈[−2p​,2p​)

    • 因为d′≥2d−1d' \ge 2d-1d′≥2d−1,而deg⁡a(x)b(x)≤2d−2\deg a(x)b(x) \le 2d-2dega(x)b(x)≤2d−2,从而乘积a′(x)b′(x)a'(x)b'(x)a′(x)b′(x)在计算过程中不会模掉xd′−1x^{d'}-1xd′−1

    • 因为p′>dp22p' > \dfrac{d p^2}{2}p′>2dp2​,而a(x)b(x)a(x)b(x)a(x)b(x)系数的绝对值不超过d×(p2)2d \times (\dfrac{p}{2})^2d×(2p​)2,从而乘积a′(x)b′(x)a'(x)b'(x)a′(x)b′(x)在计算过程中同样不会模掉p′p'p′

    • 以上两条,保证了:a(x)b(x)≡a′(x)b′(x)modp,m(x)a(x)b(x) \equiv a'(x)b'(x) \mod p,m(x)a(x)b(x)≡a′(x)b′(x)modp,m(x)

  • 复杂度:

    • 假设在Zp′Z_{p'}Zp′​中,模乘时间复杂度为:O((log⁡p′)2)=O(log⁡2p′)O((\log p')^2) = O(\log^2 p')O((logp′)2)=O(log2p′);使用各种加速算法,可以做到更低。
    • NTT需要对d′d'd′长阵列a[]a[]a[]迭代计算log⁡d′\log d'logd′层,每层都要做d′/2d'/2d′/2个蝴蝶运算,每只蝴蝶中都包含一个Zp′Z_{p'}Zp′​上模乘。在NTT域上计算阵列乘积,需要对d’d’d’对元素各做一次模乘。
    • NTT的复杂度为:O((log⁡d′)d′2(log⁡p′)2)=O(dlog⁡dlog⁡2dp2)O((\log d') \dfrac{d'}{2} (\log p')^2) = O(d \log d \log^2 d p^2)O((logd′)2d′​(logp′)2)=O(dlogdlog2dp2);这比理想的O(dlog⁡dlog⁡2p)O(d \log d \log^2 p)O(dlogdlog2p)高一些,因为ZpZ_pZp​到Zp′Z_{p'}Zp′​的转换,使得模乘的时间复杂度上升 (但上升的很小)。
    • 基于NTT域元素乘法的复杂度为:2×2O((log⁡d′)d′2(log⁡p′)2)+O(d′(log⁡p′)2)=O(dlog⁡dlog⁡2dp2)2 \times 2\,O((\log d') \dfrac{d'}{2} (\log p')^2) + O(d' (\log p')^2) = O(d \log d \log^2 d p^2)2×2O((logd′)2d′​(logp′)2)+O(d′(logp′)2)=O(dlogdlog2dp2)
    • 相比而言,不使用NTT的域元素乘法的复杂度为:O(d2log⁡2p)O(d^2 \log^2 p)O(d2log2p),远高于使用NTT的乘法复杂度。当然,如果ddd很小,其实直接用经典的多项式模乘算法更好;例如d=1d=1d=1,那么将退化为ZpZ_pZp​上的整数模乘。
  • 多模数:为了减小模乘的复杂度,可以寻找一系列的NTT友好的素数{pj}\{p_j\}{pj​},并保证P=∏jpj>dp22P = \prod_j p_j > \dfrac{dp^2}{2}P=∏j​pj​>2dp2​,分别解决ajbjmodpja_j b_j \mod p_jaj​bj​modpj​,然后求解方程组ab≡(ab)jmodpjab \equiv (ab)_j\mod p_jab≡(ab)j​modpj​;但这会引入若干次NTT以及一次CRT,这里的复杂度我就不分析比较了。

NTT加速有限域上多项式的乘积

  • 本节考虑f,g∈Rf,g \in Rf,g∈R,如何利用NTT快速计算多项式乘积:f(x)g(x)f(x)g(x)f(x)g(x)

  • 以下,不额外说明,恒假设gcd(n,p)=1,q=pdgcd(n,p)=1,\,q=p^dgcd(n,p)=1,q=pd

  • 对于R=GF(q)[x]/(xn−1)R = GF(q)[x]/(x^n - 1)R=GF(q)[x]/(xn−1),且n=2k,n∣q−1n = 2^k,\,n \mid q-1n=2k,n∣q−1,那么存在nnn次单位根ξ=gq−1n∈GF(q)\xi = g^{\frac{q-1}{n}} \in GF(q)ξ=gnq−1​∈GF(q),因此可以直接应用 NTT

  • 对于R=GF(q)[x]/(xn+1)R = GF(q)[x]/(x^n + 1)R=GF(q)[x]/(xn+1),且n=2k−1,2n∣q−1n = 2^{k-1},\,2n \mid q-1n=2k−1,2n∣q−1,那么存在2n2n2n次单位根ξ=gq−12n∈GF(q)\xi = g^{\frac{q-1}{2n}} \in GF(q)ξ=g2nq−1​∈GF(q),因此可以应用 Negacyclic NTT

  • 对于R=GF(q)[x]/(xn−1)R = GF(q)[x]/(x^n - 1)R=GF(q)[x]/(xn−1),且n=h⋅2k,2k∣q−1n = h \cdot 2^k,\, 2^k \mid q-1n=h⋅2k,2k∣q−1,那么存在2k2^k2k次单位根ξ=gq−12k∈GF(q)\xi = g^{\frac{q-1}{2^k}} \in GF(q)ξ=g2kq−1​∈GF(q),因此可以应用 Incomplete NTT或者Good’s trick

  • 以上三种情况,域GF(q)GF(q)GF(q)没有做任何扩张,因此使用NTT可以把域上多项式乘法的复杂度,从O(n2)O(n^2)O(n2)降低到O(nlog⁡n)O(n \log n)O(nlogn)

  • 对于R=GF(q)[x]/(xn−1)R = GF(q)[x]/(x^n - 1)R=GF(q)[x]/(xn−1),如果n=2k∤q−1n=2^k \not \mid q-1n=2k∣q−1,那么我们可以找一个NTT友好的大的多项式环做环嵌入。

    一、嵌入GF(qm)[x]/(xn−1)GF(q^m)[x]/(x^n-1)GF(qm)[x]/(xn−1)

    • 寻找扩域GF(qm)/GF(q)GF(q^m)/GF(q)GF(qm)/GF(q),使得n∣qm−1n \mid q^m - 1n∣qm−1

    • 这个扩域是存在的:由于gcd(n,p)=1gcd(n,p)=1gcd(n,p)=1,根据抽屉原理,∃0≤i<j≤n,qi≡qjmodn\exist 0 \le i < j \le n,\, q^i \equiv q^j \mod n∃0≤i<j≤n,qi≡qjmodn,从而m=j−i≤nm=j-i \le nm=j−i≤n

    • 我们把多项式环GF(q)[x]/(xn−1)GF(q)[x]/(x^n-1)GF(q)[x]/(xn−1)嵌入到GF(qm)[x]/(xn−1)GF(q^m)[x]/(x^n-1)GF(qm)[x]/(xn−1)上,并且存在nnn次本原单位根ξn∈GF(qm)\xi_n \in GF(q^m)ξn​∈GF(qm)

    • 由于GF(q)GF(q)GF(q)是GF(qm)GF(q^m)GF(qm)的子域,因此R=GF(q)[x]/(xn−1)R = GF(q)[x]/(x^n-1)R=GF(q)[x]/(xn−1)是R′=GF(qm)[x]/(xn−1)R' = GF(q^m)[x]/(x^n-1)R′=GF(qm)[x]/(xn−1)的子环

    • 于是,将f,g∈Rf,g \in Rf,g∈R 系数嵌入到R′R'R′里,得到对应的f′,g′∈R′f',g' \in R'f′,g′∈R′,那么f⋅g⟺f′⋅g′f \cdot g \iff f' \cdot g'f⋅g⟺f′⋅g′

    • GF(qm)GF(q^m)GF(qm)上存在nnn次本原单位根,所以可以在R′R'R′上使用NTT计算多项式乘积f′⋅g′modxn−1f' \cdot g' \mod x^n-1f′⋅g′modxn−1

    • 由于f′,g′f',g'f′,g′的系数取自GF(q)GF(q)GF(q),因此f′⋅g′f' \cdot g'f′⋅g′的系数依然属于GF(q)GF(q)GF(q),从f′⋅g′∈R′f' \cdot g' \in R'f′⋅g′∈R′可以自然的获得f⋅g∈Rf \cdot g \in Rf⋅g∈R

    • 复杂度:

      • q=pd,GF(qm)q=p^d,\,GF(q^m)q=pd,GF(qm)上域元素乘积,使用NTT后,复杂度为:O(mdlog⁡mdlog⁡2mdp2)O(md \log md \log^2 md p^2)O(mdlogmdlog2mdp2)
      • NTT需要对nnn长阵列迭代log⁡n\log nlogn层,每层n2\dfrac{n}{2}2n​个蝴蝶运算,每只蝴蝶需要1个域元素乘积。在NTT域上计算阵列乘积,需要nnn次域元素乘积。
      • 有限域上多项式环的NTT的复杂度:O((log⁡n)n2(mdlog⁡mdlog⁡2mdp2))=O(nmdlog⁡nlog⁡mdlog⁡2mdp2)O((\log n)\dfrac{n}{2}(md \log md \log^2 md p^2)) = O(nmd \log n \log md \log^2 mdp^2)O((logn)2n​(mdlogmdlog2mdp2))=O(nmdlognlogmdlog2mdp2)
      • 基于NTT的有限域上多项式乘积的复杂度:2×2O((log⁡n)n2(mdlog⁡mdlog⁡2mdp2))+O(n(mdlog⁡mdlog⁡2mdp2))=O(nmdlog⁡nlog⁡mdlog⁡2mdp2)2 \times 2\,O((\log n)\dfrac{n}{2}(md \log md \log^2 md p^2)) + O(n(md \log md \log^2 md p^2)) = O(nmd \log n \log md \log^2 mdp^2)2×2O((logn)2n​(mdlogmdlog2mdp2))+O(n(mdlogmdlog2mdp2))=O(nmdlognlogmdlog2mdp2)
      • 如果不使用NTT,那么GF(q)GF(q)GF(q)上元素乘积的复杂度为O(d2log⁡2p)O(d^2 \log^2 p)O(d2log2p),从而GF(q)GF(q)GF(q)上多项式乘积的复杂度为O(n2d2log⁡2p)O(n^2 d^2 \log^2 p)O(n2d2log2p)
      • 效率比值:nmdlog⁡nlog⁡mdlog⁡2mdp2n2d2log⁡2p≈mlog⁡nn⋅log⁡mdlog⁡p2mdd\dfrac{nmd \log n \log md \log^2 mdp^2}{n^2 d^2 \log^2 p} \approx \dfrac{m \log n}{n} \cdot \dfrac{\log md \log_p^2 md}{d}n2d2log2pnmdlognlogmdlog2mdp2​≈nmlogn​⋅dlogmdlogp2​md​;当m≪nm \ll nm≪n时,加速效果明显。

    二、嵌入GF(q′)[x]/(xn−1)GF(q')[x]/(x^n-1)GF(q′)[x]/(xn−1)

    • 对于f,g∈GF(q)[x]/(xn−1)f,g \in GF(q)[x]/(x^n-1)f,g∈GF(q)[x]/(xn−1),假定f(x)=∑i=0n−1fixi,g(x)=∑i=0n−1gixif(x) = \sum_{i=0}^{n-1} f_i x^i,\,g(x) = \sum_{i=0}^{n-1} g_i x^if(x)=∑i=0n−1​fi​xi,g(x)=∑i=0n−1​gi​xi,那么
      h(x)=f(x)g(x)=∑i=0n−1(∑j=0n−1f(i−j)gj)xi=∑i=0n−1hixih(x) = f(x)g(x) = \sum_{i=0}^{n-1} (\sum_{j=0}^{n-1} f_{(i-j)}g_j) x^i = \sum_{i=0}^{n-1} h_i x^i h(x)=f(x)g(x)=i=0∑n−1​(j=0∑n−1​f(i−j)​gj​)xi=i=0∑n−1​hi​xi
      定义(i−j):=i−jmodn(i-j):= i-j \mod n(i−j):=i−jmodn,其中{fi},{gj},{hk}\{f_i\},\{g_j\},\{h_k\}{fi​},{gj​},{hk​}是多项式f,g,hf,g,hf,g,h的系数 ,都属于GF(q)GF(q)GF(q)

    • 由于GF(q)≅Zp[x]/(m(x))GF(q) \cong Z_p[x]/(m(x))GF(q)≅Zp​[x]/(m(x)),因此fi,gjf_i,g_jfi​,gj​可以表示成多项式,有ddd项,并约束其系数的范围:[−p2,p2)[-\dfrac{p}{2},\dfrac{p}{2})[−2p​,2p​)

    • 那么,因为hi=∑j=0n−1f(i−j)gjh_i = \sum_{j=0}^{n-1} f_{(i-j)}g_jhi​=∑j=0n−1​f(i−j)​gj​,所以在不模ppp的情况下,它的系数的绝对值不超过n×d×(p2)2=ndp24n \times d \times (\dfrac{p}{2})^2 = \dfrac{ndp^2}{4}n×d×(2p​)2=4ndp2​

    • 寻找尽可能小的素数p′>ndp22p' > \dfrac{ndp^2}{2}p′>2ndp2​,记q′=(p′)dq'=(p')^dq′=(p′)d,使得n∣q′−1n \mid q'-1n∣q′−1,我们将R=GF(q)[x]/(xn−1)R = GF(q)[x]/(x^n-1)R=GF(q)[x]/(xn−1)嵌入到环R′=GF(q′)[x]/(xn−1)R' = GF(q')[x]/(x^n-1)R′=GF(q′)[x]/(xn−1)上,其中GF(q′)≅Zp′[x]/(m′(x))GF(q') \cong Z_{p'}[x]/(m'(x))GF(q′)≅Zp′​[x]/(m′(x)),由于有限域的唯一性,可简单设置m′(x)=m(x)m'(x)=m(x)m′(x)=m(x)

    • 对于f,g∈Rf,g \in Rf,g∈R,将多项式的系数系数嵌入,得到f′,g′∈R′f',g' \in R'f′,g′∈R′
      ϕ:f(x)=∑i=0n−1fixi∈R↦f′(x)=∑i=0n−1fi′xi∈R′fi∈Zp[x]/(m(x))↦fi′∈Zp′[x]/(m′(x))\begin{aligned} \phi: f(x)=\sum_{i=0}^{n-1} f_i x^i \in R \mapsto f'(x)=\sum_{i=0}^{n-1} f'_i x^i \in R'\\ f_i \in Z_p[x]/(m(x)) \mapsto f'_i \in Z_{p'}[x]/(m'(x)) \end{aligned} ϕ:f(x)=i=0∑n−1​fi​xi∈R↦f′(x)=i=0∑n−1​fi′​xi∈R′fi​∈Zp​[x]/(m(x))↦fi′​∈Zp′​[x]/(m′(x))​

    • 因为p′>ndp22p' > \dfrac{ndp^2}{2}p′>2ndp2​,从而乘积(fg)(x)=f(x)g(x)(fg)(x)=f(x)g(x)(fg)(x)=f(x)g(x)的系数(fg)i(fg)_i(fg)i​的系数不会模掉p′p'p′,并且m(x)=m′(x)m(x)=m'(x)m(x)=m′(x),因此(fg)i≡(f′g′)imodp,m(x)(fg)_i \equiv (f'g')_i \mod p,m(x)(fg)i​≡(f′g′)i​modp,m(x),进一步得出:fg⟺f′g′fg \iff f'g'fg⟺f′g′

    • 计算多项式乘法:

      • 对于f,g∈GF(q)[x]/(xn−1)f,g \in GF(q)[x]/(x^n-1)f,g∈GF(q)[x]/(xn−1),做映射f′=ϕ(f),g′=ϕ(g)∈GF(q′)[x]/(xn−1)f'=\phi(f),g'=\phi(g) \in GF(q')[x]/(x^n-1)f′=ϕ(f),g′=ϕ(g)∈GF(q′)[x]/(xn−1)
      • 由于n∣q′−1n \mid q'-1n∣q′−1,因此在GF(q′)GF(q')GF(q′)上存在nnn次本原单位根,利用NTT计算h′=f′g′h' = f'g'h′=f′g′
      • 计算hi=hi′modph_i = h'_i \mod phi​=hi′​modp,得到结果:h(x)=∑i=0n−1hixi=f(x)g(x)h(x) = \sum_{i=0}^{n-1} h_i x^i = f(x)g(x)h(x)=∑i=0n−1​hi​xi=f(x)g(x)
      • 如果d=1d=1d=1,即GF(q)≅FpGF(q) \cong F_pGF(q)≅Fp​,取m(x)=xm(x)=xm(x)=x,上述算法就退化为Zp[x]/(xn−1)Z_p[x]/(x^n-1)Zp​[x]/(xn−1)到Zp′[x]/(xn−1)Z_{p'}[x]/(x^n-1)Zp′​[x]/(xn−1)的环嵌入。
    • 复杂度:

      • q′=p′d,GF(q′)q' = p'^d,\,GF(q')q′=p′d,GF(q′)上域元素乘积,使用NTT后,复杂度为:O(dlog⁡dlog⁡2dp′2)=O(dlog⁡dlog⁡2(n2d3p4))O(d \log d \log^2 d p'^2) = O(d \log d \log^2 (n^2 d^3 p^4))O(dlogdlog2dp′2)=O(dlogdlog2(n2d3p4))
      • NTT需要对nnn长阵列迭代log⁡n\log nlogn层,每层n2\dfrac{n}{2}2n​个蝴蝶运算,每只蝴蝶需要1个域元素乘积。在NTT域上计算阵列乘积,需要nnn次域元素乘积。
      • 有限域上多项式环的NTT的复杂度:O((log⁡n)n2(dlog⁡dlog⁡2(n2d3p4)))=O(ndlog⁡nlog⁡dlog⁡2(n2d3p4))O((\log n)\dfrac{n}{2}(d \log d \log^2 (n^2 d^3 p^4))) = O(nd \log n \log d \log^2(n^2 d^3 p^4))O((logn)2n​(dlogdlog2(n2d3p4)))=O(ndlognlogdlog2(n2d3p4))
      • 基于NTT的有限域上多项式乘积的复杂度:2×2O((log⁡n)n2(dlog⁡dlog⁡2(n2d3p4)))+O(n(dlog⁡dlog⁡2(n2d3p4)))=O(ndlog⁡nlog⁡dlog⁡2(n2d3p4))2 \times 2\,O((\log n)\dfrac{n}{2}(d \log d \log^2 (n^2 d^3 p^4))) + O(n(d \log d \log^2 (n^2 d^3 p^4))) = O(nd \log n \log d \log^2(n^2 d^3 p^4))2×2O((logn)2n​(dlogdlog2(n2d3p4)))+O(n(dlogdlog2(n2d3p4)))=O(ndlognlogdlog2(n2d3p4))
      • 如果不使用NTT,那么GF(q)GF(q)GF(q)上元素乘积的复杂度为O(d2log⁡2p)O(d^2 \log^2 p)O(d2log2p),从而GF(q)GF(q)GF(q)上多项式乘积的复杂度为O(n2d2log⁡2p)O(n^2 d^2 \log^2 p)O(n2d2log2p)
      • 效率比值:ndlog⁡nlog⁡dlog⁡2(n2d3p4)n2d2log⁡2p≈log⁡nn⋅log⁡dlog⁡p2(n2d3)d\dfrac{nd \log n \log d \log^2(n^2 d^3 p^4)}{n^2 d^2 \log^2 p} \approx \dfrac{ \log n}{n} \cdot \dfrac{\log d \log_p^2 (n^2 d^3)}{d}n2d2log2pndlognlogdlog2(n2d3p4)​≈nlogn​⋅dlogdlogp2​(n2d3)​,看起来比第一种方案好不少?
      • 不过,第一种方案由于是扩域的关系,映射到NTT域上后可以连续乘积。而这种方案因为嵌入的大域GF(q′)GF(q')GF(q′)与GF(q)GF(q)GF(q)基本没什么关系,所以只能在NTT域上做一次乘法,就必须映射回GF(q)GF(q)GF(q)上,以保证结果正确。
    • 如果嫌弃p′>ndp22p' > \dfrac{ndp^2}{2}p′>2ndp2​过大,可以使用多模数。令P=∏j=1spjP = \prod_{j=1}^s p_jP=∏j=1s​pj​,其中pjp_jpj​都是NTT友好的素数,这样
      ZP[x]/(m(x))≅Zp1[x]/(m(x))×⋯×Zps[x]/(m(x))Z_{P}[x]/(m(x)) \cong Z_{p_1}[x]/(m(x)) \times \cdots \times Z_{p_s}[x]/(m(x)) ZP​[x]/(m(x))≅Zp1​​[x]/(m(x))×⋯×Zps​​[x]/(m(x))
      注意,因为PPP不是素数,多项式商环ZP[x]/(m(x))Z_P[x]/(m(x))ZP​[x]/(m(x))不是有限域,简记RRR

      很明显,GF(pjd)≅Zpj[x]/(m(x))GF(p_j^d) \cong Z_{p_j}[x]/(m(x))GF(pjd​)≅Zpj​​[x]/(m(x)),因为m(x)m(x)m(x)是ddd次极小多项式。

      容易证明,
      R[x]/(xn−1)≅GF(p1d)[x]/(xn−1)×⋯×GF(psd)[x]/(xn−1)R[x]/(x^n-1) \cong GF(p_1^d)[x]/(x^n-1) \times \cdots \times GF(p_s^d)[x]/(x^n-1) R[x]/(xn−1)≅GF(p1d​)[x]/(xn−1)×⋯×GF(psd​)[x]/(xn−1)
      当d=1d=1d=1时,退化为ZP[x]/(xn−1)≅Zp1[x]/(xn−1)×⋯×Zps[x]/(xn−1)Z_P[x]/(x^n-1) \cong Z_{p_1}[x]/(x^n-1) \times \cdots \times Z_{p_s}[x]/(x^n-1)ZP​[x]/(xn−1)≅Zp1​​[x]/(xn−1)×⋯×Zps​​[x]/(xn−1)

  • 实际上,Zp≅FpZ_p \cong F_pZp​≅Fp​,因此对于Zp[x]/(xn−1),n=2k∤p−1Z_p[x]/(x^n-1),\,n=2^k \not \mid p-1Zp​[x]/(xn−1),n=2k∣p−1,也可以嵌入到GF(pm)[x]/(xn−1)GF(p^m)[x]/(x^n-1)GF(pm)[x]/(xn−1)上进行NTT计算。

    • 一、将环Zp[x]/(xn−1)Z_p[x]/(x^n-1)Zp​[x]/(xn−1),嵌入到Zp′[x]/(xn−1)Z_{p'}[x]/(x^n-1)Zp′​[x]/(xn−1),需寻找一个NTT友好的素数p′>np22p' > \dfrac{np^2}{2}p′>2np2​
    • 二、将环Zp[x]/(xn−1)Z_p[x]/(x^n-1)Zp​[x]/(xn−1),嵌入到ZP[x]/(xn−1)Z_{P}[x]/(x^n-1)ZP​[x]/(xn−1),需寻找一系列NTT友好的素数{pj}\{p_j\}{pj​},P=∏jpj>np22P = \prod_j p_j > \dfrac{np^2}{2}P=∏j​pj​>2np2​
    • 三、将环Zp[x]/(xn−1)Z_p[x]/(x^n-1)Zp​[x]/(xn−1),嵌入到GF(pm)[x]/(xn−1)GF(p^m)[x]/(x^n-1)GF(pm)[x]/(xn−1),使得n∣pm−1n \mid p^m - 1n∣pm−1即可
    • 但是,第三种环嵌入,系数属于有限域GF(pm)GF(p^m)GF(pm),系数乘积是域元素乘积 (多项式乘积)。相对而言,第一、二两种环嵌入,系数的乘积仅仅是整数模乘

总结

  • NTT可以用于加速整数乘法
  • NTT可以用于加速有限域元素的乘法。有限域同构于多项式商环GF(q)≅Zp[x]/(m(x))GF(q) \cong Z_p[x]/(m(x))GF(q)≅Zp​[x]/(m(x)),因此使用NTT计算环上多项式的乘积。但是m(x)m(x)m(x)是极小多项式,所以需要把环Zp[x]/(m(x))Z_p[x]/(m(x))Zp​[x]/(m(x))嵌入到更大的NTT友好的环Zp′[x]/(xd′−1)Z_{p'}[x]/(x^{d'}-1)Zp′​[x]/(xd′−1)上。因为在更大的环上做运算,需要更大规模的模乘,这略微损失了效率,但NTT仍表现良好。
  • NTT可以用于加速有限域上多项式的乘积
    • 一、对于R=GF(q)[x]/(xn−1)R = GF(q)[x]/(x^n - 1)R=GF(q)[x]/(xn−1),且n=2k,n∣q−1n = 2^k,\,n \mid q-1n=2k,n∣q−1,可以直接应用 NTT

    • 二、对于R=GF(q)[x]/(xn+1)R = GF(q)[x]/(x^n + 1)R=GF(q)[x]/(xn+1),且n=2k−1,2n∣q−1n = 2^{k-1},\,2n \mid q-1n=2k−1,2n∣q−1,可以应用 Negacyclic NTT

    • 三、对于R=GF(q)[x]/(xn−1)R = GF(q)[x]/(x^n - 1)R=GF(q)[x]/(xn−1),且n=h⋅2k,2k∣q−1n = h \cdot 2^k,\, 2^k \mid q-1n=h⋅2k,2k∣q−1

      • 如果hhh是较小的奇数,我们可以应用 Incomplete NTT或者Good’s trick
      • 如果2k2^k2k很小,甚至nnn是素数,那此时简单使用上述两种方法并不会带来多少提升,我们可以嵌入到GF(q)[x]/(xn′−1)GF(q)[x]/(x^{n'} - 1)GF(q)[x]/(xn′−1)上,需保证n′=2k′>2nn'=2^{k'} > 2nn′=2k′>2n,并且n′∣q−1n' \mid q-1n′∣q−1;若是难以找到合适的 (找不到n′n'n′或者找到的n′n'n′过大),那就需要把qqq调整为q′q'q′了,使得n′∣q′−1n' \mid q'-1n′∣q′−1
    • 四、对于R=GF(q)[x]/(xn−1)R = GF(q)[x]/(x^n - 1)R=GF(q)[x]/(xn−1),如果n=2k∤q−1n=2^k \not \mid q-1n=2k∣q−1,

      • 1.把它嵌入到一个扩环R′=GF(qm)[x]/(xn−1)R' = GF(q^m)[x]/(x^n - 1)R′=GF(qm)[x]/(xn−1)上,使得n∣qm−1n \mid q^m-1n∣qm−1,然后使用NTT在R′R'R′上计算多项式乘积,最后把结果映射回环RRR上。

      • 2.把它嵌入到更大的环GF(q′)[x]/(xn−1)GF(q')[x]/(x^n - 1)GF(q′)[x]/(xn−1),要求n∣q′−1,q′=p′d,p′>ndp22n \mid q'-1,\, q'=p'^d,\, p'>\dfrac{ndp^2}{2}n∣q′−1,q′=p′d,p′>2ndp2​,然后使用然后使用NTT在R′R'R′上计算多项式乘积,最后把结果映射回环RRR上。

    • 前三种情况,并没有把GF(q)GF(q)GF(q)进行域扩张,因此NTT可以把多项式乘积的复杂度从O(n2)O(n^2)O(n2)降低到O(nlog⁡n)O(n \log n)O(nlogn)

    • 第四种情况

      • 第1种算法,它需要把GF(q)GF(q)GF(q)扩张m≤nm \le nm≤n次 (维数扩大了mmm倍),而域元素乘积实质上也是多项式乘积,因此复杂度将大幅提升。根据复杂度分析,当mmm远小于nnn时,使用NTT效果明显;而当mmm的数量级与nnn相同时,效果有限。
      • 第2种算法,它把域扩大了 (不是扩域,甚至维数都相同),域的次数仍是ddd没有变化,但其素域从ZpZ_pZp​扩大为了Zp′Z_{p'}Zp′​,因此域元素乘积的复杂度上升了一点点。总体而言,它的效果要比第一种算法好很多。
  • 注意到本文的复杂度分析都是渐进复杂度,实际上忽略了很多常数。在实例化上述NTT时,需要结合硬件条件进一步分析,以确定使用NTT是否真的有收益。 硬件条件包含:支持处理的数据大小,不同运算器的吞吐率和时延,寄存器数量,Cache大小与分级,流水线,SIMD。实现代码也要关注:参数大小、线程级并行,指令级并行,乱序执行,数据依赖,分支预测,分批Load/Store,等等。

Galois Field NTT相关推荐

  1. Fast Affine Template Matching over Galois Field仿射模板匹配数据测试问题

    Fast Affine Template Matching over Galois Field http://cvhost.scv.cis.iwate-u.ac.jp/research/project ...

  2. 伽罗华域(Galois Field,GF,有限域)

    原文见链接DataMatrix 编码生成和译码原理即方法 原文见链接存储系统中的纠删码(Erasure Codes)-XOR 码和RS 码 原文见链接(讲的很好)Galois 域上的运算(规则) 原文 ...

  3. 伽罗华域(Galois Field)有限域元素生成和运算原理

    存储编码,矩阵等之间的运算都是在伽罗华域(Galois Field,GF,有限域)上进行的,所以要实现底层的运算库,必须了解 GF 上的运算规则. 域: 一组元素的集合,以及在集合上的四则运算,构成一 ...

  4. 伽罗华域(Galois Field, GF, 有限域)的四则运算

    有限域的构造之常见本原多项式 伽罗华域(Galois Field,GF,有限域)乘法运算 伽罗华域(Galois Field)理解.基于伽罗华域的四则运算(附详细python代码)

  5. matlab中如何将Galois field array 转换 bin

    matlab中的纠错编码使用的数据类型是Galois field array,但我们有时候需要将其转换为其它数据类型,如bin.dec或double等.网上有很多转换方法,但都很复杂.实际上这个转换非 ...

  6. 伽罗华域(伽罗瓦域,Galois Field,GF,有限域)

    原文见链接DataMatrix 编码生成和译码原理即方法 原文见链接存储系统中的纠删码(Erasure Codes)-XOR 码和RS 码 原文见链接(讲的很好)Galois 域上的运算(规则) 原文 ...

  7. 伽罗华域(Galois Field)理解、基于伽罗华域的四则运算(附详细python代码)

    参考链接:https://blog.csdn.net/luotuo44/article/details/41645597 参考链接:https://blog.csdn.net/shelldon/art ...

  8. 有限域(Galois Field,GF,伽罗华域)的乘法原理

    今天在打AES的代码,打到列混合变换的时候对有限域的乘法不是很熟悉,但是查了很多资料结合书本最后算是弄会了,分享一下自己的心得 这里是引用在密码学中经常用到有限域的乘法,一般在AES中用到的是GF(2 ...

  9. [Matlab] Galois Field

    1. gf(M)用来把M转换到伽罗华域 2. gf(M.x)用来把M转换到实数域 转载于:https://www.cnblogs.com/southernduck/p/4203066.html

最新文章

  1. 逆变器的技术创新 让光伏电站更具发展前景
  2. php网站怎么伪静态,php怎么实现网页伪静态
  3. Linux文件系统中文版,Linux 文件系统-Go语言中文社区
  4. SpringBoot学习:在Interillj Idea上快速搭建SpringBoot项目
  5. 前端学习(2003)vue之电商管理系统电商系统之之允许三级选择
  6. zk4元年拆解_科比5 Protro开箱测评 zk5元年拆解赏析
  7. Win7下使用openssl时出现“Unable to write ‘random state’‘的问题
  8. asp.net中慎用static全局变量
  9. 嵌入式电路设计(fpga电路设计)
  10. WPF在一个窗口中实现多个视图
  11. C语言编程比赛WBS
  12. Socket和ServerSocket学习笔记
  13. c语言打字游戏程序设计报告,2016打字游戏程序设计报告.doc
  14. ArcCatalog中连接SDE数据库
  15. LaTeX技巧004:给文字添加下划线、波浪线等样式
  16. 基于微信小程序社区疫情防控系统 uniapp
  17. 组合数学--排列组合
  18. 二十种电容分类详解(附常用电子元件实物图片大全)
  19. SourceTree提交vue前端代码报错git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\
  20. tgp进游戏不显示服务器连接异常,TGP启用腾讯游戏提示“TCLS_CORE异常退出”的解决方法...

热门文章

  1. 【面试】数据仓库面试经验总结
  2. 视频大小与码率计算及像素及分辨率问题
  3. for...in 与 for...of 的用法与区别
  4. php 英文单词 数,【PHP】统计中英文单词数(GB2312/UTF-8编码)
  5. 线性代数之向量线性相关线性表示的求法
  6. 程序员前辈归纳整理Python中的控制流语句的知识点(要记得收藏)
  7. LeetCode 1905. 统计子岛屿
  8. FontStruct——制作你自己的个性化字体
  9. C语言 !! 的含义
  10. Android刘海屏适配全方案(华为、小米、Vivo、Oppo)