然后就得到了百度百科的那个通式: phi(x)=x*(1-1/p1)…(1-1/pn);
所以任何一个数,只需要分解质因数,把每个p^k都乘起来就是这个数的欧拉函数值了。在C++中这样表达:
int phi(int n){ int m=(int)sqrt(n+0.5);//筛质数的上界 int ans=n; for(int i=2;i<=m;i++) if(n&i==0){//找到n的质因数i ans=ans/i*(i-1); while(n%i==0) n/=i;//一直把n除到没有因数i为止 } if(n>1) ans=ans/n*(n-1);//phi(1)=1,so... return ans; }筛法:
int phi_table(int n){ for(int i=1;i<=n;i++) phi[i]=0; phi[1]=1;//特别定义 for(int i=2;i<=n;i++) if(!phi[i]){ for(int j=1;j<=n;j+=i){ if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } } }好难啊!完全不会!
转载于:https://www.cnblogs.com/leotan0321/p/6081392.html