從前有乙個素數篩法叫埃拉託斯特尼篩法,它的思想很簡單,把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的殘暴資料會跪,於是,線...