BSGS(大步小步法)
-
BSGS 可以在 \(O(\sqrt{p})\) 的时间内求解满足 \(a^x\equiv b\pmod p\) 的 \(x\),其中 \(a\perp p,x>0\)。
-
实现原理:
-
尝试进行和整除分块异曲同工的变换。\(a^x\equiv b\Leftrightarrow a^{k\times sq-r}\equiv b\Leftrightarrow a^{k\times sq}\equiv b\times a^r\)。
-
其中 \(sq=\lceil\sqrt p\rceil\)。
-
其实直接写成 \(k\times sq+r\) 的形式也可以,但是要求逆元比较烦,所以换成减的。当然,也可以先写成那样然后微调一下。
-
容易证明,有 \(0\leqslant k<sq,0\leqslant r<sq\)。注意前者的证明其实是靠扩展欧拉定理。更严谨的表述是,\(\exists x\to \exists k\in (0,sq)\)。
-
从而我们可以枚举 \(r\) 算出所有可行取值,然后再枚举 \(k\) 来验证成立。注意对于同一个式右的值,如果求最小 \(x\),那么我们希望 \(r\) 尽量大。
-
-
复杂度保证:求 \(a\) 的 \(sq\) 次方,枚举 \(A,B\) 都是 \(O(sq)\) 的,故总复杂度为 \(O(\sqrt{p})\)。
扩展 BSGS
-
扩展 BSGS 可以在 \(O(\sqrt{p})\) 的时间内求解满足 \(a^x\equiv b\pmod p\) 的 \(x\),不保证 \(a\perp p\)。
-
实现原理:
-
将同余式展开为不定方程,得 \(a^x+k\times p=b\)。
-
由裴蜀定理,当且仅当 \(\gcd(a,p)\mid b\),有解。
-
从而上式可以化为 \(\dfrac{a^x}{g}+k\times\dfrac{p}{g}=\dfrac{b}{g}\)。
-
反复,直到 \(a\perp p'\)。然后 BSGS,注意此时的 \(x'\) 已经不是原来的 \(x\),\(b\) 也应当把式左的系数除过去。
-
-
复杂度保证:\(\gcd\geqslant 2\),从而扩展阶段的复杂度为 \(\log\) 级别,故总复杂度仍为 \(O(\sqrt{p})\)。