如何找到2乘以10 ^ 9为模的疯狂大数的幂

时间:2018-10-16 22:09:53

标签: python algorithm math

我有一个太大的数字(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 

我希望可以使用类似的模式来回答原始问题。

2 个答案:

答案 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 generalizationphi(1_000_000_000)易于计算,因为10 ** 9 = (2 ** 9) * (5 ** 9)是2个质数的乘积。