欧拉φ函数

定义

1 1 1~ N N N中与 N 互质的数的个数叫欧拉函数,记为 φ ( N ) φ ( N ) φ(N)

对 N 分解质因数 N = p 1 c 1 ∗ p 1 c 1 ∗ . . . ∗ p k c k N=p_1^{c_1}*p_1^{c_1}*...*p_k^{c_k} N=p1c1p1c1...pkck
则有 φ ( N ) = N ∗ ( 1 − 1 p 1 ) ∗ ( 1 − 1 p 2 ) ∗ . . . ∗ ( 1 − 1 p k ) \varphi(N)=N*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*...*(1-\frac{1}{p_k}) φ(N)=N(1p11)(1p21)...(1pk1)
特别的 φ ( 1 ) = 1 \varphi(1)=1 φ(1)=1


推导

首先显然 1 1 1~ N N N中与 N N N互质的数就是 1 − N 1 − N 1N中不与 N N N含有相同质因子的数

那么先简单分析 N 只有两个质因子的情况,假设 p , q p,q p,q为 N的质因子,那么 1~ N 中p的倍数有 N p \frac{N}{p} pN 个,q的倍数有 N q \frac{N}{q} qN
我们自然要筛掉这些数 : N − N p − N q N-\frac{N}{p}-\frac{N}{q} NpNqN
但是注意到这里面 p*q的倍数被减了两次,根据容斥原理,当然还要加回来得 : N − N p − N q + N p q N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq} NpNqN+pqN

对这个式子稍作变换
N − N p − N q + N p q N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq} NpNqN+pqN

N ∗ ( 1 − 1 p − 1 q + 1 p q ) N*(1-\frac{1}{p}-\frac{1}{q}+\frac{1}{pq}) N(1p1q1+pq1)

N ∗ ( 1 − 1 p ) ∗ ( 1 − 1 q ) N*(1-\frac{1}{p})*(1-\frac{1}{q}) N(1p1)(1q1)


实现

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

利用线性筛递推求解φ需要用到欧拉函数的两个性质

  1. 若有 p ∣ N p∣N pN,且满足 p 2 ∣ N , 则 φ ( N ) = φ ( N / p ) ∗ p p^2\mid N,则 φ ( N ) = φ ( N / p ) ∗ p p2Nφ(N)=φ(N/p)p
  2. 若有 p ∣ N p ∣ N pN,且一定不满足 p 2 ∣ N p^2\mid N p2N,则 φ ( N ) = φ ( N / p ) ∗ ( p − 1 ) φ ( N ) = φ ( N / p ) ∗ ( p − 1 ) φ(N)=φ(N/p)(p1)

》》证明

线性筛中每个合数n只会被他的最小质因子p筛一次
于是我们利用这点从 φ ( N / p ) φ ( N / p ) φ(N/p)递推到 φ ( N ) φ ( N ) φ(N)

phi[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!v[i])
		{
			zhi[++cnt]=i;
			phi[i]=i-1;
		}
		for(int j=1;i*zhi[j]<=n&&j<=cnt;j++)
		{
		 	v[i*zhi[j]]=1;
		 	if(i%zhi[j]==0)
		 	{
		 		phi[i*zhi[j]]=phi[i]*zhi[j];
			 }
			 else phi[i*zhi[j]]=phi[i]*(zhi[j]-1);
		}
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值