素數判定(素數篩法)(尤拉)

2021-07-15 06:58:47 字數 530 閱讀 3049

這裡主要說一下素數篩法,該方法可以快速的選取出1~n數字中的所有素數。時間複雜度遠小於o(n*sqrt(n))

方法為:從2開始,往後所有素數的倍數都不是素數。最後剩下的數都是素數。

再說說尤拉公式,用來解決所有小於n中的數字有多少個與n互質,用ψ(n)表示。

ψ(n)=n*(1-1/q1)*(1-1/q2)*……*(1-1/qk),n為和數,其中qi為n的質因數。

ψ(n)=n-1,n為質數

下面有網上的幾種表示,

// 1:這是最原始的篩法,還有待優化 

#define max 1000000

bool prime[max];

void isprime()

上面兩種方法的執行速率都比較快,以前用的素數比較法,雖然看起來簡單,但是效率低;這種方法還是要靠自己理解。

素數線性篩法(尤拉篩)

之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...

尤拉篩法求素數

尤拉篩法通過不篩除篩除過的數來將時間複雜度優化到 尤拉篩法求素數 首先,我們知道當乙個數為素數的時候,它的倍數肯定不是素數。所以我們可以從2開始通過乘積篩掉所有的合數。將所有合數標記,保證不被重複篩除,時間複雜度為o n 比較簡單 求小於等於n的素數的個數 include includeusing ...

尤拉篩法求素數

埃氏篩法確實大大提高了求素數的效率,但是會有很多合數被重複刪去,在資料大小超過1e8的時候會支撐不住。尤拉篩法便有效先看 解決了這個問題,將時間複雜度降低到了o n 先看 int ans 0,pri max n 尤拉篩法 bool vis max n void getpri vis i pri j ...