WolframAlpha如何如此快速地进行数字指数运算?

10

也许这篇文章可以帮助你。特别是关于实现问题的部分 - Shashank
1个回答

15

有一种简单的算法叫做指数平方算法(Exponentiation by Squaring),可以非常高效地计算 ab mod c 的值。它基于这样一个观察结果:

a2k mod c = (ak)2 mod c

a2k + 1 mod c = a · (ak)2 mod c

有了这个规律,我们可以用以下递归方法来计算 ab mod c:

function raiseModPower(a, b, c):
    if b == 0 return 1
    let d = raiseModPower(a, floor(b/2), c)
    if b mod 2 = 1:
        return d * d * a mod c
    else
        return d * d mod c

这个算法只需要 O(log b) 次乘法,每次乘法中的数字位数不超过 O(log c),所以非常快。RSA 实现也是用这种方法进行幂运算的。如果您喜欢,可以将其重写为迭代形式,但我认为递归形式很清晰。

有了这个算法,您可以使用标准技术来计算任意精度的数字。由于只需要 O(log b) 次乘法迭代(而不是 b 次),速度非常快。您实际上从未计算过 ab 并对 c 取模,这也使数字位数保持较低并且更快。

希望这能帮到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接