我正在解决我遇到的一个问题,从0到2009 mod 8的3的幂的总和是多少。
我用笔和纸得到了答案,并尝试用一些简单的python验证它
print(sum(3**k for k in range(2010)) % 8)
我很惊讶它回复的速度有多快。我的问题是解释器使用什么优化或技巧来快速得到答案?
答案 0 :(得分:4)
没有,这对计算机而言并不是很多计算。
您的代码相当于:
>>> a = sum(3**k for k in range(2010))
>>> a % 8
4
a
是一个959位的数字 - 询问计算机并不是一项大任务。
尝试在2010
的末尾加上两个零,你会发现它需要花费相当多的时间。
答案 1 :(得分:3)
工作中唯一的优化是使用与3**k
中的位数成比例的多个乘法来评估k
的每个实例(它不乘以3本身k-1
次)。
如前所述,如果将2010年提升至20100或201000或......,则需要更长时间,因为3**k
变得非常大。但是,在这些情况下,你可以通过将其重写为例如
print(sum(pow(3, k, 8) for k in range(201000)) % 8)
在内部,pow(3, k, 8)
仍会进行与k
中的位数成比例的多次乘法,但不需要保留内部大于约8 ** 2的任何整数(模数的平方)。
答案 2 :(得分:1)
没有花哨的优化对您观察到的快速响应负责。从绝对意义上讲,计算机的速度比预期的要快得多。