一:引入:
给定任意正整数X,求小于或等于X的正整数中,与X互质的数的个数,而求这些个数的方法即为欧拉函数。设φ(n)为欧拉函数,则其公式为:
φ(n)=n(1−1/X1)(1−1/X2)…(1−1/Xn)
(n可以用若干个质数的幂相乘表示,而X则为质数)
二:证明:
(1)当n为1时:
φ(1)=1;
(2)当n为质数时:
φ(n)=n-1 因为质数与小于其的数均互质,因此为n-1;
(3)当n为质数时:
φ(pk)=pk−pk-1 原因:因为p为质数,只有当某个数不包括p时,才可能与其互质,由于包含p的数有(1*p,2*p,3*p,........,pk-1*p)即pk-1个数,所以将它们减掉,剩下的就是和pk互质的数
(4)当n可以用质数表示时:
一:当n可以用若干个质数相乘时,例:φ(n)=φ(p1*p2)=φ(p1)*φ(p2);
二:因为任意一个数都可以用若干个质数的幂相乘表示,即n=p1x1*p2x2.....
此时,φ(n)=φ(p1x1)*φ(p2x2),因为p为质数,所以φ(px)=px-px-1,由此可得:
φ(n)=p1x1*(1-1/p1)*p2x2*(1-1/p2)因为p1x1*p2x2=n,所以φ(n)=n*(1-1/p1)*(1-1/p2).
由此衍生出总公式:φ(n)=n(1−1/X1)(1−1/X2)…(1−1/Xn)
三:代码实现:
相信只要能看懂我的鬼画符式的解释应该就可以敲出来了,我先抛砖引玉:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x;
cin>>x;
while(x--)
{
int n;
cin>>n;
int res=n;
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
res=res/i*(i-1);
while(n%i==0)n/=i;
}
if(n>1)res=res/n*(n-1);
cout<<res<<endl;
}
}