线性筛

参考:

http://www.cnblogs.com/zhuohan123/p/3233011.html


    我们现在要求1到N之间的素数。

    我们先尝试把1到N之间的合数分解成a=bp的形式,b是a的最小素因数,那么p的最小素因数一定是大于等于b的,同时p的范围是2到N,每一个1到N的合数的p都在这个范围之间,我们只要遍历p,并且为每个p找到所有合适的b就可以找到1到N之间的所有合数。所以这就是线性筛。

    第一层for循环的语句执行N次,第二层for循环的语句执行N次,所以是o(N)。

    其实镶嵌在线性筛里的求欧拉函数,也可以镶嵌在埃筛中,只不过比线性筛慢罢了。

    

图中划红线的那一句是应用了


那么为什么遍历到 i 时如果 isprime[i] 仍是true,就代表i是素数呢?

假设此时 i 是合数,那么 i 的 p 一定小于 p,可定已经在第一层循环中遍历过了,既然在第一层循环中遍历过的话,那么就已经乘上了所有适合它 b ,所得的结果中一定有 i ,那么意味着 i ,应该已经被标记为了false,所以矛盾。并且这也标志着用到 phi[i] 时,phi[i]已经承载着正确的值了。

posted @ 2015-10-04 20:07  buzhidaohahaha  阅读(87)  评论(0编辑  收藏  举报