BSGS
全称
Baby Step Gaint Step(大步小步法)
内容
求解Ax≡B(mod C)(0≤x<C)Ax≡B(mod C)(0≤x<C)一类的方程(CC为素数)。
的证明:
当CC为素数时,根据欧拉定理得
又A0≡1(mod C)A0≡1(mod C)
∴0∴0到φ(C)φ(C)是一个循环节。
∴∴如果xx在上无解,那么此方程也无解。
过程
以下默认gcd(A,C)=1gcd(A,C)=1。因为如果gcd(A,C)≠1gcd(A,C)≠1,由于CC是素数,就是CC的倍数了,这种情况直接特判就好了。
令,那么原式转化为Ai⋅m+j=B(mod C)Ai⋅m+j=B(mod C)。这时我们只需要枚举ii即可。时间复杂度。
对于枚举出来的ii,设原式转化为D⋅Aj≡B(mod C)D⋅Aj≡B(mod C),用EXGCD就可以求出DD。
求完,接下来就是求jj。我们可以事先把AjAj存到哈希表里,然后O(1)O(1)查询。
EXBSGS
内容
求解Ax≡B(mod C)(0≤x<C)Ax≡B(mod C)(0≤x<C)一类的方程(CC不一定为素数)。
过程
令
则(a∗d)x≡b∗d(mod c∗d)(a∗d)x≡b∗d(mod c∗d)
a∗(a∗d)x−1≡b(mod c)a∗(a∗d)x−1≡b(mod c)
然后我们把多出来的那个aa乘到里面(就是上面的那个DD),就又循环了一遍。
最后原式就变成,令x=i∗m+j+cntx=i∗m+j+cnt,然后和BSGS一样做就好了。
但是因为i≥0,j≥0i≥0,j≥0,所以还要枚举00到这一段。