数论——欧拉函数讲解及模板

欧拉函数:对于任意正整数N,把小于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,称作对N的欧拉函数,记作φ(n)。注:互质为两者没有除1外的公因数。

规定φ(1)=1。

欧拉函数的性质:

1、若p为质数,则φ(p^{n})=p^{n-1}(p-1)φ(p^{n})=p^{n-1}(p-1)\varphi (p^{n})=p^{n-1}(p-1)

2、若a为质数且a|x,则\varphi (ax)=a\varphi (x)

2、若a与b互质,则\varphi (ab)=\varphi (a)\varphi (b)

求一个数的欧拉函数值:

对一个数进行质因数分解:X = p{_{1}}^{k_{1}}*p{_{2}}^{k_{2}}...p{_{n}}^{k_{n}}

由性质1可知

\varphi (X)=p{_{1}}^{k_{1}-1}*(p{_{1}}-1)*p{_{2}}^{k_{2}-1}*(p{_{2}}-1)...*p{_{n}}^{k_{n}-1}*(p{_{n}}-1)

          =X*(p{_{1}}-1)/p{_{1}}*(p{_{2}}-1)/p{_{2}}...*(p{_{n}}-1)/p{_{n}}

故代码如下:

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

与埃氏筛法相结合

int phi[maxn];
void init(int n) {
	for(int i=1;i<=n;++i) phi[i]=i;
	for(int i=2;i<=n;i++) {
		if(phi[i]==i){
			for(int j=i;j<=n;j+=i) phi[j]=phi[j]/i*(i-1);
		} 
	}
}

与欧拉筛相结合

int phi[maxn];
int prime[maxn],cnt;
int isnp[maxn];
void init(int n) {
	phi[1]=1; cnt=0;
	for(int i=2;i<=n;i++) 
		if(!isnp[i])
			prime[++cnt]=i,phi[i]=i-1;
		for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
			isnp[i*prime[j]]=1;
			if(i%prime[j]==0) {
				phi[prime[j]*i]=phi[i]*prime[j]; 
				break;
			} 
			else phi[prime[j]*i]=phi[i]*phi[prime[j]];
		}
			
} 

猜你喜欢

转载自blog.csdn.net/qq_44132777/article/details/109673133