poj 2417 && poj3243(Baby-Step Giant-Step)
Discrete Logging
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 4624 | Accepted: 2113 |
Description
Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarithm of N, base B, modulo P. That is, find an integer L such that
B
L
== N (mod P)
Input
Read several lines of input, each containing P,B,N separated by a space.
Output
For each line print the logarithm on a separate line. If there are several, print the smallest; if there is none, print "no solution".
Sample Input
5 2 1
5 2 2
5 2 3
5 2 4
5 3 1
5 3 2
5 3 3
5 3 4
5 4 1
5 4 2
5 4 3
5 4 4
12345701 2 1111111
1111111121 65537 1111111111
Sample Output
0
1
3
2
0
3
1
2
0
no solution
no solution
1
9584351
462803587
题意:
a^x = b(mod n) ,求解x(模板题)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 #include <cmath> 7 using namespace std; 8 typedef long long ll; 9 typedef long double ld; 10 11 using namespace std; 12 #define MOD 76543 13 int hs[MOD],head[MOD],Next[MOD],id[MOD],top; 14 15 void insert(int x,int y) 16 { 17 int k = x % MOD; 18 hs[top] = x,id[top] = y,Next[top] = head[k],head[k] = top++; 19 } 20 21 int find(int x) 22 { 23 int k = x % MOD; 24 for(int i = head[k];i != -1;i= Next[i]) 25 { 26 if(hs[i] == x) 27 return id[i]; 28 } 29 return -1; 30 } 31 32 int BSGS(int a,int b,int n) 33 { 34 memset(head,-1,sizeof(head)); 35 top = 1; 36 if(b == 1) 37 return 0; 38 int m = sqrt(n*1.0),j; 39 long long x = 1,p =1; 40 for(int i = 0;i < m;i++,p = p*a%n) 41 insert(p*b%n,i); 42 for(ll i = m;;i+=m) 43 { 44 if((j = find(x = x*p % n)) != -1) return i-j; 45 if(i > n) break; 46 } 47 return -1; 48 } 49 50 int main() 51 { 52 int p,b,n; 53 while(scanf("%d%d%d",&p,&b,&n) != EOF) 54 { 55 int ans = BSGS(b,n,p); 56 if(ans == -1) 57 printf("no solution\n"); 58 else 59 printf("%d\n",ans); 60 } 61 return 0; 62 }