2^x mod n = 1(欧拉定理,欧拉函数,快速幂乘)

2^x mod n = 1

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9231    Accepted Submission(s): 2837


Problem Description
Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1.
 

 

Input
One positive integer on each line, the value of n.
 

 

Output
If the minimum x exists, print a line with 2^x mod n = 1.

Print 2^? mod n = 1 otherwise.

You should replace x and n with specific numbers.
 
思路:
1. 当n为偶数时,bn + 1(b为整数)是奇数,而2^x是偶数,故 2^x mod n = 1不可能成立;
2. 当n等于1时,不能成立
3. 当n为非1的奇数时,n和2互质,由欧拉定理:若a,n为正整数,且两者互素,则a^phi(n) mod n = 1,其中phi(n)是n的欧拉函数。知2^phi(n) mod n = 1.因此phi(n)必是符合要求的x,但phi(n)未必是最小的,遍历小于其的正整数,逐一试验即可,计算2^x mod n时用快速幂乘。
 
AC Code:
 1 #include <iostream>
 2 #include <vector>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <cstring>
 6 using namespace std;
 7 
 8 //计算n的欧拉函数
 9 int Eular(int n)
10 {
11     int res = 1, i;
12     for (i = 2; i * i <= n; i++){
13         if (n % i == 0){
14             n /= i;
15             res *= (i - 1);
16             while (n % i == 0){
17                 n /= i;
18                 res *= i;
19             }
20         }
21     }
22     if (n > 1) res *= (n - 1);
23     return res;
24 }
25 
26 //快速幂乘计算2^b % n
27 int myPow(int b, int n)  
28 {
29     if(b == 0) return 1;
30     long long c = myPow(b >> 1, n);
31     c = (c * c) % n;
32     if(b & 1) c = (2 * c) % n;
33     return c;
34 }
35 
36 int main()
37 {
38     int n, x;
39     bool ok;
40     while(scanf("%d", &n) != EOF){
41         ok = 0;
42         if((n & 1) && (n - 1)){
43             ok = 1;
44             int phi = Eular(n);
45             for(x = 1; x < phi; x++){
46                 if(myPow(x, n) == 1) break;
47             }
48         }
49         if(ok) printf("2^%d mod %d = 1\n", x, n);
50         else printf("2^%? mod %d = 1\n", n);
51     }
52     return 0;
53 }

 

 

posted on 2013-08-23 11:22  铁树银花  阅读(3542)  评论(0编辑  收藏  举报

导航