埃及篩素數 尤拉篩函式

2022-06-11 11:18:10 字數 2164 閱讀 7103

線性篩素數:

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的最小因子。

const

int maxn = 10010, inf = 0x7fffffff

;int prime[maxn+1

];void

get_prime()}}

線性尤拉函式

需要用到如下性質(p為質數):

1. phi(p)=p-1   因為質數p除了1以外的因數只有p,故1至p的整數只有p與p不互質

2. 如果i mod p = 0, 那麼phi(i * p)=p * phi(i)  證明如下

(上述證明存在bug。。感謝@primaryoier指教)

上面的過程證明了從區間[1,i]->[i+1,i+i],若整數n不與i互質,n+i依然與i不互質。下面給出另乙個證明:若整數n與i互質,n+i與i依然互質

3.若i mod p ≠0,  那麼phi(i * p)=phi(i) * (p-1)

i mod p 不為0且p為質數, 所以i與p互質, 那麼根據尤拉函式的積性phi(i * p)=phi(i) * phi(p) 其中phi(p)=p-1即第一條性質

const int maxn = 10010;

int prime[maxn], phi[maxn];

bool vis[maxn];

int ans;

void get_prime()}}

void

get_phi()

else

phi[i * prime[i]] = phi[i] * (prime[j] - 1

); }}}

時間差距

when n = 10000

eratosthenes_sieve(

1229): 0

(us)

euler_sieve(

1229): 0

(us)

when n = 100000

eratosthenes_sieve(

9592): 999

(us)

euler_sieve(

9592): 0

(us)

when n = 1000000

eratosthenes_sieve(

78498): 13004

(us)

euler_sieve(

78498): 7004

(us)

when n = 10000000

eratosthenes_sieve(

664579): 185130

(us)

euler_sieve(

664579): 79067

(us)

when n = 100000000

eratosthenes_sieve(

5761455): 2363692

(us)

euler_sieve(

5761455): 842592

(us)

when n = 1000000000

eratosthenes_sieve(

50847534): 25535159

(us)

euler_sieve(

50847534): 8987385(us)

**自大佬們

尤拉函式 素數篩

尤拉發現求小於等於n的正整數中有多少個數與n互質可以用這個公式 euler x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有素因數,x是不為0的整數。euler 1 1 唯一和1互質的數就是1本身 尤拉公式的延伸 乙個數的所有質因子之和是e...

線性篩素數(尤拉篩)

尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...

csu(尤拉函式 篩素數)

這真是一道好題啊!讓我wa了那麼多次,wa的原因是 大於根號n的質因子有且只有乙個,而我一開始都不懂這一點 題目鏈結 題意 輸入乙個n,a是n的所有因子之和,b是所有與n互質的數之和,求a b b比較容易求,所以先分析一下如何求b,首先我們要知道乙個結論如果x與n互質,那麼n x與n也互質,所以b ...