我有一个太大的数字(1500+),我需要找到2 **该数字以1_000_000_000为模,所以我写了这个python:
n = 1
return_value = 2
while n < To_the_power_of:
return_value *= 2
return_value = return_value % 1_000_000_000
n += 1
对于较小的值,它返回正确的值,但是对于较大的值,它花费的时间太长。
如果数字是10模,那么您会得到可以使用的模式。
2 ** 1 modulo 10 = 2
2 ** 2 modulo 10 = 4
2 ** 3 modulo 10 = 8
2 ** 4 modulo 10 = 6
2 ** 5 modulo 10 = 2
2 ** 6 modulo 10 = 4
2 ** 7 modulo 10 = 8
2 ** 8 modulo 10 = 6
我希望可以使用类似的模式来回答原始问题。
答案 0 :(得分:2)
您已经知道该序列将重复。您发现mod 10的周期为4;现在,只需找到十亿美元即可:
mod_billion = set()
pow_2 = 2
billion = 10**9
while pow_2 not in mod_billion:
mod_billion.add(pow_2)
pow_2 *= 2
if pow_2 > billion:
pow_2 -= billion
print (pow_2, len(mod_billion))
三秒钟后,我们得到:
512 1562508
因此,此序列每1562508个项目重复一次。为了找到给定能力的价值,
cycle = 1562508
small_power = big_power % cycle
result = (2 ** small_power) % billion
答案 1 :(得分:0)
您的代码进行了10 ** 1500
次迭代,这确实太长了。 exponentiation by squaring是一种有用的通用技术,它将在大约4500次迭代中为您提供结果。
如果要遵循@Prune答案的路径,则应遵循费马小定理,尤其是Euler's generalization。 phi(1_000_000_000)
易于计算,因为10 ** 9 = (2 ** 9) * (5 ** 9)
是2个质数的乘积。