bsgs算法

转自此大神:https://blog.csdn.net/clove_unique/article/details/50740412

引入

BSGS算法,原名Baby Steps Giant Steps,又名大小步算法,拔山盖世算法,北上广深算法——by SLYZoier,数论基本算法之一。

问题

给定a,b,p

,求最小的非负整数x,满足ax≡b(modp)

 

题解

这就是经典的BSGS算法,方法如下:
令x=im−j,m=⌈\sqrt{p}⌉,则a^{_{im-j}}≡b (modp)
移项,得(a^{_{m}})^{i}\equiv ba^{j}(mod p)
首先,从0−m枚举j,将得到的ba^{j}的值存入hash表;
然后,从1−m枚举i,计算(a^{_{m}})^{i},查表,如果有值与之相等,则当时得到的im−j是最小值。

讨论

1、讨论无解的情况?
方程有解的充要条件是p为质数且gcd(a,p)=1
可以发现这是费马小定理的条件,会在问题2中讨论。
2、为什么m取⌈^{\sqrt{p}}⌉就可以?
我们先考虑枚举的思路:如果要是枚举x的值的话应该何时停止?
首先证明:a^{^{k mod (p-1))}}\equiv a^{_{k}} (mod p)
a^{_{k-m(p-1)}}\equiv a^{k} (modp)
\frac{a^{k}}{a^{m(p-1)}}\equiv a^{k}(modp)
(a^{p-1})^{m}\equiv 1(modp)
由费马小定理知当p为质数且gcd(a,p)=1时a^{p-1}\equiv 1(modp)
推出p为质数且gcd(a,p)=1这个条件,并证明结论a^{^{k mod (p-1))}}\equiv a^{_{k}} (mod p)

 

即我们得到:枚举x的话枚举到p即可。
所以使im−j<=p,即m=⌈\sqrt{p}⌉,i,j最大值也为m。

3、为什么第一个枚举到的im−j是最小值?
首先要明确的一点是,枚举j时算出来的值有可能重复,那么我们在hash表里就要用新的值覆盖原来的值。正确性显而易见,要保证im−j最小,就要保证j最大。
为什么枚举到最小的i就是最小值呢?思考每枚举到一个i,im的值实际上是在原来的基础上增加了m,而j的范围是[0,m],也就是说im增加的幅度一定比j增加的幅度大,从而保证了首先枚举到的一定是最小值。
4、为什么从0−m枚举j,而从1−m枚举i?
i不能为0,否则im−j有可能出现负数的情况

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值