欧拉函数

参考博客

欧拉函数:

定义:

欧拉函数是指 1N 中与 N 互质的数的个数,记为 φ(N)​。

φ(x)=i=1x[gcd(i,x)==1]

特别的 φ(1)=1

 

性质:

1.若 x 为质数, φ(x)=x1

质数除了他本身都与他互质。

2.n>1,1n 中与 n 互质的数的和为 n×φ(n)2

因为 gcd(n,x)==gcd(n,nx) ,所以与 x 不互质的数 x,nx 成对出现,平均值为 n2 ,所以与 n 互质的数的平均值也是 n2 ,而这样的数共有 φ(n) 个,故得性质2。

3.若 x=pk(p 为质数) ,则 φ(x)=(p1)×pk1

发现所有 p 的倍数都与 x 不互质,其他数都与 x 互质,而 p 的倍数共有 pk1 个(包括 x )。

φ(x)=pkpk1=(p1)×pk1

4.若 p,q 互质,则 φ(p×q)=φ(p)×φ(q) ,即欧拉函数为积性函数。

如果 ap 互质 (a<p)bp 互质 (b<q)cpq 互质 (c<pq) ,则 c 与数对 (a,b) 是一一对应的。

符合条件的 aφ(p) 种, bφ(q) 种, 则所对应的 (a,b) 数对有 φ(p)φ(q) 种。而符合条件的 cφ(pq) 种。

所以 φ(pq)=φ(p)×φ(q)

5.对于一正整数 x=p1c1×p2c2×...×pncn

φ(x)=x×i=1n(11pi)

证明:

φ(x)=i=1nφ(pici)=i=1npici1×(pi1)=i=1npici×(11pi)=xi=1n(11pi)

6.若 px 的质因数,则 φ(x×p)=φ(x)×p

x×p 的质数集合 pi,与 x 的质数集合相比没有变化。

φ(x×p)=x×p×i=1n(11pi)=x×i=1n(11pi)×p=φ(x)×p(p[pi])

7.若质数 p 不是 x 的因数,则 φ(x×p)=φ(x)×(p1)

φ(x×p)=φ(x)×φ(p)=φ(x)×(p1)

dnφ(d)=n

f(n)=dnφ(d)

f(a×b)=dabφ(d)

gcd(a,b)=1 时: gcd(dia,dib)=1

dabφ(d)=daφ(d)×dbφ(d)

f(a×b)=f(a)×f(b)

f(pm)=fpmφ(d)=i=0mφ(pi)=1+i=0m1(p1)×pi(p 为质数)
              =1+(p1)×(1+p++pm1)
              =1+(p1)×1pm1p=pm

f(pm)=pm

f(n)=f(i=1npici)=i=1nf(pici)=i=1npici=n

dnφ(d)=n

 

代码:

1.求解单个欧拉函数:利用性质 5 ,时间复杂度 O(n)

代码
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;
}

 

  1. 埃氏筛求 1n的欧拉函数值,时间复杂度 O(nlogn)
代码
void found_euler(int n) {
	for(int i=1; i<=n; ++i) phi[i] = i;
	for(int i=2; i<=n; ++i) {
		if(phi[i] == i) { // i为质数 
			for(int j=i; j<=n; j+=i) // 给包含质因子i的数字,乘上 (1-1/i) 
				phi[j] = phi[j]/i*(i-1); 
		}
	}
} 

 

3.欧拉筛求 1n 的欧拉函数值,时间复杂度 O(n)

代码
int phi[N],pr[N],cnt;
bool vis[N];
void init(){
	int n=1e5+50;
	phi[1]=1; 
	for(int i=2;i<=n;i++){
		if(!vis[i]){pr[++cnt]=i,phi[i]=i-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;
		} 
	}
}

 

GCD SUM

i=1nj=1ngcd(i,j)

原式可化为

=i=1nj=1ndgcd(i,j)φ(d)=i=1nj=1nd=1nφ(d)[di][dj]=d=1nφ(d)i=1nj=1n[di][dj]=d=1nφ(d)nd2

 

GCD

给定正整数 n1x,yn&&gcd(x,y)prime 的数对有多少。

=pprimei=1nj=1n[gcd(i,j)=p]=pprimei=1npj=1np[gcd(i,j)=1]=pprime(i=1np(2×j=1i[gcd(i,j)=1])1)=pprime(2i=1npφ(i)1)

 

Longge 的问题

i=1ngcd(i,n)

=i=1ngcd(i,n)=dnd×i=1n[gcd(i,n)=d]=dnd×i=1nd[gcd(i,nd)=1]=dnd×φ(nd)

 

posted @   programmingysx  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示