欧拉函数和欧拉定理

1)对于素数p,φ(p) = p-1;

2)两个不同的素数p,q ,n=p*q
     φ(n)= φ(p)* φ(q)=(p-1)*(q-1)

3)互质的正整数a和n,有a^φ(n)≡1 mod n

费马小定理:若正整数 a 与素数 p 互质,则有 a^(p – 1) ≡ 1 mod p 。

因为 φ(p) = p -1

4)当b是素数,a%b=0,则:

φ(ab)= φ(a) *b

5)p为素数,那么φ(p^k)=p^k – p^(k-1)

欧拉函数的两种求法:

1) φ(n)= n(1-1/p1)(1-1/p2)...(1-1/pn)

int euler_phi(int n)
{
	int m=(int)sqrt(n+0.5);
	int ans=n;
	for(int i=2;i<=m;i++)
	if(n%i==0) {
		ans=ans/i*(i-1);
		while(n%i==0) n/=i;
	}
	if(n>1) ans=ans/n*(n-1);
	return ans;
}

因为前后项有关系,所以可以快速打表:小于n且与n互素的整数个数(欧拉函数)的计算

2) 递推法, 根据上面定理4,2:
质数p满足p|x,若p2|x,则φ(x)=φ(x/p)*p,若p2|x不成立 则φ(x)=φ(x/p)*(p-1)
(1)若p2|x不成立, 因x/p和p互质,故: φ(x)=φ(x/p)*φ(p)=φ(x/p)*(p-1)

(2)若p2|x, 因 p|(x/p)且p是质数,故 φ(x) = φ(x)=φ(x/p)*p

int euler_phi(int n)
{
	int res=1;
	for(int i=2;i*i<=n;i++)
	if(n%i==0) {         //说明i|n
		n/=i,res*=i-1;
		while(n%i==0) n/=i,res*=i;  //说明i^2|n
	}
	if(n>1) res*=n-1;
	return res;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值