Python案例:使用埃氏篩法計算素數
阿新 • • 發佈:2019-01-09
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迭代器要正確理解和運用,對於無線序列的生成非常易用。