線性篩法(歐拉篩法)求素數 和 質因數分解


時間復雜度O(n)當n比較大時歐拉篩法所用的時間比O(nloglogn)的算法的時間少的會越來越明顯

為什么呢?

因為在歐拉篩法中,每一個合數只被訪問並將其所對的f[]的值修改了一次。

下面以求n以內質數為例。

for(i = 2; i <= n; i++)
{
    if(f[i] == 0)
    {
        p[++cnt] = i;
    }
    for(j = 1; j <= cnt; j++)
    {
        if(i * p[j] > n)break;因為求n以內質數。
        f[i * p[j]] = 1;
        if(i % p[j] == 0)break;//這句話是關鍵。這句話保證了一個數被他最大的因數(除自己本身)篩。。。也可以說是被最小的質因數篩。
    }
}

 手推一下可以清晰理解。。。我來寫一下。。。。

 

   就比如12是被2  6  篩掉的,而3    4  並沒有去篩12       就是因為   

   if(i % p[j] == 0)break;這句話保證了一個數被他最大的因數(除自己本身)篩。

4篩完8   因為4%2==0;   打斷當前循環,沒有去篩12.

 

延伸一下,既然歐拉篩能保證一個數是被其最小的質因數篩,那么我們就可以利用這一性質來對一個數進行質因數分解

 需要加的就是記錄一下被哪個質數篩的。

 if(f[i] == 0) { p[++cnt] = i;
s[i]=i; }

f[i * p[j]] = 1;
s[i*p[j]]=p[j];


這兩處寫為這樣,s記錄的就是一個數的最小質因數,那么分解質因數時只需要不斷去除當前數的最小質因數,知道除到1,質因數便分解完了。





      

 


免責聲明!

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



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