素數篩實現素數的快速篩選

# usr/bin/env python
# _*_ coding:utf-8 _*_

'''
素數篩(Sieve of primes):給定一個較大值n,尋找1~n中的所有素數,並把它打印出來。

判斷一個數m是否是素數,需要花費O(√n)時間。
當然是遍歷並判斷的話,需要花費O(n√n)時間,
生產者實現也很簡單:
1. 首先生成一個bool列表表示該index的數是否是素數;
2. 顯然0,1不是素數;
3. 接下來判斷2<=i<=n的數,
   如果爲素數(True),則yield拋出,並把i的2倍,3倍,…,(n-1)/i+1倍都設爲不是素數(False)。
這就是素數篩的原理,花費時間爲O(n).
'''

def prime_sieve(n):
    flags = [True] * n
    flags[0] = flags[1] = False

    for i in xrange(2, n):
        if flags[i]:
            yield i

            for j in xrange(2, (n - 1) / i + 1):
                flags[i * j] = False

if __name__ == '__main__':
    n = input()
    sieves = prime_sieve(n)
    for sieve in sieves:
        print sieve

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章