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