素数判定(素数筛法)(欧拉)

这里主要说一下 素数筛法,该方法可以快速的选取出1~N数字中的所有素数。时间复杂度 远小于O(N*sqrt(N))
方法为:从2开始,往后所有素数的倍数都不是素数。最后剩下的数都是素数。
再说说欧拉公式,用来解决所有小于n中的数字有多少个与n互质,用Ψ(n)表示。
Ψ(n)=n*(1-1/q1)*(1-1/q2)*……*(1-1/qk),n为和数,其中qi为n的质因数。
Ψ(n)=n-1,n为质数

下面有网上的几种表示,

// 1:这是最原始的筛法,还有待优化 
#define Max 1000000
bool prime[Max];
void IsPrime(){
     prime[0]=prime[1]=0;prime[2]=1;
     for(int i=3;i//2:优化后的筛法,手动地模拟原始筛法就可以发现,某个数字可能被不止一次地删去
//   优化后的筛法就可以避免这种不必要的删去操作 
#define Max 1000000
bool prime[Max];
void IsPrime(){
     prime[0]=prime[1]=0;prime[2]=1;
     for(int i=3;ifor(int i=3;i<=t;i++)
       if(prime[i])
         for(int j=i*i;j
//这就是素数的二次筛法
//与前两种筛法不同,此种筛法中prime[i]=2*i+3(即:我们只存储奇数,偶数肯定不是素数的) 
#define Max 1000000
bool prime[Max>>1];
void IsPrime(){
     memset(prime,true,sizeof(prime));
     int n=Max>>1,m=(int)(sqrt(Max*1.0)/2.0);
     for(int i=0;i<=m;i++)        
        if(prime[i])
          for(int j=2*i*i+6*i+3;j<=n;j+=2*i+3)
            isprime[j]=false;
}
上面两种方法的运行速率都比较快,以前用的素数比较法,虽然看起来简单,但是效率低;这种方法还是要靠自己理解。


 

你可能感兴趣的:(素数判定(素数筛法)(欧拉))