算式
給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下一個質數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下一個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去......。
[編輯]步驟
詳細列出算法如下:
- 列出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 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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
- 如果現在這個序列中最大數小於最後一個標出的素數的平方,那麼剩下的序列中所有的數都是素數,否則回到第二步。
- 本例中,因爲25大於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
- 我們得到的素數有:2,3
- 25仍然大於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
- 我們得到的素數有:2 3 5 。
- 因爲25等於5的平方,跳出循環.
結論:去掉紅色的數字,2到25之間的素數是:2 3 5 7 11 13 17 19 23。
下列是虛擬碼算法:
// arbitrary search limit limit ← 1.000.000 // assume all numbers are prime at first is_prime(i) ← true, i ∈ [2, limit] for n in [2, √limit]: if is_prime(n): // eliminate multiples of each prime, // starting with its square is_prime(i) ← false, i ∈ {n², n²+n, n²+2n, ..., limit} for n in [2, limit]: if is_prime(n): print n