蒙哥马利约减算法
0.说明
我们需要求T mod N 的结果,设蒙哥马利约减算法为F,可以做到F(x)=xR' 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和N求R'和N'可以利用扩展欧几里得求这个方程
求得x y的整数解 x=R' y=N'
可以得到
即
如此我们要想得到T mod N 则需要计算
1.目标
计算
2.过程
不写乘号了,接下来省略乘号,看起来好像有点奇怪
对这个方程 mod N可以得到
即R'和R在mod N运算下互为逆元且R'(0,N)
对这个方程 mod R可以得到
即N'和(-N)在mod R运算下互为逆元且N'(0,R),后面会用到这个条件
接下来有
设??这个我暂时不知道还有什么深意,仅仅是后面那个范围判断?
注意这个T应该是下面那个函数参数里的T,并不是单纯的上面一开始的那个T,传入参数F(TR),TR整体就是函数中的T了
令
有
有
关于上面这个式子有一个非常有意思的角度看待它
在与T同余的数中,选取一个低位有bitlen个0,且高位小于N的数,去掉该数低位的bitlen个0,所得的数即为(T+mN)/R,bitlen为模数N的位数
有兴趣的去看一下这篇文章
这说明对任意的,存在整数m使得上式没有余数,即完全整除,是个整数
如此的话,我们把TN'中的所有R全部消去,即对TN'做mod R不影响结果,因为k可以设为负值达到这个效果
所以在计算代替
//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
由,
t=(T+mN)/R<(RN+RN)/R=N+N=2N,即t<2N,所以有上面那个if
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~