關於一種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;
}

 

完結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM