1. 程式人生 > >Python案例:使用埃氏篩法計算素數

Python案例:使用埃氏篩法計算素數

Python中使用埃氏篩法計算素數(質數)

背景

學習了Python中的filter()函式,對序列中的元素進行篩選。應用於計算素數上。

演算法

埃氏篩法的演算法很簡單:
1. 從2開始造一個自然數序列:2,3,4,5,6,7……
2. 取第一個數2,2一定是一個素數,然後用2把序列中2的倍數篩掉;
3. 取新序列中的第一個數3,用3把序列中3的倍數篩掉;
4. 取新序列第一個數5,把5的倍數全部篩掉;
5. 不斷篩下去,就可以得到所有的素數;

Python功能

Python中的filter()函式,能非常好的滿足埃氏篩法中篩選的方法,根據序列中元素在篩選函式的返回值是True 還是False來決定該元素的去和留。
Python中的Iterator(迭代器)對序列序列的生成非常友好,尤其是無限序列的生成。因為Iterator是惰性計算的序列,可以用來表示全體自然數、全體素數這樣的序列,而程式碼非常簡潔。

Python實現

# -*- utf-8 -*-

#埃氏篩法計算素數

def _odd_iter():#生成一個奇數序列
    n = 1
    while True:
        n = n + 2
        yield n

def _not_divisible(n):#篩選函式,保留不能整除的,篩掉可以整除的,即倍數。
    return lambda x : x % n > 0

def primes():#求素數函式。
    yield 2
    it = _odd_iter() #初始序列
    while True:
        n = next(it)
        yield
n it = filter(_not_divisible(n), it)#it在不斷的next呼叫中,進行篩選。 #輸出1000以內的所有素數: for n in primes(): if n < 1000: print(n) else: break

總結

Python中的filter()函式非常好用,使用filter()的關鍵,還是如何正確定義一個篩選函式。Python中的Iterator迭代器要正確理解和運用,對於無線序列的生成非常易用。