浅谈BSGS算法
BSGS算法(baby-step giant-step),又称大步小步。
用于解决这样一个同余方程:
众所周知,形似
而对于指数的同余方程,我们可以根据根号分治是思想处理。
我们令
将其带回原式:
移项:
由于
具体地,我们可以先枚举
而如果枚举到最后都没有
一般题目都是要求输出最小解,因此找最小的
板,码:
inline LL bsgs(LL a,LL b,LL p){
map <LL,LL> mp;
int t(sqrt(p)+0.5);
LL res(1);
for(int B(1);B<=t;++B){
res=res*a%p;
mp[b*res%p]=B;
}
LL cur(res);
for(int A(1);A<=t;++A){
if(mp[cur]) return 1ll*A*t-mp[cur];
cur=cur*res%p;
}
return -1;
}