線性篩求尤拉函式

2022-08-18 23:45:17 字數 1710 閱讀 4754

蒟蒻要開始打數論模板了。

尤拉函式:小於n且與

n互素的數個數,記為

φ(n)

它有這樣幾個優越的性質:

**

1.  phi(p) == p-1 因為素數p除了1以外的因子只有p,所以與 p 互素的個數是 p - 1個

2. phi(p^k) == p^k - p^(k-1) == (p-1) * p^(k-1)

證明:令n == p^k,小於 n 的正整數共有 p^k-1 個,其中與 p 不互素的個數共 p^(k-1)-1 個,它們是 1*p,2*p,3*p ... (p^(k-1)-1)*p

所以phi(p^k) == (p^k-1) - (p^(k-1)-1) == p^k - p^(k-1) == (p-1) * p^(k-1)。

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

舉個例子:

假設 p = 3,i = 6,p * i = 18 = 2 * 3^2;

phi(3 * 6) == 18*(1-1/2)*(1-1/3) = 6

p * phi(i) = 3 * phi(6) = 3 * 6 * (1-1/2) *  (1-1/3) = 6 = phi(i * p) 正確

4. 如果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

所以 phi(i * p) == phi(i) * (p-1).

再舉個例子:

假設i = 4, p = 3, i * p = 3 * 4 = 12

phi(12) = 12 * (1-1/2) * (1-1/3) = 4

phi(i) * (p-1) = phi(4) * (3-1) = 4 * (1-1/2) * 2 = 4 = phi(i * p)正確

那麼直接給出實現**

#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define n 100001

typedef long long ll;

char xb[1<<15],*xt=xb,*xs=xb;

//#define getchar() (xs==xt&&(xt=(xs=xb)+fread(xb,1,1<<15,stdin),xs==xt)?0:*xs++)

inline int read()

while(ch<='9'&&ch>='0')

return f*x;

}bool nop[n*11];

ll phi[n*11],pri[n];

int size;

void getprime(int lim)

else phi[i*pri[j]]=phi[i]*(pri[j]-1);}}

}int main()

線性篩質數,線性求尤拉

本篇前半部分講線性篩質數,也叫尤拉篩,後半篇講解線性求尤拉函式。我們有一種篩質數的辦法,就是列舉每個質數,然後把這個質數的倍數都篩掉,這個做法比較簡單,在這裡不做過多介紹。尤拉篩就是在這個方法的基礎上,使得每個合數只會被它最小的那個質因子篩掉,保證了複雜度是線性的 memset isprime,1,...

線性篩尤拉函式

在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目,用 varphi n 表示。其中 p 1,p 2 p n 為 x 的所有質因數,x 是不為0的整數。varphi 1 1 當正整數p為質數時 varphi n n 1 尤拉函式是積性函式,當a與b互質時,滿足 varphi a tim...

線性篩求尤拉函式的證明

若 i 為質數,則 varphi i i 1 若 p j mid i 則 varphi i times p j varphi i times p j 若 p i nmid i 則 varphi i times p j varphi i times varphi j varphi i times p ...