[数论]欧拉函数两种写法

欧拉函数定义

在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。

φ(x)=x*(p1-1/p1)*(p2-1/p2)*....*(pn-1/pn);

其中p1, p2……pn为x的所有质因数,x是不为0的整数。

第一种

long long phi(long long x)
{
	long long ti=0,aw=x;
	fo(i,2,x)
	{
		if(x%i==0)
		{
			pri[++ti]=i;
			while(x%i==0)
				x/=i;
		}
	}
	fo(i,1,ti)
		aw=aw*(pri[i]-1)/pri[i];
	return aw;
}

没什么好解释的。

第二种

long long Phi()
{
	phi[1]=1;
	fo(i,2,k)
	{
		if(!phi[i])
		{
			pri[++tot]=i;
			phi[i]=i-1;
		}
		fo(j,1,tot)
		{
			if(i%pri[j]==0)
			{
				phi[i*pri[j]]=phi[i]*pri[j];
				break;
			}
			else
				phi[i*pri[j]]=phi[i]*phi[pri[j]];
		}
	}
}

第二种显然比第一种要快,其中数组phi[i]为φ(i),k表示我们要求的区间上限。我们可以用这种方法快速求出1~k的欧拉函数值。

第二种证明

对于一个质数x,φ(x)=x-1。而对于一个合数y,φ(y)=y*(p1-1/p1)*(p2-1/p2)*....*(pn-1/pn);

那么对于φ(x*y),如果x为y的一个质因子,

φ(x*y)=y*x*(p1-1/p1)*(p2-1/p2)*....*(pn-1/pn)

如果x不为y的质因子

φ(x*y)=y*x*(p1-1/p1)*(p2-1/p2)*....*(pn-1/pn)*(x-1/x)=y*(p1-1/p1)*(p2-1/p2)*....*(pn-1/pn)*x*(x-1/x)

=y*(p1-1/p1)*(p2-1/p2)*....*(pn-1/pn)*(x-1)=y*(p1-1/p1)*(p2-1/p2)*....*(pn-1/pn)*phi(x)。

因此我们可以通过线性筛来快速求出欧拉函数。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值