筛选的eratostheness算法

时间:2017-10-15 11:54:19

标签: python algorithm sieve

我有这个函数用于计算带有eratosthenes筛子的素数。我有一个错误,我不明白为什么。

def era1(n):

    llista1 = []
    llista2 = []
    i = 2

    while(i<(n+1)):
        llista1.append(i)
        i = i + 1

    while (llista1[0]<(n**0.5)):
        llista2.append(llista1[0])    
        for j in range ((len(llista1))-1):
            if (llista1[j] % llista1[0] == 0) :  #<------- error list index out of range
                llista1.remove(llista1[j])
        llista1.remove(llista1[0])
    print llista2

2 个答案:

答案 0 :(得分:2)

这是在迭代它们时删除列表中的项目的结果。您已指定for循环运行n次,但是当您到达第n个项目时,曾经存在的项目已经移回了几个索引,因为您要从中删除项目清单。

您需要重新考虑重新实现Sieve的方法。我不能百分之百地遵循你的方法,但我确信它可能涉及到一个辅助列表。白名单,不要黑名单:)。

此外,enumerate()是一个很酷的功能。

答案 1 :(得分:0)

对于仍在寻找这种算法方法的任何人可能有用

def SieveOfEratosthenes(n): 
    # Create a boolean array "prime[0..n]" and initialize 
    # all entries it as true. A value in prime[i] will 
    # finally be false if i is Not a prime, else true. 
    prime = [True for i in range(n + 1)] 
    p = 2
    while (p * p <= n): 
            
        # If prime[p] is not changed, then it is a prime 
        if (prime[p] == True): 
                
            # Update all multiples of p 
            for i in range(p * 2, n + 1, p): 
                prime[i] = False
        p += 1
    prime[0]= False
    prime[1]= False
    # Print all prime numbers 
    for p in range(n + 1): 
        if prime[p]: 
            print (p) 
    
# driver program 
if __name__=='__main__': 
    n = 30
    print ("Following are the prime numbers smaller") 
    print ("than or equal to", n )
    SieveOfEratosthenes(n)