BSGS算法总结
Part I BSGS算法
BSGS算法(Baby Step Giant Step),即大步小步算法,用于求解这样的问题
yx≡ z(mod p) 的最小整数解,前提条件 (y,p)=1。
此时先计算出m = sqrt(p)
然后另 x = im+j,此时有i,j<m
移项有 ymi ≡z*y-j,因为有逆元,不爽
重新另x = im-j,这样移项是就能不去算逆元了
这时有 ymi ≡ z*yj .
这时只用枚举b可能的取值(0~m-1),并且计算右边的值,同时用哈希或者map之类的东西存起来,方便查询.
接着枚举左边的i(1~m),查一下hash table 或 map 中有没有相同的值就行了。
参考代码(用的是CQOI2018 破解D-H协议中写的BSGS)
inline int BSGS(int y,int z) { ma.clear(); ll m= sqrt(p)+1; ll cj = z; for(int i=0;i<m;i++) { ma[cj] = i; cj = cj*y%p; } ll now = Pow(y,m); cj = 1; for(int i=1;i<=m+1;i++) { cj = cj*now%p; if(ma.count(cj)) { return i*m-ma[cj]; } } }
Part II 扩展BSGS算法
除gcd...