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

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

规定φ(1)=1。

欧拉函数的性质:

1、若p为质数,则

2、若a为质数且a|x,则

2、若a与b互质,则

求一个数的欧拉函数值:

对一个数进行质因数分解:

由性质1可知

         

故代码如下:

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]];
		}
			
} 

 

你可能感兴趣的:(算法,数论,欧拉函数)