從埃篩到尤拉篩

2021-09-25 16:09:24 字數 943 閱讀 7623

埃式篩法是第乙個比較先進的篩法,以後的所有篩法大多都是以埃篩為基礎推進的

埃篩的思想也很簡單,篩掉所以素數的倍數,最後還剩的就是素數

bool isprime[maxn]

;void

eratosthenes_prime()

}

這個篩法的唯一缺陷是被重複篩去的元素太多,導致演算法不夠精妙

比如6會被2篩一次,還會被3篩一次,這就導致埃篩的時間只能達到o(nlogn),這樣的複雜度對付小資料,要是來個1e6是絕對不可能過的

再這之上,尤拉篩法就出現了,它避免了重複篩這一情況

bool isprime[maxn]

;int prime[maxn/10]

,tot;

void

euler_prime()

}}

尤拉篩唯一亮點所在在於if(i%prime[j]==0)break;這句,是從埃篩提公升到尤拉篩的關鍵

尤拉篩的時間是o(n)。

上面這個歐篩中的isprime陣列其實是作用不大的,我們可以把它換成尤拉函式,適當的我們也可以新增莫比烏斯函式

int prime[maxn/10]

,phi[maxn]

,mu[maxn]

,tot;

void

euler()

for(

int j=

0;j*i) phi[i*prime[j]

]=phi[i]

*(prime[j]-1

);mu[i*prime[j]]=

0;}}

}

除此之外,比較先進的素篩演算法還有min_25篩,杜教篩,洲閣篩

三種篩法時間都在o(n)之下,有些出題人就喜歡把資料故意整到1e10,就看你會不會這三種先進篩法

埃氏篩 尤拉篩

對於1 n範圍內素數的查詢,我們常用的二重迴圈暴力演算法的複雜度是o n2 如果利用開根縮小範圍的時間複雜度也無非是在o n nn sqrt n nn 而,這些演算法對於n在105以內都是可以接受的,但是如果需要更大範圍的素數表,這些演算法將顯得力不從心。下面將介紹更加高效的演算法。埃氏篩也叫素數篩...

埃氏篩 線性 尤拉 篩

埃氏篩 簡單,暴力。int isprime 50000 void getlist int size 看似簡單,但不真搞明白這個,無法學會線性 尤拉 篩。關鍵在於如何去做的合數,用了兩個引數,乙個是質數,即 prime i 另乙個是質數的倍數,即 j 相乘得到合數。線性篩 埃氏篩的改良版,使乙個合數只...

埃式篩與尤拉篩

核心思想 每個質數的倍數都是合數,當發現乙個質數時就將其的倍數都變成合數。缺點 有的合數會被它的幾個質因子重複篩掉,造成了時間上的浪費。include include using namespace std int n,q,cnt,k bool isprime 100000005 int sushu...