歐拉函數簡單總結
歐拉篩法&歐拉函數
1.歐拉篩法
1. 原理
通過枚舉一個1~n的數和已篩出的質數,他們的積為一個合數
2. 代碼實現
for(int i=2;i<=n;i++){ if(!vis[i]) prime[++tot]=i; for(int j=1;j<=tot;j++){ if(1ll*i*prime[j]>n) break;//大於時退出 vis[i*prime[j]]=1;//質數的倍數不是質數 if(i%prime[j]==0) break; //!!!重要優化 //令i=k*prime[j] 則 i*prime[j+x] 在i枚舉到 k*prime[j+x]時 //即會被篩去,為了防止重復篩除, break 掉; } }
2. 歐拉函數
1. 理論知識
1. 定義: 歐拉函數 \(\varphi(x)\) 為小於等於\(x\)且與\(x\)互質的數的個數
2. 重要性質
○1.\(\varphi(p)=p-1\) (\(p\)是質數).
○2.\(\varphi(x)\)為積性函數 即 \(\varphi (p*q)= \varphi (p)*\varphi (q)\) 其中 p,q互質 .
○3.\(\varphi (p^k)=(p-1)\ p^{k-1}\) (p是質數).
○4.當p為質數且\(p|x\)時,\(\varphi (x*p)=\varphi (x)*p\)
○5.設n是一個正整數,\(\sum_{d|n}\varphi(d)=n\)
○6.設\(1<=k<=n\),那麽有\(\sum_{(k,n)=1}k=\frac12n\varphi(n)\)
○7.若a與n互質,那麽若\(a^n\equiv b (mod\;p)\)則\(a^{n\;mod\;\varphi(p)}\equiv b(mod\;p)\)(由歐拉定理易得)
○8.若\(a^n\equiv b (mod\;p)\)則\(a^{n\;mod\;\varphi(p)+\varphi(p)} \equiv b(mod\;p)\)擴展歐拉定理(不要求a和p互質)
性質3的證明:
\(\because p^k\) 僅含有 \(p\) 這一個質因子故小於 \(p^k\)
**即$\varphi (p^k)=p^k-p^{k-1}=p^{k-1}*(p-1) $即證**
性質4的證明:
\(\because p|x\)令P為x的質因子集合\((1-1/P)=(1-1/p_1)*...*(1-1/p_n)\)
\(\therefore \varphi(x)=x*(1-1/P) ,\varphi(p)=p-1\)
\(\therefore \varphi (x*p)=(x*p)(1-1/P)\) (引入p後質因子集合不變 \(\because p\)是\(x\)的質因子)
\(\therefore \varphi(x*p)=x*(1-1/P)*p= \varphi(x)*p,\) 即證
2. 求法 :
通項公式:\[\varphi(x)=x*\prod(1-\frac1{p_i})其中p為x的質因子\]
證明如下:
預備知識:
1. \(\varphi(p)=p-1\) ( $ p $ 是質數 )
2. 唯一分解定理: \(x=(p_1^{k_1} *p_2^{k_2}\dots*p_n^{k_n})\) 其中\(p\)為\(x\)的質因子
3. \(\varphi(x)\)為積性函數 即 \(\varphi(p*q)=\varphi(p)*\varphi(q)\) 其中 p,q互質 .
4. \(\varphi(p^k)=(p-1)×(p^{k-1})\)
證明:
\(\varphi(x) = \varphi (p_1^{k_1}*p_2^{k_2} \dots *p_n^{k_n})\)其中\(p\)為\(x\)的質因子
\(\because x\)的質因子的任何次方都互質
\(\therefore \varphi(x)=\varphi(p_1^{k_1}) * \varphi(p_2^{k_2})*\dots*\varphi(p_n^{k_n})\)
而\(\varphi(p^k)=(p-1)×(p^{k-1})\)
\(\therefore \varphi(x)=(p_1-1) ×(p_2-1)*....*(p_n-1)(p_1^{k_1-1} *p_2^{k_2-1}\dots*p_n^{k_n-1})\)
前面各項每項提出一個\(p_i\)乘到後面去即得 \(\varphi(x)=x*\prod(1-\dfrac{1}{p_i})\)
4. 公式法和線性遞推法求解歐拉函數
- \(O(\sqrt{n})\) 公式法
inline int phi(int x)
{
if(x==1) return 1;
int res=x;
for(register int i=2;i<=sqrt(x);i++){
if(x%i==0){
res-=res/i;
while(x%i==0) x/=i;
}
}
if(x!=1) res-=res/x;//最後一個也要算;
return res;
}
2.\(O(n)\) 遞推法
for(int i=2;i<=n;i++){
if(!vis[i]) {prime[++tot]=i;phi[i]=i-1;}
for(int j=1;j<=tot;j++){
if(1ll*i*prime[j]>n) break;
vis[i*prime[j]]=1;
if(i%prime[j]==0) {
phi[i*prime[j]]=phi[i]*prime[j];
//當 prime[j]是i的約數時,phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(phi[prime[j]]);
//否則,phi[i*prime[j]]=phi[i]*phi[j] =phi[i]*(prime[j]-1);
}
}
2. 歐拉函數的一些應用
例1. 作為體育委員,C君負責這次運動會儀仗隊的訓練。儀仗隊是由學生組成的N * N的方陣,為了保證隊伍在行進中整齊劃一,C君會跟在儀仗隊的左後方,根據其視線所及的學生人數來判斷隊伍是否整齊(如下圖)。 現在,C君希望你告訴他隊伍整齊時能看到的學生人數。luogu-P2158 [SDOI2008]儀仗隊
解析:
觀察發現,以觀察點的右上為第1行第1列,則能被看到的點(x,y)在第x行第y列,必須滿足 gcd(x,y)==1才能被看到,由圖的對稱性故最後答案應為:
\[2×(\varphi(2)+\varphi(3)+....+\varphi(N-1))+3\]
最後加三是對角線、左、右能看到的人。
例2.給定一個整數N,你需要求出\(\sum gcd(i, N)(1<=i <=N)\) luogu-P2303 Longge的問題
解析: 令t(x)為 gcd(i,N) 為 x 的個數。∴ t(1)=Φ(N) ;
\[t(x)=\sum (gcd(i,N)==x)=\sum (gcd(i/x,n/x)==1)=\sum \varphi(n/x)\]
故當x是n的因數時求出Φ(x/n)即可
\[ans=Σ(x*\varphi(n/x))\]
例3. 題意:輸入 N 和 M (2<=N<=1000000000, 1<=M<=N), 找出所有的X滿足1<=X<=N 且 gcd(X,N)>=M.HDU-2588 GCD
解析:
1.首先若m==1,則答案為N
2.m≠1時,初步想法,將N進行質因數分解,則答案為其質因數的組合的積中大於m的組合個數,但實現起來不現實。
不妨設\(gcd(X,N)=Y >=M\)
則: \(令X=K*Y,其中一定有gcd(K,N)=1 且 Y|N,即Y是N的約數\)
於是有以下做法:先求出N的所有約數Y,\(\varphi(N/Y)\)之和(即符合條件的K的個數)
即為答案
為什麽是\(\varphi(N/Y)\)呢? 因為這樣才能保證 \(K*Y<=N\)
歐拉函數簡單總結