什么是计算功效的最有效算法?

时间:2019-09-20 07:43:54

标签: python-3.x exponentiation

我正在通过python 3模拟用于公共和私有密钥设置的RSA协议,我必须处理大量的指数。由于pow(base,exp)似乎在合理的时间内无法运行,因此我一直在尝试使用其他算法,但目前看来似乎没有任何效果。

到目前为止,哪种算法最有效?

2 个答案:

答案 0 :(得分:2)

通过对前一个二进制幂进行平方运算来计算基本模n的二进制幂。 base ^ 2 = base ^ 1 * base ^ 1; base ^ 4 = base ^ 2 * base ^ 2

“二进制”是指base ^ 0,base ^ 1,base ^ 2,base ^ 4,base ^ 8等。

然后将指数中的该位设置为二进制数的倍数。

例如指数9:base ^ 9 = base ^ 1 * base ^ 8。 所有计算均以模n为单位。

查找附带的伪代码;我希望它是正确的,因为它未经测试;

//pseudocode
function myPower(base, exponent, n) {
    power = 1;
    binarypower = base;
    while(exponent>0) {
        if(exponent&1 != 0) {
            power = (binarypower * power) %n;
        }
        exponent = exponent>>1;
        if(exponent>0) {
            binarypower = (binarypower*binarypower)%n;
        }
    }
    return power;
}

答案 1 :(得分:1)

首先,标题的答案是 unknown 。这个问题很难解决,您可以详细了解in this Wikipedia article。实际上,几乎所有人都使用exponentiation by squaring,包括Python的算法。

但是在RSA中,您使用的是模幂,我希望那是您要出错的地方。如果您计算pow(base, exp) % mod,由于中间指数的增加,这将非常慢。诀窍是减少每一步的取幂,这是因为a * b mod m == ((a mod m) * (b mod m)) mod m是允许的。这已经在Python中通过使用内置三个参数的pow函数(不是 math.pow,而是内置pow)实现了: pow(base, exp, mod)。结果等于pow(base, exp) % mod,但是对于大指数来说,此功能要快得多。

最后,对于以大量模为模的固定模进行非常大的计算,将数字以蒙哥马利形式并使用Montgomery reduction可能是有益的。但是,这是一种更高级的数论,您不需要。