原理非常简单:
除了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; }
完结