计算所有素数的总和低于200万 - 代码花费的时间太长

时间:2017-10-03 14:14:42

标签: python

代码执行了对n的较小值应该做的事情,但是我想计算所有低于200万的质数的总和,以及代码似乎需要无穷无尽的时间。我正在使用PyScripter。有没有办法让这个代码更有效率?

def is_prime(a):
    return all(a % i for i in range(2, a))

def sum_of_primes(n):
    sum = 0
    x = 2
    while x < n:
        if is_prime(x):
            sum = sum + x
        x = x+1
return sum

def main():
    print(sum_of_primes(2000000))

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:3)

Sieve of Eratosthenes是查找低于某个数字的所有素数的最佳算法之一。

基本上,您可以创建一个范围为2的布尔值列表,无论您想要什么数字。然后删除每个真值索引折叠的所有索引。比如在你开始搜索列表之后你遇到2并且你更新为假所有2 * n的索引然后你跳到3然后你更新所有3 * n索引为假。然后你跳过4,因为你已经将它更新为false。然后你来到5并将所有5 * n替换为false。结束等等。在和你会得到一个长列表,所有真值的索引都是素数。您可以根据需要使用此列表。

维基百科指出的基本算法是:

 Let A be an array of Boolean values, indexed by integers 2 to n, 
 initially all set to true.    

 for i = 2, 3, 4, ..., not exceeding √n: 
 if A[i] is true:
      for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n:
        A[j] := false.     
 Output: all i such that A[i] is true.