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

欧拉函数

时间:2016-07-13 15:17:41      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

欧拉函数

定义:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) 

比如:n = 8 时,有 1,3,5,7 与它互质,所以 φ(8) = 4

函数计算公式:φ(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn) ,其中p1,p2,...,pn位n的质因子

易知,如果n为质数,一定有 φ(n) = n-1

函数的几个性质:

1、φ(1)=1

2、φ(pk)=pkpk1=(p1)pk1,其中p为质数

3、φ(mn)=φ(m)φ(n),其中gcd(m,n)=1

欧拉定理

   若技术分享为正整数,且技术分享互素(即技术分享),则 技术分享 。

   换种说法就是 a^ φ(n) % n 恒等于 1. 

      特别的,当n是质数的时候,上式就变成了技术分享 ,它也叫费马小定理,但它是个单向定理,不能用这个同余证n是质数。

原根

技术分享时,定义技术分享对模技术分享的指数 技术分享  为使 技术分享 成立的最小的正整数技术分享。由欧拉定理知 技术分享 一定小于等于 技术分享 ,

技术分享,则称技术分享是模技术分享的原根。

m的原根个数正好为φ(φ(m)) (在m是素数情况下进一步知原根的个数是φ(m-1) )

例:poj-1284  http://poj.org/problem?id=1284

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 #define N 1000005
 7 int p[N];
 8 void fun(){ //素数表
 9     int i, j, k;
10     memset(p, 0, sizeof(p));
11     p[1] = 1;
12     for(i=2; i<=sqrt(N); i++){
13         for(j=2; j<=N/i; j++){
14             p[i*j] = 1;
15         }
16     }
17 }
18 int oula(int n){
19     int i, j, r, a;
20     r = n;
21     a = n;
22     for(i=2; i<=sqrt(n); i++){
23         if(!p[i]){
24             if(a%i==0){
25                 r = r/i * (i-1);
26                 while(a%i==0)
27                     a /= i;
28             }
29         }
30     }
31     if(a>1)
32         r = r/a*(a-1);
33     return r;
34 }
35 
36 int main(){
37     int n;
38     while(cin>>n){
39        // cout<<oula(oula(n))<<endl; //一般情况
40         cout<<oula(n-1)<<endl; //n为奇素数时
41     }
42     return 0;
43 }

 

欧拉函数

标签:

原文地址:http://www.cnblogs.com/wudi-accept/p/5666664.html

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