zoukankan      html  css  js  c++  java
  • Barrett reduction算法

    参考文章

    1.模乘的两种优化

    1.蒙哥马利模乘算法

    2.Barrett reduction算法

    使用算法1需要满足条件,模数N和进制数R互质

    当不符合此条件时,使用算法2

    这次来记录下第二种算法,防止遗忘

    2.先说一下流程

    b进制下,求 x mod m,默认大于0

    m为k位数(b进制下),x位数小于等于2*k

    //b^n代表b的n次幂,mu=b^2k / m,可以预计算
    int BaRdc(x){
          q1 = x / b^(k-1);//右移k-1位,取整,后面同
          q2 = q1 * mu;
          q3 = q2 / b^(k+1);//移位
          r1 = x % b^(k+1);//取低k位,因为mod m,m是k位的,所以只需看低k位即可
          r2 = (q3 * m) % b^(k+1);//低k位
          r = r1 - r2;//低k位相减
          if ( r > m ) r -= m;
          return r;
    }
    

    3.原理说明

    (mu=[frac{b^{2k}}{m} ])
    (q_{1} =[frac{x}{b^{k-1} } ])方括号代表取整
    (q_{2} =q_{1} imes mu)
    (q_{3} =[frac{q_{2}}{b^{k+1}} ])
    可以得到几个范围
    (frac{x}{b^{k-1}}-1< q_{1} leq frac{x}{b^{k-1}})
    (frac{b^{2k}}{m}-1< mu leq frac{b^{2k}}{m}) 这两个应该很明显
    (frac{x imes b^{k+1}}{m}-frac{b^{2k}}{m}-frac{x}{b^{k-1}}+1< q_{2} leq frac{x imes b^{k+1}}{m}) 两个范围相乘
    (frac{x}{m}-frac{b^{k-1}}{m}-frac{x}{b^{2k}}+frac{1}{b^{k+1}}< q_{3} leq frac{x}{m})
    另外还有两个显然的条件
    (frac{b^{k-1}}{m}leq 1,frac{x}{b^{2k}}leq 1)
    m在b进制下为k位,x在b进制下不大于2k位
    所以进行下放缩,两项放缩一项舍去,(frac{x}{m}-2< q_{3} leq frac{x}{m})
    (d=[x/m])
    q3是整数,很容易观察到,(d-1leq q_{3} leq d)
    q3应该大概率为d
    如果q3=d,(x mod m=(x-q_{3}m)mod m)
    q3=d-1时再减去一个m即可

  • 相关阅读:
    slua
    Lua和.Net
    Python Embedded
    vtk
    CMAKE使用
    Create instance from class name string
    SLN & PROJ
    Python/C API
    魔兽世界编年史卷一
    PyCharm注册码
  • 原文地址:https://www.cnblogs.com/lxzbky/p/14178679.html
Copyright © 2011-2022 走看看