蒙哥马利约减算法

0.说明

我们需要求T mod N 的结果,设蒙哥马利约减算法为F,可以做到F(x)=x\(\times\)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 \times R' \ mod N=1\)
等价于方程\(x \times R -y \times N=1\)
由R和N求R'和N'可以利用扩展欧几里得求这个方程\(x \times R -y \times N=1\)
求得x y的整数解 x=R' y=N'
可以得到\(R \times R' -N \times N'=1\)
\(RR' -NN'=1\)
如此我们要想得到T mod N 则需要计算 \(F(T\times R)=T \times R \times R' \ mod\ N =T \ mod\ N\)

1.目标

计算\(T \times 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),后面会用到这个条件
接下来有
\(T\in [0,R*N)\)??这个我暂时不知道还有什么深意,仅仅是后面那个范围判断?
注意这个T应该是下面那个函数参数里的T,并不是单纯的上面一开始的那个T,传入参数F(TR),TR整体就是函数中的T了
\(T=T \times (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的位数
有兴趣的去看一下这篇文章
这说明对任意的\(T\in [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)\),\(T\in [0,R*N)\)
t=(T+mN)/R<(RN+RN)/R=N+N=2N,即t<2N,所以有上面那个if

原文链接: https://www.cnblogs.com/lxzbky/p/14170405.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    蒙哥马利约减算法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/399953

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月14日 上午9:39
下一篇 2023年4月14日 上午9:39

相关推荐