埃拉托色尼筛法:求质数的方法
其本质是排除法,把某一范围内的合数全去掉,剩下的就是质数.
既然采取排除法,那么就得保证所有的合数都被除去,那怎么保证把所有合数都除去?
以下就是典型的例子:找出1000以内的所有质数.
首先,把2的倍数全部划去,也就是说把2 * ( 2 到 500 )全部去掉,然后把3的倍数全部划去,也就是说把3 * ( 2 到 333 )全部去掉,接下去就是5,7……
此算法的根据是:
整数唯一分解定理 :每个大于1的整数均可以表示为素数之积,而且这些素因子按大小排列之后,写法仅有一种形式.(这里的素数应该要包括1,特殊处理)
但是,如果采用上面的算法,明显会极大浪费时间和精力,因为有很多重复被划去的数.比如说6 = 2 * 3 = 3 * 2, 在划去2的倍数时,已经被划去了,在划去3的倍数时,又被划了一次,像这样被重复划去的数有很多.
为了解决这一问题,我们可以采用下面的方法:
比如说在划去n的倍数的时候,只需要从n的平方开始划去合数,因为n是从小到大递增的,所以当我们划去n的倍数时,( 2 到 n-1 ) * n都已经在前面被划去了.
根据这一结论,我们可以发现找出1000以内的质数只需要,划到31的倍数,因为31的平方是961,32的平方式1024。