关于一种6的倍数判定素数的方法

原理非常简单:

除了2,3,以外对于任意的n,只有6n-1和6n+1有可能是素数。(注意是有可能)

证明:

6n不是素数,因为他一定有因数2和3;

6n+2,6n+3,6n+4同样不是(分别为2,3,2的倍数)于是只剩下了6n+1和6n+5(6n-1)

那么,判断的数范围缩小为原来的三分之一

具体来讲:如果判断的数n%6!=-1或1的话,直接返回false不为质数

如果满足条件,它有可能是质数,做进一步判定:

对于每一个6n-1和6n+1来说,它一定不是2和3的倍数!(也不是4和6的倍数),那么,在枚举因子时,只需枚举6n-1和6n+1就OK了,

再加上sqrt优化。。。。

三管齐下,复杂度为O(√n/9)大概是这样吧。

bool Is_prime(int n)
{
    if(n==1) return false;
    if(n==2||n==3) return true;
    if(n%6!=1&&n%6!=5) return false;
    for(register int i=5;i*i<=n;i+=6)
        if(n%i==0||n%(i+2)==0) return false;
    return true;
}

完结

原文地址:https://www.cnblogs.com/lbssxz/p/10927626.html