超级详细 线性筛(欧拉筛)+ 欧拉函数(积性函数)(OlaOlaOlaOla)

首先,欧拉函数,干啥的

求点赞求点赞求点赞~

定义

在数论,对正整数n,欧拉函数是小于等于n的正整数中与n互质的数的数目.

那么求欧拉函数值的公式是啥呢?如下。

怎么理解?我们不妨举个栗子:

如果我们要求 1~n中与n互质的数的个数,其实就是求(n-与n不互质的数的个数)

我们知道n的质因数仅有p1和p2,那么如果要求 与n不互质的数的个数, 就是求1-n中p1的倍数的数的个数 (即n*1/p1)+ p2的倍数的数的个数(n*1/p2), 但是这时候发现p1*p2的倍数的数的个数被重复算了一次,那么就需要减掉,即 n*1/(p1*p2).

与n不互质的数的个数就是 n*1/p1 + n*1/p2 - n*1/(p1*p2),

与n互质的数的个数就是

n-n*1/p1 -n*1/p2 + n*1/(p1*p2)

=n*(1-1/p1-1/p2+1/(p1*p2))

=n*(1-1/p1)(1-1/p2)

可以理解上面的公式啦~

欧拉函数的一些性质(主要是和积性函数有关的)

若x为质数,那么φ(x)=x-1

 线性欧拉筛求欧拉函数

接下来来看一看代码(具体啥意思我都写在注释里了没看懂或有错请及时告知哈哈哈)

void PHI()
{
	phi[1]=1;//初始化
    for(int i=2;i<=n;i++)
	{
		if(!flag[i]) //flag为记录i是否为质数的标记
            prime[++cnt]=i,phi[i]=i-1;//i放入prime容器;第二句参见性质1
		for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
		{
			flag[i*prime[j]]=1;//掷flag
			if(i%prime[j]==0)//性质4
			{
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			else //性质3
                phi[i*prime[j]]=phi[i]*phi[prime[j]];
		}
	}
} 

欧拉函数差不多就是这样子

它是一个不完全积性函数,仅仅在m与n互质的情况下,φ(m·n)才等于φ(m)·φ(n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值