2014-10-17 58 views
1

我试图找出一个大数目的最大素数,计算最大素因子,当我运行此我碰到一个错误说:内存错误而使用python

回溯(最近通话最后一个): 文件 “prb3.py”,第45行,在 打印prime_factor() 文件 “prb3.py”,第12行,在prime_factor 在范围n(2,i)的: 的MemoryError

它正常工作时我用小号码跑13195

""" 
Problem: 

The prime factors of 13195 are 5, 7, 13 and 29. 

What is the largest prime factor of the number 600851475143 ? 
""" 
import math 
def prime_factor(): 
     i=600851475143 
     factors=[] #list stores all the factors of a number 
     for n in range(2,i): 
       if(i%n==0 and (n%2!=0 and n!=2)): 
         factors.append(n) 

     """ 
     Now I have all the factors(which are not even numbers) 

     Next step is to find prime number from factors list 
     """ 

     for factor in factors: 
       sqr_root=int(math.sqrt(factor)) 
       """ 
       I take a factor from list and divide it by numbers from 3 
       to sqroot(factor-1).If I get a 0 as remainder I consider it 
       as non prime and remove from the list.I apply this only to 
       factors whose sqr root is greater than 3.If it is less than 
       3 I divide it by each number between 3 and factor-1. 
       """ 
       if(sqr_root<=3): 
         for num in range(3,factor-1): 
           if(factor%num==0): 
             factors.remove(factor) 
             break 
       else: 
         for num in range(3,sqr_root): 
           if(factor%num==0): 
                                  1,1   Top 
     return len(factors) 


if __name__ == "__main__": 
     print prime_factor() 
+0

内存错误意味着你的程序运行内存不足。这意味着你的程序以某种方式创建了太多的对象。 – avi 2014-10-17 04:54:52

+0

这里是[简单的蛮力代码](http://ideone.com/fbv5V4)。尝试搜索[600851475143 \ [python \]](http://stackoverflow.com/search?q=600851475143+%5Bpython%5D)有很多答案。 – jfs 2014-10-17 05:26:31

回答

3

在Python2中,range()返回一个列表。在你的情况下,列表将包含600851475141 int对象。由于列表如此之大,所以不能适应你的记忆,所以你得到那个记忆错误

因为你并不真的需要所有这些数字在同一时间内存,你可以尝试使用xrange()来代替。

我认为你可以通过将你找到的因素分开来简化你的问题。例如。

for n in xrange(2, i): 
     while(i % n == 0 and (n % 2 != 0 and n != 2)): 
      i /= n 
      print n 
     if i == 1:  
      break 

不需要循环600851475141周时间应该使你的程序要快得多