欧拉函数的要点:(对于正整数n,φ(n)是小于或等于n的正整数中,与n互质的数的数目)
1.若p是质数,φ(p)= p-1.
2.若n是质数p的k次幂,φ(n)= (p-1)p^(k-1) 即 φ(n) = pk - pk -1
3.欧拉函数是积性函数,若m,n互质,φ(mn)= φ(m)φ(n)
然后是欧拉函数的代码实现:
int eular(int n)
{
int sum=1;
for(int i=2;i<n;++i)//首先从2开始循环(2是素数)
{
if(n%i==0)
{
n/=i;
sum*=i-1;
while(n%i==0)
{
n/=i;//始终保持i为质数
sum*=i;//注意欧拉函数的性质2.。。。。(幂的问题)
}
}
}
if(n>1)//如果n本身是素数将会跳过上述循环
sum*=n-1;
return sum;
}
也可以稍作修改:
int eular(int n)
{
int sum=1;
for(int i=2;i<=n;++i)//首先从2开始循环(2是素数)
{
if(n%i==0)
{
n/=i;
sum*=i-1;
while(n%i==0)
{
n/=i;//始终保持i为质数
sum*=i;//注意欧拉函数的性质2.。。。。(幂的问题)
}
}
}
return sum;
}
或者:
int eular(int n)
{
int sum=1;
for(int i=2;i<=sqrt(n);++i)//首先从2开始循环(2是素数)
{
if(n%i==0)
{
n/=i;
sum*=i-1;
while(n%i==0)
{
n/=i;//始终保持i为质数
sum*=i;//注意欧拉函数的性质2.。。。。(幂的问题)
}
}
}
if(n>1)//如果n本身是素数将会跳过上述循环
sum*=n-1;
return sum;
}
可能数大的话运行时间略有区别