線性篩選素數和線性篩選尤拉函式 bzoj2190

2021-06-28 09:09:32 字數 1845 閱讀 1578

一、線性篩選素數

#include#includeusing namespace std;

int prime[1110000],pr,n;

bool v[1110000];

void getprime()

for(int j=1;(j<=pr)&&(i*prime[j]<=n);j++)

}}int main()

線性篩選尤拉函式:求小於n,且和n互質的數字個數

比如:1: 0

2: 1

3: 2

4: 2

5: 4

6: 2

7: 6

8: 4

9: 6

10: 4

#include

#include

#define m 1000

int prime[m/3],phi[m];

bool flag[m];

void get_prime()

int i,j,k;

memset(flag,false,sizeof(flag));

k=0;

for(i=2;iif(!flag[i]){                            

prime[k++]=i;

phi[i]=i-1;

for(j=0;jflag[i*prime[j]]=true;            

if(i%prime[j]==0){

phi[i*prime[j]]=phi[i] * prime[j];

break;

else

phi[i*prime[j]]=phi[i] * phi[prime[j]];

int main()

freopen("da2.out","w",stdout);

get_prime();

for(int i=1;i<100;i++)printf("%2d:%2d\n",i,phi[i]); 

尤拉函式的幾個性質:e(x)表示比x小的且與x互質的正整數的個數。

1、*若p是素數,e(p)=p-1。

// 這個沒意見! 2、

*e(p^k)=p^k

-p^(k-1)=(p-1)*

p^(k-1)

證:令n=p^k,小於等於n的正整數數中,所有p的倍數共有p^(k-1)個。//同意?

1~n出去p的倍數,所以e(n)= n -  p^(k-1)  =p^k - p^(k-1) =  (p-1)*p^(k-1).得證。

想通以上證明很重要,因為是看懂下來證明的基礎。

3、*若ab互質,則e(a*b)=e(a)*e(b),尤拉函式是積性函式.

*對任意數n都可以唯一分解成n=p1^a1*p2^a2*p3^a3*...*pn^an(pi為素數).

則e(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)// 這個沒意見!可以理解

=(p1^a1*p2^a2*p3^a3*...*pn^an)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)      

=(p1-1)*p1^(a1-1)*(p2-1)*p2^(a2-1)*...*(pn-1)*pn^(an-1)

=e(p1^a1)*e(p2^a2)*e(p3^a3)*...*e(pn^an)   

//由此證明了互質的可以用各自的尤拉函式直接乘

所以當ab互質的時候e(a*b)=e(a)*e(b)

不互質的時候怎麼辦呢? 當

b是質數,a%b==0,那麼由上面的證明,b並到其中乙個b

^x裡面,所以

e(a*b)=e(a)*b

線篩 尤拉篩 線性篩選素數

題目描述 用線行篩篩選素數,將指定範圍的素數找出,達到o n 的效果。思路時間複雜度 0 n 思路任意值必然可以被分解為 a b1 c1 b2 c2 例如9 3 3,15 3 5,55 5 11 即所有的合數都可以被拆解為素數倍數的乘積。當我們從2開始找到素數與含有素數的合數,將合數標記為非素數,每...

素數線性篩選

include include includeusing namespace std bool isprime 10000001 int pri 2000001 prin int findprime int maxn for int j 0 jmaxn break 當過大了就跳出 isprime i...

線性篩選素數

侵刪。題目 給出乙個正整數n,列印出所有從1 n的素數 即質數 關鍵是要找出乙個判斷乙個正整數n是否為素數的方法 傻瓜解法 n,n 2 1 include2 int main 3 12 這裡迴圈取到sqrt n 效率改進不少了 但顯然還是不夠理想 繼續往下看 普通篩選法 埃拉託斯特尼篩法 先簡單說一...