首页 > 技术文章 > 数学 欧拉函数相关

wangxiaodai 2018-11-05 09:37 原文

欧拉函数相关

1,\(phi(i)\)表示在1到i的数中与i互质的数的个数。

2,\(O(\sqrt{n})\)\(phi\)

​ 算数基本定理:

\[phi(i)=i*(p_1-1)/p_1*(p_2-1)/p_2*……*(p_k-1)/p_k \]

​ 枚举质因数套公式即可:

​ code:

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

3,线性筛欧拉函数

​ 1,如果当前数是质数,易知:

\[phi(i)=i-1 \]

​ 2,如果当前数取模枚举的质数不等于零,则:

\[phi(i*prime[j])=phi(i)*phi(prime[j]) \]

​ 3,如果当前数取模枚举的质数等于零,则:

\[phi(i*prime[j])=phi(i)*prime[j] \]

开始愉快地写代码:

void Euler_phi(){
	memset(isprime,1,sizeof isprime);
	phi[1]=1; 
	for(int i=2;i<=n;i++){
		if(isprime[i]){
			phi[i]=i-1; prime[++tot]=i;
		}
		for(int j=1;j<=tot&&i*prime[j]<=n;j++){
			isprime[i*prime[j]]=0;
			if(i%prime[j]!=0){
				phi[i*prime[j]]=phi[i]*phi[prime[j]];
			}
			else{
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
		}
	}
}

推荐阅读