【问题标题】:How can WolframAlpha exponentiate numbers so quickly?Wolfram Alpha 指数数怎么能这么快?
【发布时间】:2013-10-14 00:16:15
【问题描述】:
【问题讨论】:
标签:
c
algorithm
math
cryptography
rsa
【解决方案1】:
有一个名为 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 对其进行修改,这也可以保持较低的位数并使其更快。
希望这会有所帮助!