• NTT负包裹卷积


    前言

    本博客的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):

    1. 式1: X k = ∑ n = 0 N − 1 x n G N n k   m o d   p X_k = \sum^{N-1}_{n=0}x_nG_{N}^{nk}\ mod\ p Xk=n=0N1xnGNnk mod p,其中记 G N = g p − 1 N m o d    p G_N=g^{\frac{p-1}{N}}\mod p GN=gNp1modp

    数论变换逆变换(INTT):

    1. 式2: x n = 1 N ∑ k = 0 N − 1 X k G N − n k   m o d   p x_n=\frac{1}{N}\sum^{N-1}_{k=0}X_kG^{-nk}_N\ mod\ p xn=N1k=0N1XkGNnk mod p

    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. 式3: x n = N p − 2 ∑ k = 0 N − 1 X k G N n k ( p − 2 )   m o d   p x_n=N^{p-2}\sum^{N-1}_{k=0}X_kG^{nk(p-2)}_N\ mod\ p xn=Np2k=0N1XkGNnk(p2) mod p

    补充数学性质:

    性质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=0N1(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,nGNm=GNn,(0mn<N1,且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

    1. 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}
    2. 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
    3. 由于 n = 4 n=4 n=4,故需要模 x 4 + 1 x^4+1 x4+1
    4. 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)=2420x6x2+20x3

    负包裹卷积流程:

    多项式 a ⃗ = { a 0 , a 1 , ⋅ ⋅ ⋅ , a n − 1 } \vec{a}=\{a_0,a_1,\cdot\cdot\cdot,a_{n-1}\} a ={a0,a1,,an1}与多项式 b ⃗ = { b 0 , b 1 , ⋅ ⋅ ⋅ , b n − 1 } \vec{b}=\{b_0,b_1,\cdot\cdot\cdot, b_{n-1}\} b ={b0,b1,,bn1}进行负包裹卷积运算

    1. φ = G 2 N = g p − 1 2 N \varphi=G_{2N}=g^{\frac{p-1}{2N}} φ=G2N=g2Np1
    2. a ′ = { a 0 , a 1 φ , ⋅ ⋅ ⋅ , φ n − 1 a n − 1 } a'=\{a_0,a_1\varphi,\cdot\cdot\cdot,\varphi^{n-1} a_{n-1}\} a={a0,a1φ,,φn1an1},令 b ′ = { b 0 , b 1 φ , ⋅ ⋅ ⋅ , φ n − 1 b n − 1 } b'=\{b_0,b_1\varphi,\cdot\cdot\cdot,\varphi^{n-1} b_{n-1}\} b={b0,b1φ,,φn1bn1}
    3. NTT:记 A = N T T ( a ′ ) A=NTT(a') A=NTT(a) B = N T T ( b ′ ) B=NTT(b') B=NTT(b)
    4. 逐点乘法(point wise multiplication): C = A ∘ B C=A\circ B C=AB
    5. INTT: c ′ = I N T T ( C ) = { c 0 , φ c 1 , . . . , φ n − 1 c n − 1 } c'=INTT(C)=\{c_0,\varphi c_1,...,\varphi^{n-1} c_{n-1}\} c=INTT(C)={c0,φc1,...,φn1cn1}
    6. φ \varphi φ因子再去掉,得到最终结果 c ⃗ = { c 0 , φ − 1 c 1 , . . . , φ − ( n − 1 ) c n − 1 } \vec{c}=\{c_0,\varphi^{-1}c_1,...,\varphi^{-(n-1)}c_{n-1}\} c ={c0,φ1c1,...,φ(n1)cn1}

    三. 负包裹卷积举例

    输入: 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,选择原根与选择模数

    以下严格按照负包裹卷积步骤:

    1. φ = G 2 N = g p − 1 2 N \varphi=G_{2N}=g^{\frac{p-1}{2N}} φ=G2N=g2Np1

    2. 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φ}

    3. 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

    4. 逐点乘法: C k = A k ∘ B k C_k=A_k\circ B_k Ck=AkBk

      则有:

      1. 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=A0B0=a0b0+(a0b1+a1b0)φ+a1b1φ2

      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=A1B1=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=A1B1=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=A1B1=a0b0(a0b1+a1b0)φ+a1b1φ2

    5. 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+C1GNk)=N1(A0B0+A1B1GNk)

      1. 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)φ(11)+a1b1φ2(1+1)]=a0b0+a1b1φ2
      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(11)+2(a0b1+a1b0)φ+a1b1φ2(11)]=(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)φ}

    6. φ \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=g2Np1,故 φ 2 = g 2 ∗ ( p − 1 ) 2 ∗ N = − 1 \varphi^2=g^{\frac{2*(p-1)}{2*N}}=-1 φ2=g2N2(p1)=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}={a0b0a1b1   ,   (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)xa1b1=a0b0a1b1+(a0b1+a1b0)x

    结果与负包裹卷积相同。

  • 相关阅读:
    【GYM 102832H】【模板】Combination Lock(二分图博弈)
    使用go pprof进行golang程序内存分析
    Visual Studio 2022 安装
    B2C在线教育商城--前后端分离部署
    集卡拖车运输最新政策调整来了_箱讯科技
    竞赛选题 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉
    Symbol
    Acwing:食物链(记忆化搜索 Python)
    web3通过antd 在React dapp中构建订单组件基本结构
    Spring Security(三) —— 加密系统
  • 原文地址:https://blog.csdn.net/wxkhturfun/article/details/128007419