Loading

欧拉函数

欧拉函数

参考文章:

基础数论复习

定义

我们定义 \(\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;
		} 
	}
}
posted @ 2024-02-02 21:31  流泪的小酒窝  阅读(21)  评论(0)    收藏  举报