什么是欧拉函数
记欧拉函数为\(\varphi(x)\)表示比\(x\)小且与\(x\)互质的数的个数。
怎么算欧拉函数
通项公式:\(\varphi(x)=x*\prod(1-\frac{1}{p_i})\) (\(p_i\)为\(x\)的质因数)
因为欧拉函数是一个积性函数,因此我们可以用欧拉筛(线性筛)在\(O(n)\)的时间内预处理出来:具体证明请见后文
void GetPrime()
{
memset(IsPrime,1,sizeof IsPrime);
IsPrime[1]=false;
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(IsPrime[i]==true)
prime[++prime_tot]=i,phi[i]=i-1;
for(int j=1;j<=prime_tot and i*prime[j]<=n;j++)
{
IsPrime[i*prime[j]]=false;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];//性质二
break;
}
phi[i*prime[j]]=phi[i]*phi[prime[j]];//性质一
}
}
}
欧拉函数的性质
- 欧拉函数是一个积性函数,因此我们有若\(gcd(p,i/p)=1\),则\(\varphi(i)=\varphi(i/p)*\varphi(p)\)
(我不会证) -
若\(gcd(p,i/p)!=1\),且\(p\)为质数,则\(\varphi(i)=\varphi(i/p)*p\)
证明:
因为\(gcd(p,i/p)!=1\)而且\(p\)为质数,所以\(i\)一定由至少两个\(p\)组成。
所以说\(\varphi(i/p)=\varphi(i)/p\)(因为对累乘没有影响,只对最前面的\(x\)有影响(\(x\)指的是通项式中的\(x\)))
证毕