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

欧拉函数:对于任意正整数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]];
		}
			
} 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值