• 基础算法优化——Fast Modular Multiplication


    1. 引言

    Yuval Domb 2022年论文《Fast Modular Multiplication

    模乘可以说是任何密码系统中计算量最大的算术原语。本文提出了一种高效、硬件友好的算法,据作者所知,该算法优于迄今为止的算法。

    标准的modulo-prime multiplication problem in F s \mathbb{F}_s Fs表示为:
    r = a ⋅ b m o d    s

    r=abmods" role="presentation" style="position: relative;">r=abmods
    r=abmods
    其中 a , b , s ∈ F s a,b,s\in\mathbb{F}_s a,b,sFs s s s为素数,并利用标准 Z \mathbb{Z} Z-algebra。
    等价为:
    a ⋅ b = l ⋅ s + r
    ab=ls+r" role="presentation" style="position: relative;">ab=ls+r
    ab=ls+r

    其中, l ∈ Z l\in \mathbb{Z} lZ,使得 0 ≤ r < s 0\leq r < s 0r<s

    本文主要为(1)中计算提供了一种高效、硬件友好的快速计算方法。

    将所有变量以 d d d-进制来表示,其中 F s \mathbb{F}_s Fs内的每个元素都以 n n n个digits来表示,有:
    n = ⌈ log ⁡ d s ⌉

    n=logds" role="presentation" style="position: relative;">n=logds
    n=logds

    接下来,简单地令 d = 2 d=2 d=2,所有元素以二进制来表示。

    尽管本文重点关注modulo-prime multiplication,但可将其推广到任意 a m o d    s a\mod s amods运算,其中 a < s 2 aa<s2 s s s可为素数或非素数的任意值。

    2. 本文主要贡献

    本文主要展现了,如何将:

    结合,用于求取quotient l l l的近似值,近视精度为一个小的constant error,该constant error与 n n n无关(无论 n n n值大小)。

    令人惊讶的是,最终的reduction算法与Montgomery的Modular-Multiplication算法(见Montgomery 1985年论文《 Modular multiplication without trial division》)类似,但是本文最终的reduction算法不需要coordinate translation。

    本文的bounding技术可用于进一步降低特定感兴趣场景的计算复杂度(知识需要增加constant error),本文不展开。

    3. Reduction Scheme

    3.1 假设 l l l 为近似已知

    假设 l l l 为近似已知,将其近似值表示为 l ^ \hat{l} l^,使得:
    l − λ ≤ l ^ ≤ l

    lλl^l" role="presentation" style="position: relative;">lλl^l
    lλl^l
    其中 λ = O ( 1 ) \lambda=O(1) λ=O(1)为一个已知的constant。

    λ = 0 \lambda=0 λ=0,则显然有:
    a b [ 2 n − 1 : 0 ] − l ^ s [ 2 n − 1 : 0 ] = r [ n − 1 : 0 ]

    ab[2n1:0]l^s[2n1:0]=r[n1:0]" role="presentation" style="position: relative;">ab[2n1:0]l^s[2n1:0]=r[n1:0]
    ab[2n1:0]l^s[2n1:0]=r[n1:0]
    其中[]中括号内的值表示了bit locations和sizes。

    注意,当 λ = 0 \lambda=0 λ=0时,可推测余数 r r r最大长度为 n n n bits,使得等式(5)中右侧值的剩余最高有效位(ms (most-significant) bits)必须为 0 0 0

    通过简单的bit操作,可以long addition表示为:
    在这里插入图片描述
    其中,上横杠表示的是bit-inversion运算符,横岗上的 1 1 1表示为初始carry bit。
    不过,对上面的long addition表示仔细观察可知,仅需要 a b [ n − 1 : 0 ] ab[n-1:0] ab[n1:0] l ^ s [ n − 1 : 0 ] \hat{l}s[n-1:0] l^s[n1:0] 来完成该计算,从而可节约近一半的计算量。最终的adder为a fixed width adder——即, n + n → n n+n\rightarrow n n+nn。这意味着可忽略 ms bits(最高有效位)的任何溢出。可将其等价为a fixed-width subtractor——即, n − n → n n-n\rightarrow n nnn,可将其结果看成是unsigned integer。

    将生成以上乘积的multiplier表示为 n × n → n lsb n\times n\rightarrow n_{\text{lsb}} n×nnlsb,其中 n lsb n_{\text{lsb}} nlsb是指该full product的 n n n个least-significant bits。 a ⋅ b a\cdot b ab l ^ ⋅ s \hat{l}\cdot s l^s都可通过 n × n → n lsb n\times n\rightarrow n_{\text{lsb}} n×nnlsb来生成。
    此外,若 s s s为constant, l ^ ⋅ s \hat{l}\cdot s l^s可通过一个constant n × n → n lsb n\times n\rightarrow n_{\text{lsb}} n×nnlsb multiplier来生成。

    λ ≠ 0 \lambda\neq 0 λ=0时:
    a b − l ^ s = r + λ s

    abl^s=r+λs" role="presentation" style="position: relative;">abl^s=r+λs
    abl^s=r+λs
    此时,用于表示等式(5)中右侧值所需的number of bits为:
    ⌈ log ⁡ 2 ( r + λ s ) ⌉ ≤ n + ⌈ log ⁡ 2 r + λ s s ⌉ ≤ n + ⌈ log ⁡ 2 ( 1 + λ ) ⌉
    log2(r+λs)n+log2r+λssn+log2(1+λ)" role="presentation" style="position: relative;">log2(r+λs)n+log2r+λssn+log2(1+λ)
    log2(r+λs)n+log2sr+λsn+log2(1+λ)

    因此,若 λ = 1 \lambda=1 λ=1,则仅需要额外再增加 1 1 1个bit来表示。

    3.2 使用Barrett Reduction算法求 l l l的近似值

    采用Barrett的modular reduction算法对 l l l求近似值为:
    l = ⌊ a b s ⌋ = lim ⁡ k → ∞ a b ⋅ m ( k ) 2 k + n

    l=abs=limkabm(k)2k+n" role="presentation" style="position: relative;">l=abs=limkabm(k)2k+n
    l=sab=klim2k+nabm(k)
    其中:
    m ( k ) = ⌊ 2 k + n s ⌋ < 2 k + 1
    m(k)=2k+ns<2k+1" role="presentation" style="position: relative;">m(k)=2k+ns<2k+1
    m(k)=s2k+n<2k+1

    为a function of the k k k,最多有 k + 1 k+1 k+1 bits,为公式(8)的lower-bound approximator。对于有限的 k k k值,该approximation error为:
    e ( k ) ≡ 1 s − m ( k ) 2 k + n < 2 − ( k + n )
    e(k)1sm(k)2k+n<2(k+n)" role="presentation" style="position: relative;">e(k)1sm(k)2k+n<2(k+n)
    e(k)s12k+nm(k)<2(k+n)

    其中,可检查二进制表示的左右项的最大差异来派生出该upper-bound。从而有approximation error on l ( k ) l(k) l(k)为:
    e ( l , k ) ≡ a b s − a b ⋅ m ( k ) 2 k + n < 2 2 n ⋅ 2 − ( k + n ) = 2 n − k
    e(l,k)absabm(k)2k+n<22n2(k+n)=2nk" role="presentation" style="position: relative;">e(l,k)absabm(k)2k+n<22n2(k+n)=2nk
    e(l,k)sab2k+nabm(k)<22n2(k+n)=2nk

    k ≥ n k\geq n kn,则该approximation error最多为 1 1 1

    3.3 参数选择 以及 error bounding

    选择 k = n k=n k=n(即 m ( n ) < 2 n + 1 m(n)<2^{n+1} m(n)<2n+1),则对 l l l的近似值为:
    l ^ 0 = ⌊ a b m 2 2 n ⌋

    l^0=abm22n" role="presentation" style="position: relative;">l^0=abm22n
    l^0=22nabm
    e ( l ^ 0 ) < 1
    e(l^0)<1" role="presentation" style="position: relative;">e(l^0)<1
    e(l^0)<1

    其中multiplication为 n × n × ( n + 1 ) → ( n + 1 ) msb n\times n\times (n+1)\rightarrow (n+1)_{\text{msb}} n×n×(n+1)(n+1)msb,且approximation error遵循(11)。

    分两个阶段来实现以上multiplication:

    • 1)首先,假设有 a b [ 2 n − 1 : 0 ] ab[2n-1:0] ab[2n1:0],按如下方式计算multiplication:
      a b m 2 2 n = a b [ 2 n − 1 : n ] ⋅ m 2 n + a b [ n − 1 : 0 ] ⋅ m 2 2 n
      abm22n=ab[2n1:n]m2n+ab[n1:0]m22n" role="presentation" style="position: relative;">abm22n=ab[2n1:n]m2n+ab[n1:0]m22n
      22nabm=2nab[2n1:n]m+22nab[n1:0]m

      < a b [ 2 n − 1 : n ] ⋅ m 2 n + 2
      <ab[2n1:n]m2n+2" role="presentation" style="position: relative;"><ab[2n1:n]m2n+2
      <2nab[2n1:n]m+2

      其中最右侧项trivially upper-bounded by 2 2 2
    • 2)从而对 l l l的近似变为:
      l ^ 1 = ⌊ ⌊ a b 2 n ⌋ ⋅ m 2 n ⌋
      l^1=ab2nm2n" role="presentation" style="position: relative;">l^1=ab2nm2n
      l^1=2nab2nm

      e ( l ^ 1 ) < 3
      e(l^1)<3" role="presentation" style="position: relative;">e(l^1)<3
      e(l^1)<3

      其中,最里侧的multiplication为 n × n → n msb n\times n \rightarrow n_{\text{msb}} n×nnmsb,最外侧的constant multiplication为 n × ( n + 1 ) → ( n + 1 ) msb n\times (n+1)\rightarrow (n+1)_{\text{msb}} n×(n+1)(n+1)msb,approximation error由(13)和(15)中的最右侧项 之和 upper-bounded。

    注意,由于 m ( n ) m(n) m(n) is typically very close to 2 n 2^n 2n,且 n n n通常很大,无需额外增加bits来表示(17)中的constant error,即 n + 1 n+1 n+1 bits就足够了。
    尽管如此,必须为每个特定setup检查并排除溢出的边界情况。

    3.4 总体算法

    以下为hardware-optimized modular multiplier结构图,假定了 s s s m m m为已知的constants,使用 l ^ 1 \hat{l}_1 l^1来表示 l l l的近似值。
    在这里插入图片描述
    注意,最左侧的multiplication module独立于reduction logic,使得该circuit的remainder可generalized beyond multiplication reduction。

    3.5 举例

    3.5.1 以 n = 16 n=16 n=16举例

    在这里插入图片描述
    在这里插入图片描述

    3.5.2 以 n = 32 n=32 n=32举例

    在这里插入图片描述

    3.5.3 例外情况

    s = 65717 , a = 65535 , b = 65631 s=65717, a=65535, b=65631 s=65717,a=65535,b=65631时,真实 l l l值应为 ⌊ a b s ⌋ = 65449 \left \lfloor \frac{ab}{s} \right \rfloor=65449 sab=65449。而根据本文算法获得近似值 l ^ 1 = 65546 \hat{l}_1=65546 l^1=65546,此时,error e ( l ^ 1 ) e(\hat{l}_1) e(l^1)的值为 3 3 3
    不过,对于prime s s s,这样的例外情况并不多,对于大多数的primes,最大可能error将不会超过 2 2 2

  • 相关阅读:
    自研、好用、够快、稳定、代码可读性强的ORM
    Python多线程的用法
    XML Map 端口进阶篇——常用关键字和格式化器详解
    Python多进程开发
    vulnhub-xxe lab: 1
    ssm+java+vue基于微信小程序的电影院票务系统(可选座评论等功能)#毕业设计
    汇编语言之源程序
    elasticdump官方教程
    【Zotero】翻译插件导入百度API
    30秒使用json-server创建Faker REST API
  • 原文地址:https://blog.csdn.net/mutourend/article/details/126000814