欧拉函数
欧拉函数
参考文章:
定义
我们定义 \(\varphi(x)\) 为 小于 \(x\) 的正整数中与 \(x\) 互质的数的个数,称作欧拉函数。
性质
-
若 \(x\) 为质数, \(\varphi(x)=x-1\)
证明:显然若 \(x\) 是质数,在1 ~ \(x\) 范围内,除 \(x\) 本身外,其余数字均与 \(x\) 互质。
-
若 \(x=p^c\) ( \(p\) 为质数),则 \(\varphi(x)=(p-1) \times p^{k-1}\) 。
证明:所有 \(p\) 的倍数都与 \(x\) 不互质,其他所有数都与他互质。\(p\) 的倍数刚好有 \(p^{k-1}\) 个(包括 \(x\) 本身)
那么 \(\varphi(x)=p^k-p^{k-1}=(p-1)\times p^{k-1}\) 。
-
若 \(p,q\) 互质,则有 \(\varphi(p\times q)=\varphi(p)\times \varphi(q)\) ,可知,欧拉函数本身是积性函数。
-
若 \(p\) 为 \(x\) 的约数( \(p\) 为质数, \(x\) 为任意正整数),我们有 \(\varphi(x\times p)=\varphi(x)\times p\)
-
若 \(p\) 不为 \(x\) 的约数( \(p\) 为质数, \(x\) 为任意正整数),我们有 \(\varphi(x\times p)=\varphi(x)\times (p-1)\)
-
对于一个正整数 \(x\) 的质数幂分解 \(x=p_1^{k1}\times p_1^{k1}\times\cdots\times p_1^{k1}=\prod_{i=1}^n p_i^{k_i}\) 。
\[\varphi(x)=x\times (1-\frac{1}{p_1} ) \times (1-\frac{1}{p_1} ) \times\cdots\times (1-\frac{1}{p_1} ) = x\times \prod_{i=1}^{n}(1-\frac{1}{p_i}) \]
求欧拉函数
若求单个数的欧拉函数,直接利用性质4求解。时间复杂度\(O(\sqrt x)\)。
int phi(int n) {
int ans = n;
int t = sqrt(n);
for(int i=2; i<=t; ++i) {
if(n%i == 0)
ans = ans/i*(i-1);
while(n%i == 0) n /= i;
}
if(n > 1) ans = ans/n/(n-1);
return ans;
}
若求前\(n\)个数的欧拉函数,可使用埃氏筛(性质4)或线性筛(性质5、6)。
//线性筛
void init(){
int n=1e7+50;//范围
phi[1]=1; //特判1
for(int i=2;i<=n;i++){
if(!vis[i]){pr[++cnt]=i,phi[i]=i-1;}//质数,性质1
for(int j=1;j<=cnt&&pr[j]<=n/i;j++){
vis[i*pr[j]]=1;
phi[i*pr[j]]=phi[i]*((i%pr[j])?pr[j]-1:pr[j]);
if(i%pr[j]==0)break;
}
}
}