Python程序无法处理大的数字

Python程序无法处理大的数字,python,Python,因此,我编写了一个程序(见下文)来运行一系列测试用例,并针对每一个用例确定一个≡X^2(modM)使用。它对于小的测试用例很有效,例如当a=0和m=2或a=4和m=7时,但是当我考虑较大的测试用例时,例如当a=83715323和m=118299443时,程序只挂在行15上(如下所示)。为什么这个程序挂起了?这是python的极限吗?我应该重新做C++之类的东西吗?< /P> 问题线 if((A[case]**((M[case] - 1)/2) - 1) % M[case]) == 0: 整个节

因此,我编写了一个程序(见下文)来运行一系列测试用例,并针对每一个用例确定一个≡X^2(modM)使用。它对于小的测试用例很有效,例如当a=0和m=2或a=4和m=7时,但是当我考虑较大的测试用例时,例如当a=83715323和m=118299443时,程序只挂在行15上(如下所示)。为什么这个程序挂起了?这是python的极限吗?我应该重新做C++之类的东西吗?< /P> 问题线

if((A[case]**((M[case] - 1)/2) - 1) % M[case]) == 0:
整个节目

number_of_cases = int(raw_input())

A = []
M = []

for case in range(number_of_cases):
    A_M = raw_input().split()
    A.append(int(A_M[0]))
    M.append(int(A_M[1]))

for case in range(number_of_cases):

    solution_exists = 0

    if((A[case]**((M[case] - 1)/2) - 1) % M[case]) == 0:
        print ("YES")
        break        

    else:
        print("NO")
你在表演

因此,您不需要在一条语句中计算
A[case]**((M[case]-1)/2)
。这很可能是导致你上吊的原因

利用以下事实:

x**(n) % m == {(x**(n-1) % m) * x} % m
i、 e.您可以计算
x^n
的余数,对于任意大n,无需直接计算
x^n
,方法是直接相乘,然后重复获得余数

尝试分解指数运算(请参阅wiki文章的“”部分),看看它是否仍然很慢


我敢打赌它不是。

A[case]**((M[case]-1)/2)-1)
计算的整数可以很快变大。使用任何语言计算这个数字都需要大量的时间和内存

相反,利用Python的
pow
操作符及其第三个参数,这允许高效的模幂运算

试着改变

if((A[case]**((M[case] - 1)/2) - 1) % M[case]) == 0:


这里没有计算大量的
A[case]**((M[case]-1)/2)-1)
:Python会逐渐增加功率,并在每一步跟踪剩余模
M[case]

我比你快了9秒,但你对Python的了解胜过了我的速度+1但是您也发现了问题,并提供了有用的wiki链接:-)Python可以很好地处理大量数据。问题是:你的电脑可以吗?您需要足够的内存来包含为
(A[case]**((M[case]-1)/2)-1)
表达式构造的大整数。83715323到59149720的幂需要468631695个十进制数字(大约5亿),因此Python要求操作系统提供几乎所有的内存。导致程序挂起的原因是交换。嗯,我有16GB的内存,我正在运行Fedora,但这太大了!我希望我也能接受这个答案,但最简单的解决办法是ajcr提出的。然而,这个解决方案实际上帮助我理解了我在做什么,而且效率更高。@sparky2012-谢谢你的想法。我希望模块化求幂的python实现基本上符合我所描述的——如果不符合,那就有点疯狂了。也许两者都试一下,然后比较一下是的,现在就去做。刚刚发现这个:“(关于模幂运算)。看起来他们基本上做了相同的事情。
if pow(A[case], (M[case] - 1)/2 - 1, M[case]) == 0: