Loading

欧拉函数

参考文章:

基础数论复习

定义

我们定义 \(\varphi(x)\) 为 小于 \(x\) 的正整数中与 \(x\) 互质的数的个数,称作欧拉函数。

性质

  1. \(x\) 为质数, \(\varphi(x)=x-1\)

证明:显然若 \(x\) 是质数,在1 ~ \(x\) 范围内,除 \(x\) 本身外,其余数字均与 \(x\) 互质。

  1. \(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}\)

  1. \(p,q\) 互质,则有 \(\varphi(p\times q)=\varphi(p)\times \varphi(q)\) ,可知,欧拉函数本身是积性函数。

  2. \(p\)\(x\) 的约数( \(p\) 为质数, \(x\) 为任意正整数),我们有 \(\varphi(x\times p)=\varphi(x)\times p\)

  3. \(p\) 不为 \(x\) 的约数( \(p\) 为质数, \(x\) 为任意正整数),我们有 \(\varphi(x\times p)=\varphi(x)\times (p-1)\)

  4. 对于一个正整数 \(x\) 的质数幂分解 \(x=p_1^{k_1}\times p_2^{k_2}\times\cdots\times p_n^{k_n}=\prod_{i=1}^n p_i^{k_i}\)

\[\varphi(x)=x\times (1-\frac{1}{p_1} ) \times (1-\frac{1}{p_2} ) \times\cdots\times (1-\frac{1}{p_n} ) = x\times \prod_{i=1}^{n}(1-\frac{1}{p_i}) \]

  1. \(\forall n>1,\sum_{x}^{x与n互质}x=\frac{n\times\varphi(n)}{2}\)

证明:因为 \(\gcd(n,x)=\gcd(n,n-x)\) ,所以在 1~n中与n互质的数是成对出现的。

  1. \(\sum_{d|n}\varphi(d)=n\)

证明1:

我们采用数学归纳法,首先 \(f(1)=1\)

\(f(n)=\sum_{d|n}\varphi(d)\)

对于\(f(x),x=p^c,p为质数,c\in N^+\)

\(f(x)=\sum_{d|p^{c-1}}\varphi(d)+\varphi(p^c)=f(p^{c-1})+\varphi(p^c)=p^{c-1}+p^{c-1}\times(p-1)=p^{c-1}\times p=p^c\)

\(x=n\times m\) 其中 \(n\bot m\)

\(f(x)=f(n\times m)=\sum_{d|nm}\varphi(d)=\sum_{d|n}\varphi(d)\times\sum_{d|m}\varphi(d)=f(n)\times f(m)=n\times m=x\)

证明2:
\(设1\leq a\leq n,d=\gcd(a,n)\)
\(则\gcd(\frac{a}{d} ,\frac{n}{d})=1\)
\(\therefore 对于每一个d|n,都有\varphi(\frac{n}{d})个a,满足\gcd(\frac{a}{d},\frac{n}{d})=1\)
\(\because 共有n个符合题意的a,每个a都对应唯一一个d^①\)
\(\therefore \sum_{d|n}\varphi(\frac{n}{d})=n,即\sum_{d|n}\varphi(d)=n\)

①:对于“每个\(a\)都对应唯一一个\(d\)”的证明如下:

\(假设\exists a同时满足d_1和d_2的条件,即\gcd(\frac{a}{d_1} ,\frac{n}{d_1})=\gcd(\frac{a}{d_2} ,\frac{n}{d_2})=1\)

\(那么d_1=\gcd(a,n)且d_2=\gcd(a,n),即d_1=d_2\)

\(\therefore 对每一个d,满足条件的\varphi(\frac{n}{d})个a互不相同\)

想法来源:
要证\(\sum_{d|n}\varphi(d)=n\),由于\(\varphi(d)\)不方便拿一个代数式表示后加和,所以考虑从\(n\)入手,我们试着发现\([1,n]\)中每一个数与\(n\)的关系
然后我们不难发现$$\forall i\in [1,n],\gcd(\frac{i}{\gcd(i,n)},\frac{n}{\gcd(i,n)})=1$$
其中,\(\gcd(i,n)\)一定是\(n\)的因数,且\(\forall d|n,\exists i,使得\gcd(i,n)=d\)
可以考虑枚举\(\gcd(i,n)\),即\(d\),对于每一个\(d\),要使得\(\gcd(\frac{a}{d} ,\frac{n}{d})=1\)\(\frac{a}{d}\)就有\(\varphi(\frac{n}{d})\)种取法,同样地,\(a\)也就有\(\varphi(\frac{n}{d})\)种取法
接着按上面的证明过程走就行了

by yjx&lyk

实际上,性质1~5均可由性质6推出

求欧拉函数

若求单个数的欧拉函数,直接利用性质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;
		} 
	}
}

by lyk

posted @ 2024-06-29 11:12  班级账号  阅读(64)  评论(0)    收藏  举报