这篇博客探讨了如何解决模指数运算的问题,即求解a^x = b (mod n)。文中介绍了两种算法:baby-step giant-step 和 Miller-Rabin 算法的变种。这两种方法特别适用于n为素数的情况,并且能在较短时间内找到0≤x<n的解。此外,还提供了一个C++实现的示例代码,展示了如何在实际编程中应用这些算法。
hash
//POJ 2417//baby_step giant_step// a^x = b (mod n) n为素数,a,b < n// 求解上式 0 <= x < n的解#include<cmath>#include<cstdio>#include<cstring>#define MOD 76543usingnamespace std;int hs[MOD], head[MOD], next[MOD], id[MOD], top;voidinsert(int x,int y){int k = x % MOD;
hs[top]= x;
id[top]= y;
next[top]= head[k];
head[k]= top++;}intfind(int x){int k = x % MOD;for(int i = head[k]; i !=-1; i = next[i])if(hs[i]== x)return id[i];return-1;}intBSGS(int a,int b,int n){memset(head,-1,sizeof(head));
top =1;if(b ==1)return0;int m =sqrt(n *1.0), j;longlong x =1, p =1;for(int i =0; i < m; i++, p = p * a % n)insert(p * b % n, i);for(longlong i = m;; i += m){if((j =find(x = x * p % n))!=-1)return i - j;if(i > n)break;}return-1;}intmain(){int a, b, n;while(~scanf("%d%d%d",&n,&a,&b)){int ans =BSGS(a, b, n);if(ans ==-1)printf("no solution\n");elseprintf("%d\n", ans);}}