Baby-Step_Giant-Step(简称BSGS)及其扩展算法(简称Extended BSGS)用来求解
这样的问题
设
,将
分解为
,那么
然后我们通过枚举
,来求解同余方程
变形得:
当前
和
未知,将
看为
,用扩展欧几里得求解即可
其实递推也可以
求解同余方程
当
时显然
接下来每次左边乘上一个
,移项,得到
所以说
递推下去即可
我们得到了
,怎么得到
呢?
直接将
的值映射到一个Hash表里面就好了
代码实现如下:
ll BSGS(ll a,ll b,ll p) {
if(a%p==0) return -1;
b%=p;
ll m=ceil(sqrt(p*1.0));
hash.clear();
ll in=1,d=1;
for(int i=0;i<m;i++) {
hash.insert(in,i);
in=(in*a)%p;
}
ll a_m_inv=get_inv(in,p);
for(int i=0;i<m;i++) {
ll cpt=hash.get(b);
if(cpt!=-1)
return i*m+cpt;
b=(b*a_m_inv)%p;
}
return -1;
}