線性篩法(尤拉篩)

2021-08-01 23:42:45 字數 1337 閱讀 8322

從前有乙個素數篩法叫埃拉託斯特尼篩法,它的思想很簡單,把1-n以內素數的整數倍的數字劃掉,留下的就全是素數,但是它的複雜度是o(nlglgn),對於大量不友好資料會跪,於是線性曬登場了。

#include using namespace std;

int prime[1100000],primesize,phi[11000000];

bool isprime[11000000];

void getlist(int listsize)

}}

以上就是線性曬**,他與埃氏篩法大概有這麼幾點不同:

①:if(i%prime[j]==0)break;

這句**保證了每個數最多被篩一次,將時間複雜度降到了線性。

證明如下:prime陣列中的素數是遞增的,當i能整除prime[j],那麼i*prime[j+1]這個合數肯定被prime[j]乘以某個數篩掉。

因為i中含有prime[j],prime[j]比prime[j+1]小,即i=k*prime[j],那麼i*prime[j+1]=(k*prime[j])*prime

[j+1]=k』*prime[j],接下去的素數同理。所以不用篩下去了。因此,在滿足i%prime[j]==0這個條件之前以及第一次

滿足改條件時,prime[j]必定是prime[j]*i的最小因子。

大名鼎鼎的線性曬日常篩素數的速度大概是埃氏篩的3-4倍,然而在小資料中卻有被完爆的可能qaq

所以尤拉篩法不只是拿來篩個素數,更重要的一點是線性篩可以用來求解積性函式。

積性函式f(x)應滿足f(a×b)=f(a)×f(b),a與b應互素。而完全積性函式則應滿足對於任意的a與b,前面的等式應成立。

先上尤拉phi函式:

memset(check,false,sizeof(check));

fai[1] = 1;

int tot = 0;

for(int i = 2 ; i <= n ; i++)

for(int j = 0 ; j < tot ; j++)

else

}}

再來個線性篩解莫比烏斯函式:
memset(check,false,sizeof(check));

mu[1] = 1;

int tot = 0;

for(int i = 2 ; i <= n ; i++)

for(int j = 0 ; j < tot ; j++)

else

}}

線性篩法(尤拉篩法)

嗯在剛剛 沒錯就是在幾分鐘之前 我學會了線性篩法 實在是乙個很好的篩法 正常的篩法,都會對乙個數篩多次 但是尤拉篩法不會 尤拉篩法是用它的最大因數去篩 別跟我說最小質因數,那個很難讓人理解 雖然最小質因數和最大因數是一樣的 我們假設乙個數k,它是t的最大因數 容易知道t是不唯一的 那我們要乘以乙個質...

素數線性篩法(尤拉篩)

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

線性篩(尤拉篩)

昨天的考試跪的一塌糊塗 第一題水過,第二題帶wa的樸素,最後題忘了特判左端點全跪,分數比起預計得分整整打了個對折啊!步入正題 線性篩 尤拉篩 一般的篩法 ppt裡叫埃拉託斯特尼篩法,名字異常高貴 的效率是o nlglgn 其實很接近o n 啊!對於一些例如n 10000000的殘暴資料會跪,於是,線...