欧拉函数的两种实现

来源:互联网 发布:ubuntu 分辨率不能调 编辑:程序博客网 时间:2024/04/29 01:21

欧拉函数的定义和性质:点击打开链接

1、求n的欧拉函数值
<span style="font-size:18px;">int Euler(int n){//求n的欧拉函数 O(n) int r = n;for(int i = 2;i <= n;i ++){if(n % i==0){while(n % i == 0)n/=i;r = r * (i-1 ) / i;}}return r;}</span>

2、求1~n的欧拉函数值
当n为素数是,n的欧拉函数值为n-1;
若n不是素数,则假设:
n = p1^r1 * p2^r2 * …… * pn^rn;
记n=n1*n2,其中
n1=p1^r1 * p2^r2 * …… * pi^ri;
n1=p(i+1)^r(i+1) * p(i+2)^r(i+2) * …… * pn^rn;
因为:若m,n互质, 
所以:欧拉函数值(n) = 欧拉函数值(n1)*欧拉函数值(n2);
简单起见,令
n1=p1^r1;
n2= p2^r2 * p3^r3 *…… * pn^rn;
实现如下
#define N 1000000int minP[N],o[N];//minP[]为最小素因子,o[]为欧拉函数值 void Euler(){//1~N之间每个数的欧拉函数 int a,b;o[1] = 1; //初始化minP[] for(int i = 2;i <= N;i ++){if(minP[i] == 0){//i为素数 for(int j=i*2;j <= N;j += i){if(minP[j]==0)minP[j] = i;}}}for(int i = 2;i <= N;i ++){if(minP[i]==0) {o[i] = i-1;}else{a = i / minP[i];b = minP[i];while(a% minP[i] == 0){a /= minP[i];b *= minP[i];}if(a == 1) o[i] = i / minP[i] * (minP[i] - 1);else o[i] = o[a]*o[b];}}} 





0 0
原创粉丝点击