尤拉篩法求素數

2021-09-11 19:20:42 字數 464 閱讀 6117

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

先看**:

int ans=0,pri[max_n];//尤拉篩法 

bool vis[max_n];

void getpri()

}}

vis[i*pri[j]]=1:並不是要用i的倍數來消去合數,而是把 prime裡面紀錄的素數,公升序來當做要消去合數的最小素因子。 

if(i%pri[j]==0)break:保證了每個合數僅被它最小的質因數篩去。當 i是pri[j]的倍數時,i = k*pri[j],如果繼續運算 j+1,i*prime[j+1] = pri[j]*k*pri[j+1],這裡pri[j]是最小的素因子,當i = k*pri[j+1]時會重複,所以才跳出迴圈。

參考部落格:

尤拉篩法求素數

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

線性篩法求素數(埃氏篩法 尤拉篩法)

篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...

素數線性篩法(尤拉篩)

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