欧拉函数ph(n)的意思是全部小于n且与n互质的个数。
比方说ph(10) = 4{1,,3,7,9与12互质}
欧拉公式 : a^ph(m) = 1(mod m);
代码实现:
//筛选法打欧拉函数表
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<algorithm> using namespace std; #define Max 1000001 int euler[Max]; void Init(){ euler[1]=1; for(int i=2;i<Max;i++) euler[i]=i; for(int i=2;i<Max;i++) if(euler[i]==i) for(int j=i;j<Max;j+=i) euler[j]=euler[j]/i*(i-1); //先进行除法是为了防止中间数据的溢出 } int main() { int n; Init(); for(int i=1;i<20;i++) { printf("euler[%d] = %d ",i,euler[i]); } return 0; }
直接求解欧拉函数
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> using namespace std; //直接求解欧拉函数 int oula(int n){ //返回euler(n) int res=n,a=n; for(int i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; } /* int oula(int n) { int ret = 1; for(int i=2;i*i<=n;i++) { if(n%i == 0) { n/=i; ret *= i-1; while(n%i == 0) { n/=i; ret *= i; } } } if(n>1) { ret *= n-1; } return ret; } */ int main() { int n; printf("请输入要查询互质个数的数字 "); while(scanf("%d",&n)!=EOF) { int ans = oula(n); printf("%d的结果为:%d ",n,ans); printf("请输入要查询互质个数的数字 "); } return 0; }