两千多年前,埃拉托斯特尼计算了地球的周长、到太阳的距离和地轴的倾斜,发展了经纬度系统,并发明了闰日,创造了一种系统的方法来枚举至今仍在使用的质数。埃拉托斯特尼出生于塞浦路斯(现利比亚),生活于公元前276年至194年,一生大部分时间都在埃及亚历山大度过,他是继罗德州阿波罗纽斯之后的第二位大图书馆馆长;他是阿基米德的好朋友。
埃拉托斯特尼筛首先列出所有达到期望最大值的数字;我们将通过计算素数到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,然后每隔一个数字划掉:
2 3456789101112131415161718192021222324252627282930
(虽然可能不太明显,但数字4会从列表中划掉;在某些字体中,4的横线与删除线重合。)接下来,取列表中未划掉的下一个数字3,每隔三个数字划掉一个;其中一些已经划掉:
2 345678 9 1011121314 15 1617181920 21 2223242526 27 282930
对列表上的下一个未交叉的数字5重复上一步:
2 345678 9 1011121314 15 1617181920 21 222324 25 26 27 282930
以此类推,每次都要划掉列表中下一个未交叉数字的所有倍数。素数列表是所有未被删除的数字:
2 3 5 7 11 13 17 19 23 29
这种方法被称为筛子,因为它会扫过一系列数字,发现每一个质数都会阻止其所有倍数成为质数。这个筛子允许进行一些优化。首先,只考虑奇数,因为初始筛选将除2之外的所有偶数交叉,而2是单独处理的。第二,由于所有较小的素数都已经被筛子的前几步筛掉了,所以从被筛数的平方开始划掉;例如,筛选3从9开始,因为筛选2时已经划掉了6。第三,筛分在筛子中最大数量的平方根处停止,因为任何大于平方根的非杂质必须已经在筛子的先前水平上被划掉;因此,在上述示例中,不需要筛选素数7或任何更大的素数,因为7的平方大于30,这是列表中最大的数字。
编写一个接受单个参数的函数n个并返回小于或等于的质数列表n个使用上述优化筛选算法。将函数应用于参数15485863,并计算返回的素数。
页:1 2