我是一个蟒蛇新手 如何在python中处理大数?
如果我需要计算n*(2**(n-1))%m
的值
其中,
n=1000000000000000009 m=1000000007
当我处理小到n的值时 N = 1000009 它工作但python shell停止响应更高的值
答案 0 :(得分:3)
您应该使用modular exponentiation方法。 Python内置pow
为您做到了这一点:
pow(x,y [,z]) - >编号
有两个参数,相当于
x**y
。有三个论点, 等同于(x**y) % z
,但可能更有效(例如,对于多头)。
这是一个非内置实现(从here复制):
def f(x,e,m):
X = x
E = e
Y = 1
while E > 0:
if E % 2 == 0:
X = (X * X) % m
E = E/2
else:
Y = (X * Y) % m
E = E - 1
return Y
最后,你需要的是
>>> n=1000000000000000009
>>> m=1000000007
>>> n*pow(2,n-1, m) % m
783433706L
答案 1 :(得分:1)
n*(2**(n-1))
将巨大,因此以天真的方式计算这将失败。相反,您应该尝试将其拆分为合理大小的工作块,并在每个这样的块之后计算模运算。这里常见的技术是二值化:您计算2%m
,4%m=((2%m)*(2%m))%m
,16%m=((4%m)*(4%m))%m
,256%m=((16%m)*(16%m))%m
等等,然后将(n-1)
具有的值相乘位设置。
答案 2 :(得分:0)
我认为延迟可能只是Python花时间计算你正在处理的大量数字。