欧拉函数

题目

题目

最近两天学了欧拉函数
深刻感觉自己消元的技巧好差,什么是欧拉函数?\(φ(n)\) 表示1-n-1中所有与n互质的数 比如 φ(3)=2 φ(4)=2

第一个 如果n是素数 φ=n-1

如果gcd(a,b)=1,有\(φ(a*b)=φ(a)*φ(b)\)

gcd(a+mb,b)=gcd(a,b) //辗转相除
gcd(a,b)=d ---> gcd(a/d,b/d)=1

d|n ---> n=kd n可以被d整除

φ ( p^ k) = (p-1) * p ^( k-1 )

记住 这个与次数无关!!!

由此可以得出一个试除法求欧拉函数 还是比较好用的

int phi(int n) {
	int res = n;
	for (int i = 2; i * i <= n; i++) {
		if (n % i == 0) {
			res = res * (i - 1) / i;
			while (n % i == 0)n /= i;
		}
	}
	if (n > 1)res = res * (n - 1) / n;
	return res;
}

下面介绍线性求法

由于董老师讲的太好了 我只好挪用过来了

对于第一个情况 如果能被整除 说明了i包括了其所有的质因子,当然也包括了PrimeJ,
第二张情况就是互质了 很简单
每个合数都是被最小质因子筛掉的

void euler()
{
	//m*sk1=pj*i i有所有的质因子 
//	memset(isprime,true,sizeof isprime);
	isprime[1]=1;
//
	for(int i=2;i<=n;i++)
	{
		if(!isprime[i])
		{
			prime[++cnt]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
		{
			isprime[i*prime[j]]=1;			
			if(i%prime[j]==0)
			{	
			phi[i*prime[j]]=prime[j]*phi[i];	
			break;	
			}
			else {
				//fa(pj*i)=fa(m )
				phi[i*prime[j]]=(prime[j]-1)*phi[i];
			}
		}	
	}
}
posted @ 2025-04-16 19:56  LteShuai  阅读(18)  评论(0)    收藏  举报