Python 循环和大数的素数和

Python 循环和大数的素数和,python,for-loop,optimization,primes,Python,For Loop,Optimization,Primes,我正在运行以下代码来查找前10000000个素数的和。 我如何优化它,使它不会永远得到结果(素数之和) sum=0 num=2 迭代器=0 而迭代器则可以使用。查找前n个素数的方法要快得多。您可以使用。找到前n个素数的方法要快得多。第10000000个素数大约是n*ln(n)+n*ln(ln(n))或~188980383。。。然后你可以使用一个筛子来找到该值下的所有素数(丢弃任何额外的…(即当使用1000万时,你将得到大约50k个额外的素数,注意这对我来说大约需要8秒)) 另见: 另请参见:第1

我正在运行以下代码来查找前10000000个素数的和。 我如何优化它,使它不会永远得到结果(素数之和)

sum=0
num=2
迭代器=0

而迭代器则可以使用。查找前n个素数的方法要快得多。

您可以使用。找到前n个素数的方法要快得多。

第10000000个素数大约是
n*ln(n)+n*ln(ln(n))
~188980383
。。。然后你可以使用一个筛子来找到该值下的所有素数(丢弃任何额外的…(即当使用1000万时,你将得到大约50k个额外的素数,注意这对我来说大约需要8秒))

另见:


另请参见:

第10000000个素数约为
n*ln(n)+n*ln(ln(n))
~188980383
。。。然后你可以使用一个筛子来找到该值下的所有素数(丢弃任何额外的…(即当使用1000万时,你将得到大约50k个额外的素数,注意这对我来说大约需要8秒))

另见:

另请参见:

事实证明,通过使用正确的切片,在Python中实现该功能相当简单。所以你可以用它来恢复n个第一个素数并求和

Joran Beasley的回答中指出,第n个素数的上界是
n*ln(n)+n*ln(ln(n))
,我们可以使用它,然后讨论额外的素数。注意,这个界限不适用于小于6的n

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])
它需要几秒钟,但输出10000000个第一个素数的总和是
870530414842019

如果您需要n更高,一个解决方案是。

事实证明,通过使用正确的切片,在Python中实现n非常简单。所以你可以用它来恢复n个第一个素数并求和

Joran Beasley的回答中指出,第n个素数的上界是
n*ln(n)+n*ln(ln(n))
,我们可以使用它,然后讨论额外的素数。注意,这个界限不适用于小于6的n

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])
它需要几秒钟,但输出10000000个第一个素数的总和是
870530414842019


如果您需要n更高,一种解决方案是。

使用质数筛可能不好的做法是命名一个重写内置函数的变量(例如,
sum
)。此外,
iterator
在Python中有一个非常特殊的含义,所以我也避免将其作为变量名。可能重复的是,不需要更改任何内容,它不会永远运行。使用素筛可能是命名重写内置函数的变量(例如,
sum
)的错误做法。此外,
iterator
在Python中有一个非常特殊的含义,所以我也避免将其作为变量名。可能的重复不需要更改任何内容,它不会永远运行。这不是要在N下查找所有素数。。。这与第n个素数有很大的不同(但你在本质上是对的)@JoranBeasley是的,这就是问题所要问的,也是我在回答中所指定的。这会找到前n个素数,你可以用它来计算和。。。它要求的是前1000万个素数的总和。。。不是1000万以下的所有素数之和(大约有650k个素数不到1000万)@JoranBeasley哦,我明白了。好吧,我的错。这不是找到N下的所有素数吗。。。这与第n个素数有很大的不同(但你在本质上是对的)@JoranBeasley是的,这就是问题所要问的,也是我在回答中所指定的。这会找到前n个素数,你可以用它来计算和。。。它要求的是前1000万个素数的总和。。。不是1000万以下的所有素数之和(大约有650k个素数不到1000万)@JoranBeasley哦,我明白了。好吧,我的错。