BSGS和EXBSGS

BSGS

全称

Baby Step Gaint Step(大步小步法)

内容

求解AxB(mod C)(0x<C)Ax≡B(mod C)(0≤x<C)一类的方程(CC为素数)。

0x<C的证明:

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

过程

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

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

EXBSGS

内容

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

过程

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值