前言
这个算法的全名是baby-step-giant-step,用来求解一个数的离散对数,说白了就是求
Ax=B
A
x
=
B
(
mod
m
o
d
p
p
),方程中x解的个数。
算法
根据费马小定理,我们知道这个x的范围是在1..p-1中的,所以我们暴力枚举的复杂度是O(p)的。
这不够优,令,那么x可以表示为
x=q∗k1+k2
x
=
q
∗
k
1
+
k
2
,其中
k2<q
k
2
<
q
,那么我们将原方程移项,
Aq∗k1+k2=B
A
q
∗
k
1
+
k
2
=
B
(
mod
m
o
d
p
p
)
Aq∗k1
A
q
∗
k
1
我们先枚举k2,将得到的这个值存在一个哈希表里。
我们枚举k1,然后计算一下
Aq∗k1
A
q
∗
k
1
的逆元,算出右边这个式子的值,到哈希表里找一下,如果有这个值,那么ans++。
分析一波复杂度,前面枚举k2,k2
<
<
<script type="math/tex" id="MathJax-Element-1425"><</script>q,所以复杂度为
sqrt(p)
s
q
r
t
(
p
)
,然后k1也是根号p级别的,至于逆元,每次k1++,相当于乘上
Aq
A
q
的逆元,所以总的复杂度是O(sqrt(p))的。