蒙哥马利乘法

蒙哥马利乘法

一.主要思想

​ 计算a*b modN时,modN运算实际上就是除N取余数。而计算机计算除法的速度很慢,因此modN会耽误大量的计算时间。蒙哥马利乘法使用其他运算来代替除法运算,提高运算速度。

​ 设R = 2k且R与N互素,此时modR运算为与运算(和R-1按位与),除R运算就是右移运算。蒙哥马利乘法正是使用了modR和除R两种操作来替换modN操作。

​ 设蒙哥马利型为 a’ = a*R,同时T = a * b。计算a*bmodN时,先计算a’*b’modN = T’*RmodN,再计算 T’modN,最后根据T’modN还原出TmodN。

二.蒙哥马利约减

​ 蒙哥马利约减是蒙哥马利乘法的基本操作。主要作用为计算 T*R-1modN。使用蒙哥马利约减,就可以实现蒙哥马利乘法。

​ 蒙哥马利约减要计算的为T*R-1modN,如果T整除于R,那么计算就会容易很多。我们不妨令T+mN整除于R,由于T = T+mN modN,所以最终结果不会变化。即:T + mN = 0modR ,移项后,m = -N-1*T modR = (TmodR)*-N-1modR。

​ 因此T*R-1可以转换为(T+mN)/R。蒙哥马利约减的伪代码如下,其中N’ = -N-1

在这里插入图片描述

​ 由于R = 2k,因此在蒙哥马利约减中,没有任何除法运算。modR可以转换为与运算,除R可以转换为位移运算。

//接口定义
REDC(T,R,N,N’);

三.利用蒙哥马利约减实现乘法

//选定R  其中R = 2^k且R与N互素
//计算R的平方
R2 = R * RmodN; 
//计算-N^-1
-N_inv = -N^-1 modR;
//计算a的蒙哥马利型 
aR = REDC(a*R2,R,N,-N_inv);
//计算b的蒙哥马利型 
bR = REDC(b*R2,R,N,-N_inv);
//计算a*b的蒙哥马利型 
abR = REDC(aR*bR,R,N,-N_inv);
//计算最终结果 
ab = REDC(abR,R,N,-N_inv);

​ 通过如上代码可以看到,只有计算R2和-N_inv的过程需要用到除法。而这两个参数只需要计算一次,因此在确定R,N后,乘法次数越多,蒙哥马利算法的表现就越优秀。

四.利用蒙哥马利约减实现除,加,减

//除  a*bmodN = a*b^-1 modN;

//加  a+b = (aR + bR)R^-1 modN;

//计算a的蒙哥马利型 
aR = REDC(a*R2,R,N,-N_inv);
//计算b的蒙哥马利型 
bR = REDC(b*R2,R,N,-N_inv);
//计算结果
a_add_b =  REDC(aR+bR,R,N,-N_inv);

//减  a+b = (aR - bR)R^-1 modN;

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值