本頁使用了標題或全文手工轉換

埃拉托斯特尼篩法

維基百科,自由的百科全書
前往: 導覽搜尋

埃拉托斯特尼篩法(希臘語:κόσκινον Ἐρατοσθένους英語:sieve of Eratosthenes ),簡稱埃氏篩,也有人稱質數篩。這是一種簡單且歷史悠久的篩法,用來找出一定範圍內所有的質數

所使用的原理是從2開始,將每個質數的各個倍數,標記成合數。一個質數的各個倍數,是一個差為此質數本身的等差數列。此為這個篩法和試除法不同的關鍵之處,後者是以質數來測試每個待測數能否被整除。

埃拉托斯特尼篩法是列出所有小質數最有效的方法之一,其名字來自於古希臘數學家埃拉托斯特尼,並且被描述在另一位古希臘數學家尼科馬庫斯所著的《算術入門》中。[1]

算式[編輯]

給出要篩數值的範圍n,找出以內的質數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下一個質數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下一個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去......。

步驟[編輯]

埃拉托斯特尼篩法

詳細列出算法如下:

  1. 列出2以後的所有序列:
    • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  2. 標出序列中的第一個質數,也就是2,序列變成:
    • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  3. 將剩下序列中,劃摽2的倍數(用紅色標出),序列變成:
    • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  4. 如果現在這個序列中最大數小於最後一個標出的質數的平方,那麼剩下的序列中所有的數都是質數,否則回到第二步。

  1. 本例中,因為25大於2的平方,我們返回第二步:
  2. 剩下的序列中第一個質數是3,將主序列中3的倍數劃出(紅色),主序列變成:
    • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  1. 我們得到的質數有:2,3
  2. 25仍然大於3的平方,所以我們還要返回第二步:
  3. 現在序列中第一個質數是5,同樣將序列中5的倍數劃出,主序列成了:
    • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  4. 我們得到的質數有:2, 3, 5 。
  5. 因為25等於5的平方,結束循環

結論:去掉紅色的數字,2到25之間的質數是:2, 3, 5, 7, 11, 13, 17, 19, 23。

演算法[編輯]

埃拉托斯特尼篩法,可以用以下的虛擬碼來表示:

Input: an integer n > 1
 
Let A be an array of Boolean values, indexed by integers 2 to n,
initially all set to true.
 
 for i = 2, 3, 4, ..., not exceeding n:
  if A[i] is true:
    for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n :
      A[j] := false
 
Output: all i such that A[i] is true.

以上演算法可以得到小於等於n的所有質數,它的複雜度是O(n log log n)

程式代碼[編輯]

Python 3.6[編輯]

 1 def eratosthenes(n):
 2     a = list()
 3     temp = [True] * (n+1)
 4     for i in range(2, n+1):
 5         if (temp[i]):
 6             j = i * i
 7             while (j <= n):
 8                 temp[j] = False
 9                 j = j + i
10                 
11     for i in range(2, n+1):
12         if (temp[i]):
13             a.append(i)
14     return a
15 
16 if __name__ == "__main__":
17     print (eratosthenes(120))

C++[編輯]

 1 bool flag[MAXN] = {1};    //将标识初始化为true
 2 void erat(int maxn)
 3 {
 4 	flag[0]=0;            //0不是素数
 5 	flag[1]=0;            //1不是素数
 6 	for(int i=2;i<=maxn;++i)
 7 	{
 8          /*当i为素数时,i的所有倍数都不是素数*/
 9 		if(flag[i])
10 		{
11 			for(int j=2*i;j<=maxn;j+=i)
12 			{
13 				flag[j]=0;
14 			}
15 		}
16 	}
17 }

參見[編輯]

參考文獻[編輯]

  1. ^ Nicomachus, Introduction to Arithmetic, I, 13. [1]
  • Κοσκινον Ερατοσθενους or, The Sieve of Eratosthenes. Being an Account of His Method of Finding All the Prime Numbers, by the Rev. Samuel Horsley, F. R. S., Philosophical Transactions (1683-1775), Vol. 62. (1772), pp. 327-347.

拓展閱讀[編輯]