欧拉函数定义:对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。
此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质。
本人也是通过看别人的微博了解学习了欧拉函数:
写得非常详细:http://www.cnblogs.com/yefeng1627/archive/2013/01/02/2842492.html
简洁一点:http://blog.csdn.net/hillgong/article/details/4214327
我主要使用了欧拉函数直接公式推导完成程序,
显然,需要用是出发依次判断 sqrt(n) 内的所有素数是否含有n的因子,这样,则需要先生成sqrt(n) 的素数表但是其实不用这么麻烦:只需要每次找到一个素因子之后把它 “除干净”, 即可保证找到的因袭都是素数(想一想,为什么,很简单吧)
int euler_phi(int n)
{
int m=sqrt(n+0.5);
int ans=n;
for(int i=2;i<=m;i++){
if(n==1) break; //已经找到所有因子
if(n%i==0) //寻找素数因子
{
//ans=ans*(i-1)/i;
ans=ans/i*(i-1); //不容易溢出
while(n%i==0) n/=i; //把该素数因子除尽
}
}
if(n>1) ans=ans/n*(n-1); //最后n也是素数因子
return ans;
}
离线做法: 1-n中所有数的欧拉phi函数值,并不需要依次计算,
可以用与筛选法求素数非常类似的方法,在o(nloglogn)时间内计算完毕
void phi_table(int n,int *phi) //1-n所有数的欧拉phi函数值
{
//时间复杂度O(nloglongn)
//memset(phi,0,sizeof(phi)); //指针不能用这个初始化
for(int i=2;i<=n;i++) phi[i]=0;
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!phi[i])
for(int j=i;j<=n;j+=i)
{
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
互相学习,互相进步,如果觉得对你有帮助。
那就顶一下吧。鼓励一下我也好。谢谢