BSGS和EXBSGS

BSGS

全称

Baby Step Gaint Step(大步小步法)

内容

求解 AxB(mod C)(0x<C) A x ≡ B ( m o d   C ) ( 0 ≤ x < C ) 一类的方程( C C 为素数)。

0x<C的证明:

C C 为素数时,根据欧拉定理得Aφ(C)1(mod C)
A01(mod C) A 0 ≡ 1 ( m o d   C )
0 ∴ 0 φ(C) φ ( C ) 是一个循环节。
如果 x x [0,C)上无解,那么此方程也无解。

过程

以下默认 gcd(A,C)=1 g c d ( A , C ) = 1 。因为如果 gcd(A,C)1 g c d ( A , C ) ≠ 1 ,由于 C C 是素数,A就是 C C 的倍数了,这种情况直接特判就好了。

m=C,x=im+j,那么原式转化为 Aim+j=B(mod C) A i ⋅ m + j = B ( m o d   C ) 。这时我们只需要枚举 i i 即可。时间复杂度O(C)
对于枚举出来的 i i ,设D=Aim,原式转化为 DAjB(mod C) D ⋅ A j ≡ B ( m o d   C ) ,用EXGCD就可以求出 D D
求完D,接下来就是求 j j 。我们可以事先O(C) Aj A j 存到哈希表里,然后 O(1) O ( 1 ) 查询。

EXBSGS

内容

求解 AxB(mod C)(0x<C) A x ≡ B ( m o d   C ) ( 0 ≤ x < C ) 一类的方程( C C 不一定为素数)。

过程

d=gcd(A,C),A=ad,B=bd,C=cd

(ad)xbd(mod cd) ( a ∗ d ) x ≡ b ∗ d ( m o d   c ∗ d )
a(ad)x1b(mod c) a ∗ ( a ∗ d ) x − 1 ≡ b ( m o d   c )

然后我们把多出来的那个 a a 乘到D里面(就是上面的那个 D D ),就又循环了一遍。
最后原式就变成DAxcntB(mod C),令 x=im+j+cnt x = i ∗ m + j + c n t ,然后和BSGS一样做就好了。
但是因为 i0,j0 i ≥ 0 , j ≥ 0 ,所以还要枚举 0 0 cnt1这一段。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值