大步小步(Baby Step,Giant Step,BSGS)算法,用来求解类似于ax≡b(moda^x≡b(modax≡b(mod p)p)p)的问题,其中aaa,bbb,ppp已经给出,本算法只能解决ppp为素数的问题。
设m=ceil(sqrt(p))m=ceil(sqrt(p))m=ceil(sqrt(p)),x=i∗m−jx=i*m-jx=i∗m−j,则ai∗m−j≡b(moda^{i*m-j}≡b(modai∗m−j≡b(mod p)p)p),同乘aja^jaj可得(am)i≡b∗aj(mod{(a^{m})}^{i}≡b*a^j(mod(am)i≡b∗aj(mod p)p)p)。
接下来考虑枚举所有的j∈[0,m−1]j ∈ [0,m-1]j∈[0,m−1],将b∗ajb*a^jb∗aj modmodmod ppp加入哈希表(可用map)中,再枚举i∈[0,m]i ∈ [0,m]i∈[0,m],计算出(am)i{(a^{m})}^{i}(am)i modmodmod ppp,在哈希表中找出对应的jjj并更新答案,这样xxx就可以算出了,方程的解也可以求出。
时间复杂度O(sqrt(p))O(sqrt(p))O(sqrt(p)),101610^{16}1016以下都没有问题。
例题:abc270g,