Python 循环和大数的素数和
我正在运行以下代码来查找前10000000个素数的和。 我如何优化它,使它不会永远得到结果(素数之和)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
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哦,我明白了。好吧,我的错。