BSGS算法

前言

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

算法

根据费马小定理,我们知道这个x的范围是在1..p-1中的,所以我们暴力枚举的复杂度是O(p)的。
这不够优,令q=sqrt(p),那么x可以表示为 x=qk1+k2 x = q ∗ k 1 + k 2 ,其中 k2<q k 2 < q ,那么我们将原方程移项,
Aqk1+k2=B A q ∗ k 1 + k 2 = B ( mod m o d p p )
Ak2=B/ Aqk1 A q ∗ k 1
我们先枚举k2,将得到的这个值存在一个哈希表里。
我们枚举k1,然后计算一下 Aqk1 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))的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值