作为问题,我不明白为什么我们需要一些算法,如指数通过平方或模幂运算来计算数字的幂。
例如,我有一个重复的乘法算法,如下所示:
def expt_mul(a, n):
r = 1
for i in xrange(n):
r *= a
return r
a乘以n次,所以复杂度为O(n),为什么效率不高?
答案 0 :(得分:6)
在加密中,例如,通常进行取幂,其中指数可以是2 100 或更多的数量级。假设您每秒可以进行10次 10 次乘法,那么您需要的是需要大约10 20 秒的东西。用这种方式表达,你可能会耸耸肩说“那又怎么样?”,让我们把它转换成年份:10 20 秒/ 3600秒/小时/ 24小时/天/ 365.25天/年/ 14E9年/当前宇宙年龄=>超过现在宇宙年龄的226倍!与对数时间算法进行对比,该算法将在几百次操作中进行2 100 取幂 - 几乎可以从您的角度出发。
答案 1 :(得分:2)
某些算法需要将数字提升到非常大的功率。特别是考虑加密算法,例如Diffie-Hellman key exchange。
虽然您的算法可能适用于大多数日常任务,但当您处理非常大的指数时,使用它变得不可行,因此使用平方取幂。
为什么我们需要通过平方或模幂运算等指数算法来计算数字的幂。
请注意,通过平方取幂并不能实现与模幂运算相同的功能。第一种是将实体提升到某个整数幂的有效算法,而后者是计算(a^b) modulo c
形式的表达式的方法,其中用于取幂的算法并不特别相关。