素数总和 - 用于循环和大数字

时间:2018-03-01 00:28:06

标签: python for-loop optimization primes

我正在运行以下代码来查找前10,000,000个素数的总和。 我如何优化它,以便不需要永远获得结果(素数之和)?

sum=0
num=2
iterator=0

while iterator<10000000:
    prime = True

    for i in range(2,num):
        if (num%i==0):
            prime = False

    if prime:
        sum=sum+num
         # print (num, sum, iterator)
        iterator=iterator+1
    num=num+1

print(sum)

3 个答案:

答案 0 :(得分:3)

10,000,000的素数约为n * ln(n) + n * ln( ln(n) )~188980383 ...然后你可以用筛子找到该值下的所有素数(丢弃任何额外的......)(即你将获得约50k使用1000万时的额外素数,注意这对我来说花了大约8秒))

另见:Finding first n primes?

另见:Fastest way to list all primes below N

答案 1 :(得分:1)

您可以使用Sieve of Eratosthenes。这是查找第一个 n 素数的更快的方法。

答案 2 :(得分:0)

事实证明,使用正确的切片在Python中实现Sieve of Eratosthenes相当简单。因此,您可以使用它来恢复 n 第一个素数并将它们相加。

在Joran Beasley的回答中指出, n -th prime的上限是$files = glob("../database/CWBRadar/CWB05Radar[[]Wufenshan[]]/*.jpg"); var_dump($files); ,我们可以使用它然后去掉额外的素数。请注意,此绑定不适用于小于6的 n

n * ln(n) + n * ln( ln(n) )

需要几秒钟,但输出的10,000,000个首要素数之和为from math import log def sum_n_primes(n): # Calculate the upper bound upper = int(n * ( log(n) + log(log(n)))) # Prepare our Sieve, for readability we make index match the number by adding 0 and 1 primes = [False] * 2 + [True] * (upper - 1) # Remove non-primes for x in range(2, int(upper**(1/2) + 1)): if primes[x]: primes[2*x::x] = [False] * (upper // x - 1) # Replace // by / in Python2 # Sum the n first primes return sum([x for x, is_prime in enumerate(primes) if is_prime][:n])

如果您需要 n 更高,一个解决方案将是improve your upper bound