在Python中找到给定数的最大素数

时间:2018-06-24 21:42:35

标签: python primes prime-factoring

这是欧拉计画的问题。 600851475143的最大素数是多少? 我写了以下代码:

def prime_factors(x):
    my_list = []
    for no3 in range(2, int(x)):
        i = 0
        if x % no3 == 0:
            for a in range(1, int(no3)):
                if no3 % a == 0:
                    i = i + 1
            if i == 1:
                my_list.append(no3)
    print(max(my_list))

prime_factors(600851475143)

它对于少量数字工作正常,但对于诸如“ 600851475143”这样的大量数字,代码不会给出输出,它只会继续运行。 我想知道这段代码有什么问题以及如何解决。

1 个答案:

答案 0 :(得分:1)

您的每个循环都是2到n,因此对于2个循环,您的循环必须运行平方(n)次,然后才能给出答案

如果稍微更改循环,则可以使其更快。要查找数字n的因数,您不必检查所有小于n的数字。如果最多检查int(sqrt(n))就足够了。对于介于2和int(sqrt(n))之间的每个因子x,n / x也是一个因子。

因此,通过将循环更改为仅运行到int(sqrt(n)),您的代码将运行得更快

from math import sqrt 

def is_prime(n): 
    for a in range(2, int(sqrt(n))): 
        if n % a == 0: 
            return False 
    return True 

def prime_factors(x): 
    my_list = [] 
    for no3 in range(2, int(sqrt(x))): 
        if x % no3 == 0: 
            # no3 and x/no3 are factors of x 
            if is_prime(no3): 
                my_list.append(no3) 
            if is_prime(x/no3): 
                my_list.append(no3) 
    print(max(my_list)) 

现在我们尝试一下

>>> prime_factors(600851475143)
6857
>>>