首页 > 其他 > 详细

线性筛法求素数

时间:2016-04-16 00:36:05      阅读:270      评论:0      收藏:0      [点我收藏+]
为什么称为线性,因为普通的筛法重复了好多次,冗余,而线性筛法避免了冗余。

①如果 i 都是是素数的话,那简单,一个大的素数 i 乘以不大于 i 的素数,这样筛除的数跟之前的是不会重复的。筛出的数都是 N=p1*p2的形式, p1,p2之间不相等

 

②如果 i 是合数,此时 i 可以表示成递增素数相乘 i=p1*p2*...*pn, pi都是素数(2<=i<=n),  pi<=pj  ( i<=j )p1是最小的系数。
根据“关键处2”的定义,当p1==prime[j] 的时候,筛除就终止了,也就是说,只能筛出不大于p1的质数*i。 
 
重要的就是if(!(i % prime[j]))break;
为什么要这样呢,因为对于当前的合数,这个合数每次相乘一个小的素因子就会得到一个新的合数,此时不能继续。对于后面的合数,他能够被比他小的某一个数乘以一个最小素因子后得到,所以不需要再遍历每一个数。
 
 
 
模板:
void eular()
{
    cnt = 0;
    int m = MAXN;
    memset(isnotprime,0,sizeof(isnotprime));
    for(int i = 2; i <= m; i ++){
        if(!isnotprime[i]){
            prime[cnt++] = i;
        }
        for(int j = 0; j < cnt && 1LL * i * prime[j] < m; j++){
            isnotprime[prime[j]*i] = 1;
            if(i % prime[j] == 0)
                break;
        }
    }
}

 

线性筛法求素数

原文:http://www.cnblogs.com/sweat123/p/5397248.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!