歐拉函數:
定義:
\(\varphi (n)\) 表示小於等於 \(n\) ,和 \(n\) 互質的數的個數。
當 \(n\) 為質數, \(\varphi(n)=n-1\)
性質:
-
歐拉函數為積性函數(可以用線性篩計算)
如果 \(gcd(a,b)=1\) , 那么 $\varphi(a \times b)=\varphi(a) \times $ -
當 \(n\) 為奇數時 \(\varphi(2n)=\varphi(n)\)
-
\(n=\sum{d|n} \varphi(d)\),根據莫反得到
-
若 \(n=p^k\) ,其中 \(p\) 是質數,那么 \(\varphi(n)=p^k-p^{k-1}\)
歐拉定理:
若 \(gcd(a,m)=1\) ,則 \(a^{\varphi(m)} \equiv 1(\mod m)\)
求歐拉函數:
線性篩即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int prime[N],vis[N],phi[N],cnt,n;//定義:小於等於n,且和n互質的數
int main(){
scanf("%d",&n);
vis[1]=phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]) prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
vis[i*prime[j]]=1;
if(!(i%prime[j])){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
system("pause");
return 0;
}
費馬小定理:
若 \(p\) 為素數,且 \(gcd(a,p)=1\) , 則 \(a^{p-1} \equiv 1 (\mod p)\)
或者也可以說 \(a^p \equiv a(\mod p)\) 。
拓展歐拉定理:
\[a^c~\equiv~\begin{cases}a^{c~Mod~\phi(m)} &\gcd(a,m)~=~1 \\a^c &\gcd(a,m)~\neq~1~\land~c~<~\phi(m) \\ a^{c~Mod~\phi(m)~+~\phi(m)} &\gcd(a,m)~\neq~1~\land~c~\geq~\phi(m)\end{cases} \]
證明看 \(OI-WIKI\) 就行了.