如何处理python中的大数字

时间:2017-05-23 18:07:37

标签: python

我的问题是要找到最大的素数因子600851475143。

代码:

class Prime:
    def isPrime(self,n): # Checks if number is prime
        number=n        
        flag=0
        #code to exclude 1 nd 2 from check
        if number==1:
            return False
        elif number==2:
            return True
         #code to loop through and check if number is divisible    
        for i in range(2,(number/2)+1):
            if (number)%i==0:
                flag=1
                break
            else:
                flag-0
                continue 
        #code to return result   

        if flag==0:
            return True
        elif flag==1:
            return False

但是这段代码抛出了一个溢出错误 - “OverflowError:range()结果有太多的项目”。我能做些什么来处理一个大数字?

我按照“Python long integer input”的建议尝试使用n = int(raw_input()),  但没有运气!

def main():
    p=Prime()
    n = int(raw_input())
    print p.isPrime(n)

1 个答案:

答案 0 :(得分:0)

问题是数字的数量,而不是尺寸。您为600851475143/2元素构建了一个range对象。单个单词整数就会消耗超过1TB的内存。由于您使用的是大整数,因此会占用更多内存。你有多少地址空间

减少所需元素的大小。首先,您只需要通过数字的平方根来检查以完成素数因子分解。其次,您不必构建生成器:只需增加变量,完全消除结构。最后,您只需要按素数除以,而不是所有数字。

第一步:

for i in range(2, int(math.sqrt(number))+1):
    while number % i == 0:
        number = number // i
        largest = i

当您完成后,最大的素数因素是numberlargest中的较大者。

第二步:

将该大range表达式转换为简单的变量增量:

i = 2
upper = int(math.sqrt(number) + 1)
while i < upper:
    while number % i == 0:
        number = number // i
        largest = i
    i +=1

你可以通过只做2而不是奇数来加速2倍。

算法改进:

建立一个筛子或其他方法来跟踪素数。通过那些而不是通过所有整数来迭代。