本博客的Markdown文件下载地址:https://download.csdn.net/download/wxkhturfun/87134519
g g g是原根, p p p是模数,即在模 p p p的整数环下运算, N N N是多项式长度( N N N是2的整数次幂)
数论变换(NTT):
数论变换逆变换(INTT):
模 p p p下求逆:
对正整数 a a a来讲,在模 p p p下有$a{p-1}\equiv a{p-2}\cdot a\equiv1\ mod\ p ,故要求 ,故要求 ,故要求a 的倒数则可通过 的倒数则可通过 的倒数则可通过a\equiv\frac{1}{a^{p-2}}\ mod\ p$来求得
所以INTT也可以写为:
补充数学性质:
性质1: G N k + N 2 = − G N k G_N^{k+\frac{N}{2}}=-G^k_N GNk+2N=−GNk
性质2: ( G N k ) 2 = G N / 2 k (G^k_N)^2=G^k_{N/2} (GNk)2=GN/2k
性质3: ∑ i = 0 N − 1 ( G N k ) i = 0 m o d p \sum^{N-1}_{i=0}(G^k_N)^i=0\mod p ∑i=0N−1(GNk)i=0modp
性质4: G N m ≠ G N n , ( 0 ≤ m , n < N − 1 ,且 m ≠ n ) G^m_N\neq G^n_N,(0≤m,n
GNm=GNn,(0≤m,n<N−1,且m=n)
不使用负包裹卷积举例:计算 a ⃗ \vec{a} a与 b ⃗ \vec{b} b相乘在 Z / ( x n + 1 ) \mathbb{Z}/(x^n+1) Z/(xn+1)下的结果 c ⃗ \vec{c} c,这里我们取 n = 4 n=4 n=4
- a ⃗ = { 1 , 2 , 3 , 4 } \vec{a}=\{1,2,3,4\} a={1,2,3,4}, b ⃗ = { 1 , 2 , 3 , 4 } \vec{b}=\{1,2,3,4\} b={1,2,3,4}
- 则 c ⃗ = 1 + 4 x + 10 x 2 + 20 x 3 + 25 x 4 + 24 x 5 + 16 x 6 \vec{c}=1+4x+10x^2+20x^3+25x^4+24x^5+16x^6 c=1+4x+10x2+20x3+25x4+24x5+16x6
- 由于 n = 4 n=4 n=4,故需要模 x 4 + 1 x^4+1 x4+1
- c ⃗ = ( 1 + 4 x + 10 x 2 + 20 x 3 正数部分 + 25 x 4 + 24 x 5 + 16 x 6 超过 x 4 + 1 , 所以是负数部分 ) / ( x 4 + 1 ) = − 24 − 20 x − 6 x 2 + 20 x 3 \vec{c}=(\frac{1+4x+10x^2+20x^3}{正数部分}+\frac{25x^4+24x^5+16x^6}{超过x^4+1,所以是负数部分})/(x^4+1)=-24-20x-6x^2+20x^3 c=(正数部分1+4x+10x2+20x3+超过x4+1,所以是负数部分25x4+24x5+16x6)/(x4+1)=−24−20x−6x2+20x3
负包裹卷积流程:
多项式 a ⃗ = { a 0 , a 1 , ⋅ ⋅ ⋅ , a n − 1 } \vec{a}=\{a_0,a_1,\cdot\cdot\cdot,a_{n-1}\} a={a0,a1,⋅⋅⋅,an−1}与多项式 b ⃗ = { b 0 , b 1 , ⋅ ⋅ ⋅ , b n − 1 } \vec{b}=\{b_0,b_1,\cdot\cdot\cdot, b_{n-1}\} b={b0,b1,⋅⋅⋅,bn−1}进行负包裹卷积运算
输入: a ⃗ = { a 0 , a 1 } \vec{a}=\{a_0,a_1\} a={a0,a1}, b ⃗ = { b 0 , b 1 } \vec{b}=\{b_0,b_1\} b={b0,b1},这里 N = 2 N=2 N=2
可根据链接:https://fanfansann.blog.csdn.net/article/details/115732914,选择原根与选择模数
以下严格按照负包裹卷积步骤:
令 φ = G 2 N = g p − 1 2 N \varphi=G_{2N}=g^{\frac{p-1}{2N}} φ=G2N=g2Np−1
a ′ = { a 0 , a 1 φ } a'=\{a_0,a_1\varphi\} a′={a0,a1φ}, b ′ = { b 0 , b 1 φ } b'=\{b_0,b_1\varphi\} b′={b0,b1φ}
N T T ( a ′ ) ⇒ A k = a 0 + a 1 φ G N k NTT(a')\Rightarrow A_k=a_0+a_1\varphi G_{N}^{k} NTT(a′)⇒Ak=a0+a1φGNk
N T T ( b ′ ) ⇒ B k = b 0 + b 1 φ G N k NTT(b')\Rightarrow B_k=b_0+b_1\varphi G_{N}^{k} NTT(b′)⇒Bk=b0+b1φGNk
则有:
A 0 = a 0 + a 1 φ A 1 = a 0 + a 1 φ G 2 1 B 0 = b 0 + b 1 φ B 1 = b 0 + b 1 φ G 2 1 A_0 = a_0+a_1\varphi \\ A_1=a_0+a_1\varphi G_{2}^{1}\\ \\ B_0=b_0+b1\varphi \\ B_1=b0+b_1\varphi G_{2}^{1} A0=a0+a1φA1=a0+a1φG21B0=b0+b1φB1=b0+b1φG21
逐点乘法: C k = A k ∘ B k C_k=A_k\circ B_k Ck=Ak∘Bk
则有:
C 0 = A 0 ⋅ B 0 = a 0 b 0 + ( a 0 b 1 + a 1 b 0 ) φ + a 1 b 1 φ 2 C_0=A_0\cdot B_0 = a_0b_0+(a_0b_1+a_1b_0)\varphi + a_1b_1\varphi^2 C0=A0⋅B0=a0b0+(a0b1+a1b0)φ+a1b1φ2
C 1 = A 1 ⋅ B 1 = a 0 b 0 − ( a 0 b 1 + a 1 b 0 ) φ + a 1 b 1 φ 2 C_1=A_1\cdot B_1= a_0b_0-(a_0b_1+a_1b_0)\varphi + a_1b_1\varphi^2 C1=A1⋅B1=a0b0−(a0b1+a1b0)φ+a1b1φ2
原因如下:
C 1 = A 1 ⋅ B 1 = a 0 b 0 + ( a 0 b 1 + a 1 b 0 ) φ G 2 1 + a 1 b 1 φ 2 G 2 2 C_1=A_1\cdot B_1= a_0b_0+(a_0b_1+a_1b_0)\varphi G_2^1 + a_1b_1\varphi^2 G_2^2 C1=A1⋅B1=a0b0+(a0b1+a1b0)φG21+a1b1φ2G22
由于 G 2 1 = − 1 G_2^1=-1 G21=−1, G 2 2 = 1 G^2_2=1 G22=1(有严格的数学证明)
故 C 1 = A 1 ⋅ B 1 = a 0 b 0 − ( a 0 b 1 + a 1 b 0 ) φ + a 1 b 1 φ 2 C_1=A_1\cdot B_1= a_0b_0-(a_0b_1+a_1b_0)\varphi + a_1b_1\varphi^2 C1=A1⋅B1=a0b0−(a0b1+a1b0)φ+a1b1φ2
INTT: c ′ = I N T T ( C ) ⇒ c n = 1 N ( C 0 + C 1 G N − k ) = 1 N ( A 0 B 0 + A 1 B 1 G N − k ) c'=INTT(C)\Rightarrow c_n=\frac{1}{N}(C_0+C_1G^{-k}_{N})=\frac{1}{N}(A_0B_0+A_1B_1G^{-k}_{N}) c′=INTT(C)⇒cn=N1(C0+C1GN−k)=N1(A0B0+A1B1GN−k)
- c 0 = 1 2 [ a 0 b 0 ( 1 + 1 ) + ( a 0 b 1 + a 1 b 0 ) φ ( 1 − 1 ) + a 1 b 1 φ 2 ( 1 + 1 ) ] = a 0 b 0 + a 1 b 1 φ 2 c_0=\frac{1}{2}[a_0b_0(1+1)+(a_0b_1+a_1b_0)\varphi(1-1) +a_1b_1\varphi^2(1+1)]=a_0b_0+a_1b_1\varphi^2 c0=21[a0b0(1+1)+(a0b1+a1b0)φ(1−1)+a1b1φ2(1+1)]=a0b0+a1b1φ2
- c 1 = 1 2 [ a 0 b 0 ( 1 − 1 ) + 2 ( a 0 b 1 + a 1 b 0 ) φ + a 1 b 1 φ 2 ( 1 − 1 ) ] = ( a 0 b 1 + a 1 b 0 ) φ c_1=\frac{1}{2}[a_0b_0(1-1)+2(a_0b_1+a_1b_0)\varphi+a_1b_1\varphi^2(1-1)]=(a_0b_1+a_1b_0)\varphi c1=21[a0b0(1−1)+2(a0b1+a1b0)φ+a1b1φ2(1−1)]=(a0b1+a1b0)φ
所以 c ′ = { c 0 , c 1 } = { a 0 b 0 + a 1 b 1 φ 2 , ( a 0 b 1 + a 1 b 0 ) φ } c'=\{c_0,c_1\}=\{a_0b_0+a_1b_1\varphi^2\ \ \ ,\ \ \ (a_0b_1+a_1b_0)\varphi\} c′={c0,c1}={a0b0+a1b1φ2 , (a0b1+a1b0)φ}
把 φ \varphi φ因子去除: c ⃗ = { c 0 , c 1 } = { a 0 b 0 + a 1 b 1 φ 2 , ( a 0 b 1 + a 1 b 0 ) } \vec{c}=\{c_0,c_1\}=\{a_0b_0+a_1b_1\varphi^2\ \ \ ,\ \ \ (a_0b_1+a_1b_0)\} c={c0,c1}={a0b0+a1b1φ2 , (a0b1+a1b0)},由于 φ = G 2 N = g p − 1 2 N \varphi=G_{2N}=g^{\frac{p-1}{2N}} φ=G2N=g2Np−1,故 φ 2 = g 2 ∗ ( p − 1 ) 2 ∗ N = − 1 \varphi^2=g^{\frac{2*(p-1)}{2*N}}=-1 φ2=g2∗N2∗(p−1)=−1,所以有:
c ⃗ = { c 0 , c 1 } = { a 0 b 0 − a 1 b 1 , ( a 0 b 1 + a 1 b 0 ) } \vec{c}=\{c_0,c_1\}=\{a_0b_0-a_1b_1\ \ \ ,\ \ \ (a_0b_1+a_1b_0)\} c={c0,c1}={a0b0−a1b1 , (a0b1+a1b0)}
倘若直接将 a ⃗ = { a 0 , a 1 } \vec{a}=\{a_0,a_1\} a={a0,a1}, b ⃗ = { b 0 , b 1 } \vec{b}=\{b_0,b_1\} b={b0,b1}相乘,然后再模运算会怎么样呢: a ⃗ ⋅ b ⃗ / ( x 2 + 1 ) \vec{a}\cdot\vec{b}/(x^2+1) a⋅b/(x2+1)
a ⃗ ⋅ b ⃗ / ( x 2 + 1 ) = [ a 0 b 0 + ( a 0 b 1 + a 1 b 0 ) x + a 1 b 1 x 2 ] / ( x 2 + 1 ) = a 0 b 0 + ( a 0 b 1 + a 1 b 0 ) x − a 1 b 1 = a 0 b 0 − a 1 b 1 + ( a 0 b 1 + a 1 b 0 ) x \vec{a}\cdot\vec{b}/(x^2+1)=[a_0b_0+(a_0b_1+a_1b_0)x+a_1b_1x^2]/(x^2+1)=a_0b_0+(a_0b_1+a_1b_0)x-a_1b_1=a_0b_0-a_1b_1+(a_0b_1+a_1b_0)x a⋅b/(x2+1)=[a0b0+(a0b1+a1b0)x+a1b1x2]/(x2+1)=a0b0+(a0b1+a1b0)x−a1b1=a0b0−a1b1+(a0b1+a1b0)x
结果与负包裹卷积相同。