(BSGS(Baby Steps Giant Steps))
对于 (a^xequiv bpmod{p}) ,求(x_{min})
由于模的剩余类会产生循环节,根据鸽巢原理,
(a^0, a^1, ldots, a^{n-1})模(p)((p)为质数)意义下的剩余类与(a^n, a^{n+1}, ldots, a^{2n-1})的剩余类相同,
因此我们要的答案一定在([0, n-1])内。
把这(n)个数分块, 设(m=lceilsqrt{p} ceil)(向上取整)。
设(x=i*m-y),
(a^{i*m-y}equiv bpmod{p})
(a^{i*m}equiv b imes a^ypmod{p})$
检查 (a^y)是否在出现过,可以用(map)或哈希表记录。
首先求出(a^1,a^2, ldots, a^m),并记录(hash[b imes a^i]=i)
枚举每个块的端点(now = now imes a^m)
若找到了(hash[now]),则答案即为(i*m-hash[now])。
时间复杂度为(O(sqrt p))