【问题标题】:Is this Sieve of Eratosthenes implementation correct?这个 Eratosthenes 筛实施是否正确?
【发布时间】:2014-04-15 20:16:21
【问题描述】:

我写了一段代码来使用 Eratosthenes 的筛子生成素数:

def prime_list(N):
    p = 2
    l = [x for x in range(p,N)]
    new_l = [p]
    while p**2 < N:
        l = [l[x] for x in range(1,len(l)) if not l[x]%p == 0]
        p = l[0]
        new_l.append(p)
    [l.insert(0,x) for x in new_l[len(new_l)-2::-1]]
    return l

有人可以检查此代码是否正确吗?我认为这是因为它比我之前用来生成素数的代码要快得多:

for x in range(2,N):
    for y in range(2,x):
        if x%y == 0:
            break
    else:
        print(x)

【问题讨论】:

标签: python generator primes sieve-of-eratosthenes


【解决方案1】:

这是我编写的其他代码。我现在将检查这个或另一个是否更好。

import math
def primes(N):
    number_list, limit = [x for x in range(2,N+1)], int(math.sqrt(N))
    for n in range(0, limit):
        if number_list[n] != -1:
            for y in range(number_list.index(number_list[n])+1, len(number_list)):
                if number_list[y] != -1:
                    if number_list[y]%number_list[n] == 0:
                        number_list[y] = -1
    number_list = list(set(number_list))
    number_list.remove(-1)
    number_list.sort()
    return number_list

好的,所以这段代码需要 15.90 秒来计算最多 1,000,000 个素数。 我发布的第一个只用了 4.71 秒,计算机启动到 1,000,000。 JF Sebastian 说,如果你的代码有除法,那不是 SOE,而是要查看每个数字是否是其余数字的倍数,你需要使用模运算符(基本上就像除法一样),不是吗?

【讨论】:

猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多