Galois Field NTT
经典的 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−1f[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−1a[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)=∑ia[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(nlogn)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−1a[i]xi↦a′(x)=i=0∑d−1a′[i]xi+i=d∑d′−10⋅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)),degm(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,而dega(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((logp′)2)=O(log2p′)O((\log p')^2) = O(\log^2 p')O((logp′)2)=O(log2p′);使用各种加速算法,可以做到更低。
- NTT需要对d′d'd′长阵列a[]a[]a[]迭代计算logd′\log d'logd′层,每层都要做d′/2d'/2d′/2个蝴蝶运算,每只蝴蝶中都包含一个Zp′Z_{p'}Zp′上模乘。在NTT域上计算阵列乘积,需要对d’d’d’对元素各做一次模乘。
- NTT的复杂度为:O((logd′)d′2(logp′)2)=O(dlogdlog2dp2)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(dlogdlog2p)O(d \log d \log^2 p)O(dlogdlog2p)高一些,因为ZpZ_pZp到Zp′Z_{p'}Zp′的转换,使得模乘的时间复杂度上升 (但上升的很小)。
- 基于NTT域元素乘法的复杂度为:2×2O((logd′)d′2(logp′)2)+O(d′(logp′)2)=O(dlogdlog2dp2)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(d2log2p)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=∏jpj>2dp2,分别解决ajbjmodpja_j b_j \mod p_jajbjmodpj,然后求解方程组ab≡(ab)jmodpjab \equiv (ab)_j\mod p_jab≡(ab)jmodpj;但这会引入若干次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(nlogn)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(mdlogmdlog2mdp2)O(md \log md \log^2 md p^2)O(mdlogmdlog2mdp2)
- NTT需要对nnn长阵列迭代logn\log nlogn层,每层n2\dfrac{n}{2}2n个蝴蝶运算,每只蝴蝶需要1个域元素乘积。在NTT域上计算阵列乘积,需要nnn次域元素乘积。
- 有限域上多项式环的NTT的复杂度:O((logn)n2(mdlogmdlog2mdp2))=O(nmdlognlogmdlog2mdp2)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((logn)n2(mdlogmdlog2mdp2))+O(n(mdlogmdlog2mdp2))=O(nmdlognlogmdlog2mdp2)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(d2log2p)O(d^2 \log^2 p)O(d2log2p),从而GF(q)GF(q)GF(q)上多项式乘积的复杂度为O(n2d2log2p)O(n^2 d^2 \log^2 p)O(n2d2log2p)
- 效率比值:nmdlognlogmdlog2mdp2n2d2log2p≈mlognn⋅logmdlogp2mdd\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⋅dlogmdlogp2md;当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−1fixi,g(x)=∑i=0n−1gixi,那么
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−1f(i−j)gj)xi=i=0∑n−1hixi
定义(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−1f(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−1fixi∈R↦f′(x)=i=0∑n−1fi′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′)imodp,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−1hixi=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(dlogdlog2dp′2)=O(dlogdlog2(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长阵列迭代logn\log nlogn层,每层n2\dfrac{n}{2}2n个蝴蝶运算,每只蝴蝶需要1个域元素乘积。在NTT域上计算阵列乘积,需要nnn次域元素乘积。
- 有限域上多项式环的NTT的复杂度:O((logn)n2(dlogdlog2(n2d3p4)))=O(ndlognlogdlog2(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((logn)n2(dlogdlog2(n2d3p4)))+O(n(dlogdlog2(n2d3p4)))=O(ndlognlogdlog2(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(d2log2p)O(d^2 \log^2 p)O(d2log2p),从而GF(q)GF(q)GF(q)上多项式乘积的复杂度为O(n2d2log2p)O(n^2 d^2 \log^2 p)O(n2d2log2p)
- 效率比值:ndlognlogdlog2(n2d3p4)n2d2log2p≈lognn⋅logdlogp2(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=1spj,其中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=∏jpj>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(nlogn)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相关推荐
- Fast Affine Template Matching over Galois Field仿射模板匹配数据测试问题
Fast Affine Template Matching over Galois Field http://cvhost.scv.cis.iwate-u.ac.jp/research/project ...
- 伽罗华域(Galois Field,GF,有限域)
原文见链接DataMatrix 编码生成和译码原理即方法 原文见链接存储系统中的纠删码(Erasure Codes)-XOR 码和RS 码 原文见链接(讲的很好)Galois 域上的运算(规则) 原文 ...
- 伽罗华域(Galois Field)有限域元素生成和运算原理
存储编码,矩阵等之间的运算都是在伽罗华域(Galois Field,GF,有限域)上进行的,所以要实现底层的运算库,必须了解 GF 上的运算规则. 域: 一组元素的集合,以及在集合上的四则运算,构成一 ...
- 伽罗华域(Galois Field, GF, 有限域)的四则运算
有限域的构造之常见本原多项式 伽罗华域(Galois Field,GF,有限域)乘法运算 伽罗华域(Galois Field)理解.基于伽罗华域的四则运算(附详细python代码)
- matlab中如何将Galois field array 转换 bin
matlab中的纠错编码使用的数据类型是Galois field array,但我们有时候需要将其转换为其它数据类型,如bin.dec或double等.网上有很多转换方法,但都很复杂.实际上这个转换非 ...
- 伽罗华域(伽罗瓦域,Galois Field,GF,有限域)
原文见链接DataMatrix 编码生成和译码原理即方法 原文见链接存储系统中的纠删码(Erasure Codes)-XOR 码和RS 码 原文见链接(讲的很好)Galois 域上的运算(规则) 原文 ...
- 伽罗华域(Galois Field)理解、基于伽罗华域的四则运算(附详细python代码)
参考链接:https://blog.csdn.net/luotuo44/article/details/41645597 参考链接:https://blog.csdn.net/shelldon/art ...
- 有限域(Galois Field,GF,伽罗华域)的乘法原理
今天在打AES的代码,打到列混合变换的时候对有限域的乘法不是很熟悉,但是查了很多资料结合书本最后算是弄会了,分享一下自己的心得 这里是引用在密码学中经常用到有限域的乘法,一般在AES中用到的是GF(2 ...
- [Matlab] Galois Field
1. gf(M)用来把M转换到伽罗华域 2. gf(M.x)用来把M转换到实数域 转载于:https://www.cnblogs.com/southernduck/p/4203066.html
最新文章
- 逆变器的技术创新 让光伏电站更具发展前景
- php网站怎么伪静态,php怎么实现网页伪静态
- Linux文件系统中文版,Linux 文件系统-Go语言中文社区
- SpringBoot学习:在Interillj Idea上快速搭建SpringBoot项目
- 前端学习(2003)vue之电商管理系统电商系统之之允许三级选择
- zk4元年拆解_科比5 Protro开箱测评 zk5元年拆解赏析
- Win7下使用openssl时出现“Unable to write ‘random state’‘的问题
- asp.net中慎用static全局变量
- 嵌入式电路设计(fpga电路设计)
- WPF在一个窗口中实现多个视图
- C语言编程比赛WBS
- Socket和ServerSocket学习笔记
- c语言打字游戏程序设计报告,2016打字游戏程序设计报告.doc
- ArcCatalog中连接SDE数据库
- LaTeX技巧004:给文字添加下划线、波浪线等样式
- 基于微信小程序社区疫情防控系统 uniapp
- 组合数学--排列组合
- 二十种电容分类详解(附常用电子元件实物图片大全)
- SourceTree提交vue前端代码报错git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\
- tgp进游戏不显示服务器连接异常,TGP启用腾讯游戏提示“TCLS_CORE异常退出”的解决方法...
热门文章
- 【面试】数据仓库面试经验总结
- 视频大小与码率计算及像素及分辨率问题
- for...in 与 for...of 的用法与区别
- php 英文单词 数,【PHP】统计中英文单词数(GB2312/UTF-8编码)
- 线性代数之向量线性相关线性表示的求法
- 程序员前辈归纳整理Python中的控制流语句的知识点(要记得收藏)
- LeetCode 1905. 统计子岛屿
- FontStruct——制作你自己的个性化字体
- C语言 !! 的含义
- Android刘海屏适配全方案(华为、小米、Vivo、Oppo)