码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉函数

时间:2015-09-07 22:38:52      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:

欧拉函数Euler(x)

Euler(n)表示1-n之间与n互质的个数,例如Euler(4) = 2,其中1和3与4互质。(数论里面规定Euler(1) = 1,并且1与任何数互质)。

欧拉函数的通项表达式为:

技术分享

还有其一些推论:

技术分享

当n >= 1时,1 - n中与n互质的整数和为nEuler(n)/2;

那欧拉函数怎么求呢?

首先我们再来学习下一个概念:积性函数。

函数f(x)对于任意正整数a, b,如果a,b互质并且满足f(ab) = f(a)f(b),则f(x)为积性函数。其中若a,b不互质仍满足f(ab) = f(a)f(b)则称f(x)为完全积性函数。

技术分享

对于一个数n和他的约数p:

技术分享

对于任意一个正整数n, 均有:

技术分享

再根据积性函数的性质得:

技术分享

也就是先预处理使Euler[i] = i,再去考虑能被n的质因数,只要把其中一个质因数p改成p - 1即可。

附上伪代码:

const int N = 1000000 + 5;

int euler[N];

void euler_function(){
    for(int i = 0; i <= N - 5; i ++) euler[i] = i;
    for(int i = 2; i <= N - 5; i ++)
        if(euler[i] == i)
            for(int j = 1; i * j <= N - 5; j ++) 
                euler[i * j] = euler[i * j] / i * (i - 1);
}

 当然,上述算法(类似于埃式筛法)的复杂度为(n + nloglogn)。

然后我们再想想筛选素数的方法除了埃式筛法,还有更快速的线筛(素数筛选传送门

技术分享

技术分享

附上代码:

技术分享
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 1000000 + 5;
 6 
 7 int n;
 8 
 9 int check[N], euler[N], prime[N];
10 
11 void euler_function(){
12     memset(check, 0, sizeof(check));
13     euler[1] = 1;
14     int tot = 0;
15    for(int i = 2; i <= N - 5; i ++){
16         if(!check[i]){
17             prime[tot ++] = i;
18             euler[i] = i - 1;
19         }
20         for(int j = 0; j < tot; j ++){
21             if(i * prime[j] > N - 5) break;
22             check[i * prime[j]] = 1;
23             if(i % prime[j] == 0){
24                 euler[i * prime[j]] = euler[i] * prime[j];
25                 break;
26             }
27             else euler[i * prime[j]] = euler[i] * (prime[j] - 1);
28         }
29     }
30 }
31 
32 int main(){
33     euler_function();
34     while(scanf("%d", &n) == 1)printf("%d\n", euler[n]);
35     return 0;
36 }
View Code

 

 参考论文 :http://www.docin.com/p-687551303.html

欧拉函数

标签:

原文地址:http://www.cnblogs.com/zyf0163/p/4789867.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!