在python中查找前1000个素数的和

在python中查找前1000个素数的和,python,algorithm,data-structures,primes,Python,Algorithm,Data Structures,Primes,我已经写了一个程序,计算素数加起来的上限为1000。计划如下: limit = 1000 def is_prime(n): for i in range(2, n): if n%i == 0: return False return True sum = 0 for i in range(2, int(limit+1)): if is_prime(i): sum = sum + i count +

我已经写了一个程序,计算素数加起来的上限为1000。计划如下:

limit = 1000

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

sum = 0
for i in range(2, int(limit+1)):
    if is_prime(i):
        sum = sum + i
        count += 1
print sum
我可以做什么更改来查找1000个素数而不是最多1000个数字?另外,我正在寻找空间复杂度为O(1)和时间复杂度为O(n)(我知道其他方法也可以做到:-),比如“埃拉托斯提尼筛”和在迭代到sqrt(n)时寻找素数)


如果我在某些地方出错,请纠正我。谢谢。

完成您请求的最简单方法可能是使用
itertools

def gen_primes():
    for i in itertools.count(2):
        if is_prime(i):
            yield i 

first_one_thousand = list(itertools.islice(gen_primes(), 1000))
哎呀,每个人都喜欢一句台词:

first_one_thousand = list(itertools.islice((i for i in itertools.count(2) 
                                            if is_prime(i)), 
                                           1000))
代码:

def f():
    i = 2
    while True:
        if all(i % x != 0 for x in range(2, i-1)):
            yield i
        i += 1

primes = f()
print sum(primes.next() for _ in range(1000))
或一行:

import itertools
print sum(itertools.islice(itertools.ifilter(lambda x: all(x % i != 0 for i in range(2, x)), f()), 0, 1000))

只需根据您的代码进行一点小小的改进,即可找到
limit
素数,而不是
limit
数字

limit = 1000

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

sum = 0
num = 2
for i in xrange(limit):
    while not is_prime(num):
        num += 1
    sum += num
    num += 1 # sorry, miss this
print sum
你也可以在寻找你感兴趣的东西时使用一个循环,这可能只是一个品味的问题

limit = 1000

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

sum = 0
count = 0
num = 2
while count != limit:
    if is_prime(num):
        sum += num
        count += 1
    num += 1

print sum

我希望提出以下算法(Eratosthenes筛法)

n=1000
极限筛=10000
素数=集合()
notPrimes=set()
i=2

虽然len(素数)不知道如何得到O(n)时间,特别是当被限制在O(1)空间时。@Anonymous,这个问题与此有很多关系,但它为OP提供了很多信息,但有一些不同……埃拉托斯提尼的筛子在常数空间中找到素数,什么,比如n log n time,但它基本上被限制在一个最大值上。@jwilner:Eratosthenes的筛既不是恒定的空间也不是n对数n时间。我不知道你所说的“基本上链接到一个最大值”是什么意思,但是你可以逐步扩展列表,它只是没有那么有效。然而,你可以简单地估计第1000个素数,并筛选出一个稍大的区间。@DouglasZare:我认为,通过“基本上与最大值相关”,jwilner指的是我们可以在开始时决定我们想要支持的数字范围(比如,高达10毫升)。但我同意“恒定空间”和“n log n time”是一个常见的误解,我也经常这样做。我(我相信jwilner)觉得这是一个常量空间,因为一旦我们选择了某个上限(比如答案应该是b 3682913)。我用上面的代码得到了2000。有什么输入吗?谢谢,当它是素数时,忘了将
num
增加1:(还有一件事,
sum
是python的一个内置函数,使用它作为变量名会覆盖它。请注意。没问题,筛子的极限与n有关,通过素数的累积分布,如果n发生变化,那么筛子的极限将是巨大的,因为n的值如此之大,它将使这个算法效率很低
n=1000
limit_sieve = 10000
primes = set()
notPrimes = set()
i = 2
while len(primes)<n:
  if not i in notPrimes:
    primes.add(i);
    for notPrime in range(i*2, limit_sieve, i):
      notPrimes.add(notPrime)
  i+=1

sum(primes)