Eratosthenes筛选使用布尔列表

时间:2014-03-25 23:06:41

标签: python boolean sieve-of-eratosthenes

好的,我正在试图筛选Eratosthenes。我最初使用此代码。

def shake(n):
    n == 2                  # initializes 2 since it's first prime
    prime = []              # makes empty list
    for i in range(2, n+1): # takes range from 2 to N
        if i not in prime:  
            print (i)
            for i in range(i*i, n+1, i):
                prime.append(i)

shake(100)

它打印出一个列表,但我被告知我做错了。我被告知我需要传入一个布尔列表,并返回一个素数列表。逻辑是我从长度为N的输入中列出一个布尔值列表。我想出了如何使用这个列表布尔值

def shake(alist)
    N = 10
    alist = [True for _ in range(N + 1)]

如果我使用打印件就会给我这个。

[True True True True True True True True True True True]

我需要能够将前两个值true转换为false,然后将第三个'true'的值保留为true,但将所有两个的倍数变为false,然后对3,5,5执行相同的逻辑, 7等等,直到我用完了清单。然后我需要能够以某种方式扫描它以获得剩余的真值,并打印出这些数字的列表作为我的素数。我真的输了,因为我不知道如何将我的'True'列表的值更改为false,以及如何在循环中执行此操作以及我如何知道何时停止。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

哇男人,优质筛子!这就是我学习如何在python中编程的方法!这是一个简单的:

def primes(n):
"""Finds all the primes less than n."""
    #First build your list of Trues
    ps = [1] * n
    #next, set the first two entries to False
    ps[0]=0; ps[1]=1
    #i is the index, p_i is the primality value.
    #the int(n**0.5) part makes us only look at the numbers less than the square
    #root of n.
    for i, p_i in enumerate(ps[:int(n**0.5)]):
        #if p_i is True then i is prime
        if p_i:
            #mark off every ith number from i^2 as nonprime
            for j in xrange(i*i, n, i):
                ps[j]=0
    #return every index that has the value True
    return [i for (i, p_i) in enumerate(ps) if p_i]

Sieve of Eratosthenes

您有一个全部标记为素数的数字列表。你取第一个数字n,从它的正方形开始,你将每第n个数字标记为非素数(a.k.a复合数。)当n大于列表中最大数字的平方根时,你就停止了。每个仍然标记为素数的数字都是素数!

在构建列表和筛子时可以跳过偶数,但这有点复杂。

答案 1 :(得分:0)

我编写了一个函数,用于Project Euler问题,这可能比Broseph的解决方案更清晰一些,并且随着时间的推移积累素数(如果你使用python3更改xrange - >范围)。

primes(maxp):
    """
    Returns a list of all primes < maxp.
    """
    sieve = [True for x in xrange(maxp)]
    prime_lst = [1]
    for i in xrange(2, int(sqrt(maxp))):
        if sieve[i]:
            prime_lst.append(i)
            for j in xrange(2*i, maxp, i):
                sieve[j] = False
    return prime_lst