筛法思想:从素数的定义出发(除了1和本身之外不能被其他数整除的数,包括 0,1),根据这个定义,可以筛除序列2的倍数(2 4 6 8 10。。。),3的倍数(3 6 9 12.。。。)。。。。知道序列中某个数大于sqrt(N)且没被筛除。
算法复杂度分析:N+N/2+N/3+N/4+.........+ =NHn~NlnN(调和数(参见数学分析or第一章的常见分析数学基础))
算法实现:
(代码可优化的地方很多,功夫不到家,暂时优化不好)
运行结果:
可到10000000,再往后就分不到内存了。(当时的机子条件下)。
关于筛法的总结:
ACM中常用的筛法代码:
2Sundaram 筛法
埃拉托色尼 (Eratosthenes) 素数筛法可谓尽人皆知,但恐怕知道 Sundaram 筛法的却不多。此算法构造一对称矩阵:
此矩阵为对称矩阵,每行(列)均为等差数列,第一行(列)首项为4,公差为3;第二行(列)公差为5;第三行(列)公差为7……也即矩阵中包含所有满足 的 N。
这个对称矩阵的秘密在于:若 N 不出现于矩阵中,则 2N + 1 为素数。该筛法可以筛出除 2 以外的所有素数。
该算法的时间复杂度低于 。
算法正确性的证明:
所有矩阵中的数的两倍加 1 都是被筛掉的数(这些数均为奇数)。这些数均具有 的形式。而 i, j 的取值为任意大于 1 的自然数,故所有可以表示为两奇数之积的数(即奇合数)全部被筛除。故留下的奇数均为奇素数。