欧拉函数定义
在数论,对正整数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)。
因此我们可以通过线性筛来快速求出欧拉函数。