BSGS算法

前言

这个算法的全名是baby-step-giant-step,用来求解一个数的离散对数,说白了就是求
A x = B ( m o d p ),方程中x解的个数。

算法

根据费马小定理,我们知道这个x的范围是在1..p-1中的,所以我们暴力枚举的复杂度是O(p)的。
这不够优,令 q = s q r t ( p ) ,那么x可以表示为 x = q k 1 + k 2 ,其中 k 2 < q ,那么我们将原方程移项,
A q k 1 + k 2 = B ( m o d p )
A k 2 = B / A q k 1
我们先枚举k2,将得到的这个值存在一个哈希表里。
我们枚举k1,然后计算一下 A q k 1 的逆元,算出右边这个式子的值,到哈希表里找一下,如果有这个值,那么ans++。
分析一波复杂度,前面枚举k2,k2 < q,所以复杂度为 s q r t ( p ) ,然后k1也是根号p级别的,至于逆元,每次k1++,相当于乘上 A q 的逆元,所以总的复杂度是O(sqrt(p))的。

猜你喜欢

转载自blog.csdn.net/qq_36056315/article/details/80420916