埃拉托斯特尼筛

找到所有小问题的最有效方法素数(假设所有小于10000000的)是通过使用筛子,如这个筛分埃拉托斯坦(约公元前240年):

列出所有小于或的整数等于n个(且大于1)。删除所有素数的倍数小于或等于广场属于n个,那么剩下的数字就是素数。

例如,要查找所有小于或等于的素数30,首先列出2到30之间的数字。

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

第一个数字2是质数,所以保留它(我们将着色它是绿色的),并划掉它的倍数(我们将把它们涂成红色),所以红色的数字不是质数。

2456789101112131415161718192021222324252627282930

剩下的第一个数字(仍然是黑色的)是3,所以是第一个奇数素数。保留并划掉所有它的倍数。我们知道,所有小于9(即6)的倍数都会已经划掉了,所以我们可以从3点开始划掉2=9.

2 45678 9 1011121314 15 1617181920 21 2223242526 27 282930

现在剩下的第一个数字(仍然是黑色的)是5,第二个是奇数素数。所以也保留它并划掉它的所有倍数(所有倍数小于52=25已被划掉,并且事实上,25是唯一尚未划掉的倍数)。

2 4 5 678 9 1011121314 15 1617181920 21 222324 25 26 27 282930

下一个左边的数字7大于30,所以没有7的倍数可以去掉被划掉(14和28乘以2,21乘以3),因此筛子已完成。因此,剩下的所有数字都是质数:{2, 3, 5, 7, 11, 13, 17, 19, 23, 29}. 注意我们只是没有除法就找到了这些素数。

2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

该算法可以用伪代码编写如下

埃拉托斯坦(n个) {[1] := 0                          对于:=2至n个[] := 1第页:= 2虽然第页2n个做{j个:=第页2同时(j个n个)做{[j个] := 0j个:=j个+第页}重复第页:=第页+1至[第页] = 1   }返回()}

此方法速度如此之快,因此没有理由存储计算机上的素数大列表--一种有效的实现可以比计算机从磁盘上读取更快地找到它们。事实上,上述算法的问题是不是真正的速度(它使用O(运行)(n个(日志 n个)日志n个) 位操作),而不是空格(它是O(n个)). 所以对于大型n个我们通常使用分段筛。然而,理论上的时间和空间都可以改进;例如,Pritchard的“线性分段轮筛”使用O(n个日志n个)钻头操作和O(sqrt(n个)/日志n个)空间。

另请参阅: 审判庭

参考文献:

BH77型
C.贝叶斯R.哈德森,“算术级数中Eratostenes和素数的分段筛,”Nordisk Tidskr公司。信息行为处理(BIT),17:2 (1977) 121--127. MR报告56:5405
布雷索德89
D.M.Bressoud博士,因子分解和素性测试,Springer-Verlag,1989年。纽约州纽约市,ISBN 0387970401。MR 91e:11150[第19页上的伪代码实现]【QA161.F3B73】
普里查德87
P.普里查德,“线性素数筛:家谱”科学。计算。编程,9:1 (1987) 17--35. MR 88j:11087[各种筛子的比较][对埃拉托斯特尼等最新筛子的比较。]
里塞尔94
H.里塞尔,素数和因子分解的计算机方法《数学进展》第126卷,Birkhä用户波士顿,马萨诸塞州波士顿,1994年。ISBN 0-8176-3743-5。MR 95h:11142[第6页上的PASCAL实现][对于那些想开始编程这些算法的人来说,这是一个很好的参考。Pascal中提供了代码。上一版是1985年第57卷。]
从PrimePages打印<t5k.org>©Reginald McLean。