zoukankan      html  css  js  c++  java
  • 蒙哥马利约减算法

    0.说明

    我们需要求T mod N 的结果,设蒙哥马利约减算法为F,可以做到F(x)=x( imes)R' mod N
    R为进制数或进制数的幂次,在计算机当中,设N的2进制位数为s,R可以取2^s,且与N互质
    比如2进制数,R=2;
    10进制数,R=10;
    2^30 进制,R=2^30;
    如此这样,某个R进制的数乘除以及modR就是在移位和取低位操作
    其中R'满足条件: (R imes R' mod N=1)
    等价于方程(x imes R -y imes N=1)
    由R和N求R'和N'可以利用扩展欧几里得求这个方程(x imes R -y imes N=1)
    求得x y的整数解 x=R' y=N'
    可以得到(R imes R' -N imes N'=1)
    (RR' -NN'=1)
    如此我们要想得到T mod N 则需要计算 (F(T imes R)=T imes R imes R' mod N =T mod N)

    1.目标

    计算(T imes R' mod N)

    2.过程

    (RR' -NN'=1)
    不写乘号了,接下来省略乘号,看起来好像有点奇怪
    对这个方程 mod N可以得到(RR' mod N=1)
    即R'和R在mod N运算下互为逆元且R'(in)(0,N)
    对这个方程 mod R可以得到(-NN' mod R=1)
    即N'和(-N)在mod R运算下互为逆元且N'(in)(0,R),后面会用到这个条件
    接下来有
    (Tin [0,R*N))??这个我暂时不知道还有什么深意,仅仅是后面那个范围判断?
    注意这个T应该是下面那个函数参数里的T,并不是单纯的上面一开始的那个T,传入参数F(TR),TR整体就是函数中的T了
    (T=T imes (RR' -NN'))
    (T+TN'N=TRR')
    (m=TN')
    (T+mN=TRR')
    ((T+mN)/R=TR')
    关于上面这个式子有一个非常有意思的角度看待它
    在与T同余的数中,选取一个低位有bitlen个0,且高位小于N的数,去掉该数低位的bitlen个0,所得的数即为(T+mN)/R,bitlen为模数N的位数
    有兴趣的去看一下这篇文章
    这说明对任意的(Tin [0,R*N)),存在整数m使得上式没有余数,即完全整除,是个整数
    (TR' mod N=(TRR')/R mod N=T(N'N + 1)/ R mod N=(TN'N+kRN+T)/R mod N=((TN'+kR)N+T)/R mod N,k为任意整数)
    如此的话,我们把TN'中的所有R全部消去,即对TN'做mod R不影响结果,因为k可以设为负值达到这个效果
    所以在计算(m=TN'时可以用m=TN' mod R)代替

    //RR' -NN'=1
    F(T)=TR' mod N
    int F(int T)
    {
        int m,t;
        m=((T%R)*N')%R;//m<R,原理在上面
        t=(T+m*N)/R;
        if(t>=N)//有疑问对吧,先接着看
        {
          t-=N;
        }
        return t;
    }
    

    实际上,t=(T+mN)/R<2N
    (m,N' in (0,R)),(Tin [0,R*N))
    t=(T+mN)/R<(RN+RN)/R=N+N=2N,即t<2N,所以有上面那个if

  • 相关阅读:
    很实用的linux 上的svn安装和svnserver 的重启
    将单链表逆置*
    25 链队列
    24 顺序队列(循环队列)
    23 顺序队列
    界面常见的交互反馈
    事件
    22 链栈
    渲染“Hello World”(将脚本数据渲染在界面上)
    引用(import 和 include)
  • 原文地址:https://www.cnblogs.com/lxzbky/p/14170405.html
Copyright © 2011-2022 走看看