原理非常簡單:
除了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; }
完結