首先,欧拉函数,干啥的
求点赞求点赞求点赞~
定义
在数论,对正整数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)