一、欧拉函数概念
欧拉函数,是表示1~n中与n互质的元素的个数,记为\(φ(n)\)。
二、性质
- 如果n为某一素数p,显然\(φ(p)\)为p-1
- 如果n为某一素数的幂次,那么: $$\phi(pa)=(p-1)*p {a-1}$$
我们可以来推导次函数的求法
我们先将n分解质因数得:
因为φ(n)求的是与n互质的数的个数,所以其中不能有n的因数,即不能出现a1,a2,a3……ak的倍数。
那么我们来转换思路,n个数之中存在多少个a1的倍数,多少个a2的倍数……多少个ak的倍数呢?
显然有n/a1个a1的倍数,n/a2个a2的倍数……有n/ak个ak的倍数。
所以\(φ(n)=n-\frac{1}{a1} -\frac{1}{a2}-\frac{1}{a3}-……-\frac{1}{ak}\)
将n提取出来得到:
于是欧拉函数的公式就这么推导出来了
还有如下性质:
-
如果i mod p=0,那么\(φ(i*p)=p*φ(i)\)
证明:
对于公式$$φ(1)=n(1-\frac{1}{a1})(1-\frac{1}{a2})(1-\frac{1}{a3})……*(1-\frac{1}{ak})$$
得到\[φ(n)=n*p*(1-\frac{1}{a1})*(1-\frac{1}{a2})*(1-\frac{1}{a3})*……*(1-\frac{1}{ak}) \]因为p已经是i的因数,后半部分不需要添加
因此得证。 -
函数的积性,\(φ(i*j)=φ(i)*φ(j)\)
-
如果i mod p≠0,那么\(φ(i*p)=φ(i)*(p-1)\)
根据
得到
因为p不是i的因数,因此最后要加上\((1-\frac{n}{ak})\)部分。
证明完成。
三、求法
下面给两种求法。
\(1\).公式法
根据公式\(φ(n)=n*(1-\frac{1}{a1})*(1-\frac{1}{a2})*(1-\frac{1}{a3})*……*(1-\frac{1}{ak})*(1-\frac{1}{p})\)
inline LL eular(LL x)
{
LL sum=x,y=x;
for (LL i=2;i*i<=y;++i)
{
if (x%i!=0) continue;
sum=sum/i*(i-1);
while (x%i==0) x/=i;
}
if (x>=2) sum=sum/x*(x-1);
return sum;
}
//公式求x欧拉函数
\(2\).线性筛求欧拉函数
根据三条性质推导即可。
线性筛中每一个数字最多只会被筛一次,因此正好可以对每一个数字求欧拉函数。
线性筛正好是由小的数字筛到大的数字 or 正好是指数
前者用后两条性质 后者用第一条性质即可。
三条性质如下:
- 如果n为某一素数的幂次,那么: \(\phi(p^a)=(p-1)*p^ {a-1}\)
- 如果i mod p=0,那么\(φ(i*p)=p*φ(i)\)
- 如果i mod p≠0,那么\(φ(i*p)=φ(i)*(p-1)\)
inline void findphi(void)
{
phi[1]=1,prm[1]=0;
for (LL i=2;i<=n;++i)
{
if (!v[i]) { prm[++cnt]=i, phi[i]=i-1; }
for (LL j=1;j<=cnt && i*prm[j]<=n;++j)
{
v[i*prm[j]]=1;
if (i%prm[j]==0) { phi[i*prm[j]]=phi[i]*prm[j]; break; }
if (i%prm[j]!=0) phi[i*prm[j]]=phi[i]*(prm[j]-1);
}
}
return;
}
后记
部分参考hkh大佬的博客。
在此表示感谢!
如有纰漏请读者指正!
<\font>