BSGS算法 学习笔记

学习笔记 同时被 2 个专栏收录
41 篇文章 1 订阅
6 篇文章 0 订阅

引入

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

问题

给定 a,b,p ,求最小的非负整数 x ,满足axb(modp)

题解

这就是经典的BSGS算法,方法如下:
x=imj m=p ,则 aimjb(modp)
移项,得 (am)ibaj(modp)
首先,从 0m 枚举 j ,将得到的baj的值存入hash表;
然后,从 1m 枚举 i ,计算(am)i,查表,如果有值与之相等,则当时得到的 imj 是最小值。

讨论

1、讨论无解的情况?
方程有解的充要条件是 p 为质数且(a,p)=1
可以发现这是费马小定理的条件,会在问题2中讨论。
2、为什么 m p就可以?
我们先考虑枚举的思路:如果要是枚举 x 的值的话应该何时停止?
首先证明:akmodp1ak(modp)
akm(p1)ak(modp)
akam(p1)ak(modp)
即使 (ap1)m1(modp)
由费马小定理知当 p 为质数且(a,p)=1 ap11(modp)
推出 p 为质数且(a,p)=1这个条件,并证明结论 akmodp1ak(modp)

即我们得到:枚举 x 的话枚举到p即可。
所以使 imj<=p ,即 m=p i,j 最大值也为m。

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

  • 19
    点赞
  • 5
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

Clove_unique

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值