这个Eratosthenes的筛子是否正确?

时间:2014-03-11 23:30:48

标签: python generator primes sieve-of-eratosthenes

我用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)

1 个答案:

答案 0 :(得分:-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,但为了查看每个数字是否是剩余数字的倍数,你需要使用模数运算符(基本上就像除法),不是吗?