找回密码
 欢迎注册
查看: 26663|回复: 7

[讨论] montgomery乘法

[复制链接]
发表于 2008-4-20 21:22:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
考虑正奇数$n$,设$r=2^s$,$2^{s-1} <= n < 2^s$
则$(n, r) = 1$
且设$r^-1$为$r$模$n$的逆,同样$n^-1$为n模r的逆
定义$n' = -n^-1 (mod r) \quad m = t*n' (mod r)$
    对整数$t$成立

        $(t + m * n) // r -= t * r^-1 (mod n)$

注意同余式的左面,取模$r$同于并且做除$r$的除法,它为模$n$的一个余数。通过选择$r$为$2$的幂,即为$2^s$,可以简单的把$x$从第$s$比特分开而得到$x$模$r$的约化,可以通过$x$向右移动$s$比特来执行除法$r$除以$x$。

这一计算模$n$约化的原理称为montgomery约化。

为应用montgomery约化,利用合适的$r=2^s$将模$n$的计算转换到完全剩余系

    $R = R(r, n) = { i * r mod n | 0 <= i < n}$

然后定义$R$中的值$a$和$b$的montgomery乘积$xx$
   
   $a xx b = a * b * r^-1 mod n$

在$R(r, n)$中montgomery乘积$a xx b$算法
1、置$t = a * b$
2、置$m = t * n' (mod r)$
3、置$u = (t + m * n) // r$
4、若$u >= n$, 输出$u - n$,否则输出$n$

该算法使用了三个长乘法

用montgomery乘积计算$p = a * b (mod n)$, $n$为奇数
1、确定$r = 2^s, 2^{s-1} <=  n < 2^s$,用扩展的Euclid算法计算$1 = r'*r - n' * n$
2、置$a' = a*r (mod n)$
3、置$p = a xx b$并输出$p$

通常在算法里$mod n$运算, $n$是不变的,所以通过预先计算,模$n$的除法就转化为乘法运算了
而通常乘法是远超过除法速度的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-21 10:53:59 | 显示全部楼层


GxQ实现过这个算法么?
谈下感受
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-4-21 20:10:16 | 显示全部楼层
素性检测算法中少不了大量的模幂过程,所以模幂算法的效率至关重要。

在网上都比较推崇 Montgomery 算法,所以后来就自学了,并实现了它。
据我的实践,在数值较大时速度不理想,与 GMP 的代码表现一致:
在 GMP 中专门有一个临界值 POWM_THRESHOLD,只有小于它且模为奇数时才采用该算法。

这里顺带上传几个相关文档,供大家参考:

montg.pdf

84.33 KB, 下载次数: 11, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

Montgomery Algorithm for Modular Multiplication

Fast_montgomery.pdf

315.03 KB, 下载次数: 10, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

Fast_montgomery.pdf

modify_montgomery.pdf

382.85 KB, 下载次数: 11, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

modify_montgomery.pdf

Modular Exponentiation Algorithm Analysis.pdf

106.89 KB, 下载次数: 8, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

Modular Exponentiation Algorithm Analysis.pdf

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-21 21:01:38 | 显示全部楼层


是不是如果当大于阀值
即使是素性测试算法也得不到好处?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-10 14:06:35 | 显示全部楼层
3# gxqcn


真是的,原来你都能看到GMP的算法的代码,然后用你的hugecalc与GMP比较快慢,
要是GMP也能看到你的代码,估计就不会比你慢了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-7-12 10:19:18 | 显示全部楼层
gxqcn 发表于 2008-4-21 20:10
素性检测算法中少不了大量的模幂过程,所以模幂算法的效率至关重要。

在网上都比较推崇 Montgomery 算法 ...

附件过期了。。。

评分

参与人数 1金币 +20 收起 理由
gxqcn + 20 首帖奖励,欢迎常来。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-7-12 11:27:03 | 显示全部楼层
论坛之前用的是免费空间(最近已转成收费空间),
由于种种原因,先前的附件有部分缺失,很遗憾。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-8-22 20:32:18 来自手机 | 显示全部楼层
数值大的时候为什么效率会不好呢?乘法毕竟比除法快很多。是不是你模幂时指数不够大?我们应该选指数和模差不多大小的。实际是这算法在有限域上特别有用
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-6-2 04:17 , Processed in 0.049572 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表