LA 7457 Discrete Logarithm Problem(shank的大步小布算法)

来源:互联网 发布:蔡仕伟淘宝 编辑:程序博客网 时间:2024/06/05 22:02

题意:求a^x % p = b的最小x。


#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#include<vector>#include<ctime>  #include<cstring>#include<stack>#include<cmath>#include<queue>#define INF 0x3f3f3f3f#define eps 1e-9#define MAXN 100000using namespace std;typedef long long ll;int n,a,b;int ksm(int a,int b){int ans = 1;while(b){if(b & 1) ans = ans * a % n;a = a * a % n;b>>=1;}return ans;}void gcd(int a,int b,int &d,int &x,int &y){if(!b) {d = a;x = 1;y = 0;}else {gcd(b,a%b,d,y,x);y -= x*(a/b);}}int inv(int a,int n){int d,x,y;gcd(a,n,d,x,y);return d == 1 ? (x+n)%n : -1;}int log_mod(int a,int b,int n){int m,v,e = 1;m = (int)sqrt(n+0.5);v = inv(ksm(a,m),n);if(v == -1) return 0;map<int,int> x;x[1] = 0;for(int i = 1;i < m;i++){e = e*a % n;if(!x.count(e)) x[e] = i;}for(int i = 0;i < m;i++){if(x.count(b)) return (i*m + x[b]); b = b*v % n;}return 0;}int main(){scanf("%d",&n);while(~scanf("%d",&a) && a){scanf("%d",&b);printf("%d\n",log_mod(a,b,n));}}


0 0
原创粉丝点击