BSGS算法

该文介绍了一种求解离散对数问题的Baby-Step-Giant-Step算法,通过预处理和查找哈希表的方式,在O(√p)的时间复杂度内找到方程Ax=B(mod p)的解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

算法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值