我正在解决一个大数字序列,但python shell停止响应

时间:2014-03-05 07:10:33

标签: python-2.7 math

我是一个蟒蛇新手 如何在python中处理大数?

如果我需要计算n*(2**(n-1))%m的值 其中,

n=1000000000000000009 m=1000000007

当我处理小到n的值时     N = 1000009 它工作但python shell停止响应更高的值

3 个答案:

答案 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%m4%m=((2%m)*(2%m))%m16%m=((4%m)*(4%m))%m256%m=((16%m)*(16%m))%m等等,然后将(n-1)具有的值相乘位设置。

答案 2 :(得分:0)

我认为延迟可能只是Python花时间计算你正在处理的大量数字。