python中的Prime分解程序没有输出

时间:2017-02-04 14:50:24

标签: python prime-factoring

我正在研究关于欧拉问题3的项目,

  

13195的主要因素是5,7,13和29.这个数字最大的主要因素是600851475143?

我想出的代码如下:

def q_prime(a):
    if a == 2:
            return True
    elif a < 2:
            return False

    for i in range(2,a):


            if a%i == 0:
                    return False
    else:
            return True


def prime_factor(x):
    prime_factors =[]
    for i in range(1,x):
            if q_prime(i) == True and x%i == 0:
                    prime_factors.append(i)
    return prime_factors

调用13195的这个功能给了我[5,7,13,29]的预期。我尝试了一些其他组合,如1035,给出了[3,5,23]。但是,当我在600851475143上调用此函数时,我没有输出。而且,我也没有收到错误消息。它运行一段时间,并简单重启shell

我知道这不是一个优雅的代码,而且我猜测粗暴强行通过这样的问题,因为大量的代码导致了这个问题?到底发生了什么?

3 个答案:

答案 0 :(得分:2)

编号600851475143太大了。您可以简化计算,如果在q_primeprime_factor中,您将检查的数字不在范围[2,sqrt(n)+1]的范围[2,n] bun中。这也将返回正确的结果,但花费的时间更少:

import math

def q_prime(a):
    if a == 2:
            return True
    elif a < 2:
            return False

    for i in range(2, int(math.sqrt(a) + 1)):
            if a%i == 0:
                return False
    else:
        return True


def prime_factor(x):
    prime_factors =[]
    for i in range(1, int(math.sqrt(x) + 1)):
            if q_prime(i) == True and x%i == 0:
                    prime_factors.append(i)
    return prime_factors

答案 1 :(得分:2)

考虑到问题的大小,您编写的这两个函数都存在问题。 q_prime(a)循环到aprime_factor(x)循环到x每次迭代调用q_prime。这使得您的算法O(N^2)对于像600851475143这样的数字来说太过分了。

更好的方法(O(√N) - >基本上是直接的结果):

  • 生成器函数使用sieve of Eratosthenes产生素数
  • 循环到素数,直到sqrt(n)收集因子,同时在找到每个因子的情况下收缩n
    • 如果没有找到其他因素,则添加n本身

答案 2 :(得分:1)

当我尝试使用Python 2.7运行代码时会发生什么:

$ python primes.py
Killed: 9

问题是range(2, 600851475143)尝试创建600851475141元素的列表。这太大了,无法放入计算机的内存中,因此Python程序会被杀死。

您可以尝试将range()替换为xrange(),但您的计划将需要很长时间才能完成。你需要一个更好的算法。

P.S。您的代码中还存在一个错误,这意味着它不适用于主要输入。