【问题标题】:Memory error while calculating largest prime factor using python使用python计算最大素数时出现内存错误
【发布时间】:2014-12-12 15:06:14
【问题描述】:

我试图找出一个大数的最大素数,当我运行这个时,我遇到了一个错误:

Traceback(最近一次调用最后一次): 文件“prb3.py”,第 45 行,在 打印素数因子() 文件“prb3.py”,第 12 行,在 prime_factor 对于范围内的 n (2,i): 内存错误

当我使用像 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()

【问题讨论】:

标签: python


【解决方案1】:

在 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 次应该会让你的程序更快

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多