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

Prime factorisation program in python gives no output

我正在研究Euler问题3的项目,

The prime factors of 13195 are 5, 7, 13 and 29.What is the largest prime factor of the number 600851475143 ?

我提出的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

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


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

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

  • 利用生成质数的埃拉托森筛生成函数
  • 循环遍历素数,直到sqrt(n)收集因子,同时收缩n,找到每个因子。
    • 如果没有其他因素


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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


下面是我尝试使用python 2.7运行代码时发生的情况:

1
2
$ python primes.py
Killed: 9

问题是,range(2, 600851475143)试图创建一个包含600851475141个元素的列表。这太大了,无法放入计算机的内存中,所以python程序会被杀死。

您可以尝试用xrange()替换range(),但您的程序完成时间太长。你需要一个更好的算法。

另外,代码中还有一个bug,这意味着它不适用于主输入。