现在来比较一下上面介绍的三中模运算——经典模运算、Barrett约化和Montgomery约化。
因为在绝大多数情况下被模数x的字长l为模数m的字长k的2倍,所以以下按照这种常见情况来进行比较。下面提到的乘法次数是指需要做多少次字与字的乘法,类似地,除法次数就是指需要做多少次两个字除以一个字的除法。表中给出的乘除法数没有包括预运算和事后处理运算。
|
经典模运算 |
Barrett约化 |
Montgomery约化 |
乘法次数 |
k(k+2.5) |
k(k+4) |
k(k+1) |
除法次数 |
k |
0 |
0 |
使用限制 |
━ |
|
|
预运算 |
标准化 |
|
|
事后处理 |
去标准化 |
━ |
去掉R |
表2.1 三种模运算的比较(l=2k)
从上表可以看出,在不考虑预运算和事后处理的情况下,Barrett约化和Montgomery约化更好一些。如果把预运算和事后处理也一起考虑进去的话,那就得分具体环境了。比如在做模指数运算时,需要多次模运算,所以此时使用Barrett约化和Montgomery约化比使用经典模运算更好一些,进一步,使用Montgomery约化的模指数运算应该是最优的,不过,Montgomery约化必需满足基本条件gcd(R,m)=1。但是若只需要做一次模运算的话,那么经典模运算应该是最佳的选择,因为其预运算和事后处理简单快捷(只是做简单的左移和右移)。