通式:
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D344/sign=da2dc03b1a950a7b713548c03ed1625c/6a600c338744ebf88c69ff32def9d72a6059a7a7.jpg)
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(唯一和1
互质的数(小于等于1)就是1本身)。
注意:每种质因数只一个。 比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
若n是质数p的k次幂,
,因为除了p的倍数外,其他数都跟n互质。
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D211/sign=8a21a419ac18972ba73a07cbd7cd7b9d/f9198618367adab410da834e8cd4b31c8701e4b1.jpg)
设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值
φ:N→N,n→φ(n)称为欧拉函数。
欧拉函数是
积性函数——若m,n互质,
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D140/sign=daa516337cec54e745ec1e1a89399bfd/bd3eb13533fa828b5d8406eefa1f4134970a5a1c.jpg)
特殊性质:当n为奇数时,
, 证明与上述类似。
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D96/sign=52a5c55ef1246b607f0ebe72eaf8e29d/8cb1cb134954092331f8f8739558d109b3de492e.jpg)
若n为质数则
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D85/sign=31100df17bd98d1072d40134203fd0be/a5c27d1ed21b0ef404180353dac451da80cb3ece.jpg)
摘自百度百科。
原理是这样的,但是实现过程中会有精度问题。
然后,用递归写法比较高大上而且解决了直接用公式的精度问题
int oula(int n,int mod,int s)
{
if(n%mod==0) s-=s/mod;//其实就是上述式子的展开运算
while(n%mod==0) n/=mod;//这一步寻找质因子。
if(mod*mod>=n)
{
if(n>1) return s-s/n;//n是最后一个质因子。
else return s;//1不是质数。所以最后剩下1的时候直接返回现在的和,s
}
return oula(n,mod+1,s);
}