欧拉函数&欧拉定理 学习笔记
欧拉函数
\(φ(n)=\sum\limits_{i=1}^{n}[\gcd(i,n)=1]\)
性质:
-
\(\forall\ n=p^k,φ(n)=p^k-p^{k-1}\)
(若 \(n\) 为质数,\(φ(n)=n-1\) )
证明:对于每个不满足 \(\gcd(m,n)=1\) 的 \(m\) 都可以写成 \(m=s\times p\) 的形式
且 \(p\le s\times p\le p^k→1\le s\le p^{k-1}\)
那么不满足的数的个数只有 \(p^{k-1}\) 个 \(φ(n)=p^k-p^{k-1}\) 得证 -
\(φ\) 是积性函数:对于任意 \(n,m\) 满足 \(\gcd(n,m)=1\) ,都有 \(φ(nm)=φ(n)\times φ(m)\)
-
我们知道:
那么就有:
证明:
由性质2得:
由性质1得:
欧拉函数求法
由性质3可以得到 \(φ(n)=n\prod\limits_{i=1}^k(\dfrac{p_i-1}{p_i})\quad\) \(φ(n)=\prod\limits_{i=1}^kp_i^{c_i-1}(p_i-1)\)
那么我们可以在 \(O(\sqrt n)\) 的复杂度内求出一个数的欧拉函数:
写法1
int phi(int n){
int ans=n,num=1;
for(int i=2;i*i<=n;i++)
{
if(n%i)continue;
ans=ans/i*(i-1);
while(!(n%i))n/=i;
}
if(n^1) ans=ans/n*(n-1);
return ans;
}
写法2
int phi(int n){
int ans=1,num=1;
for(int i=2;i*i<=n;i++)
{
if(n%i)continue;
num=i-1,n/=i;
while(!(n%i)) num=num*i,n/=i;
ans=num*ans;
}
if(n^1) ans=ans*(n-1);
return ans;
}
两种写法分别对应两个柿子
知周所众,积性函数都可以线性筛出来
那么对于 \(φ\) 来说 分以下两种情况( \(p_j\) 为质数):
- \(p_j\nmid i\) 此时满足 \(\gcd(p_j,i)=1\) ,有 \(φ(p_j\times i)=φ(p_j)\times φ(i)\)
- \(p_j\mid i\) 考虑性质3: \(\forall\ n\in\mathbb{N},\ φ(n)=n\prod\limits_{i=1}^k(1-\dfrac{1}{p_i})\)
发现它对后面没有贡献 那么乘进去维护前面的 \(n\) 即可 \(φ(p_j\times i)=p_j\times φ(i)\)
对于没被筛到的 \(i\) 一定为质数 那么 \(φ(i)=i-1\)
void init(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i])p[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*p[j]<=n;j++){
vis[i*p[j]]=1;
if(!(i%p[j])){
phi[i*p[j]]=phi[i]*p[j];
break;
}
phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
}
欧拉定理
对于满足 \(\gcd(a,m)=1\) 的 \(a,m\) 都有
(对于费马小定理 \(a^{p-1}\equiv1\pmod p\) 实际上为欧拉定理 \(m\) 为质数的特殊情况)
可用于对指数取模:\(a^b\equiv a^{b\bmod φ(m)}\pmod m\)
如果 \(\gcd(a,m)\not=1\) 怎么办捏?看下面!
扩展欧拉定理
对于满足 \(b\ge φ(m)\) 的 \(a,b,m\) 都有
所以有: