已知,且a与P互质,求解同余方程
设
设 ,即 ,
所以满足,
得
先枚举j,将得到的存入hash表;
再枚举i,计算,是否存在hash表中,如果有,则找到了解,输出即可。
为保证答案最小,必须保证先枚举j,再枚举i,且保证在hash表中j从小到大排列
long long work(long long a,long long b,long long P) { long long m,v,e=1,i; m=ceil(sqrt(P+0.5)); v=pow_mod(a,m,P); v=inv(v);//v=a^(-im) Hash::clear(); Hash::add(1,0); for(i=1;i<m;i++) { e=(e*a)%P; if(Hash::get(e)==-1) Hash::add(e,i); } for(i=0;i<m;i++) { int t=Hash::get(b); if(t!=-1) return i*m+t; b=(b*v)%P; } return -1; }
POJ2417
文章来源: 离散对数――大步小步算法(BSGS)