BSGS && 扩展BSGS

BSGS算法用于解决以下方程

\[\begin{aligned} a^x \equiv b \pmod{p} \end{aligned} \]

其中\(gcd(a, p) = 1\)
\(x = i \cdot m - j ,\quad ( 0 \le j \lt m)\)  则原式可化为

\[\begin{aligned} a^{i \cdot m} \equiv b \cdot a^j \pmod{p} \end{aligned} \]

对于方程右边,带入所有可能的 j 计算,存入Hash表或者map(多一个log)中,然后 i 从1 到 m 枚举等式左边,若两边相等,则答案为\(i \cdot m - j\)

复杂度:
根据欧拉定理:

\[\begin{aligned} a^{\varphi(p)} \equiv 1\pmod{p} \\ a^0 \equiv 1 \pmod{p} \end{aligned} \]

可见,\(\varphi(p)\)为一个循环节,暴力枚举至多\(\varphi(p)\)次,就可以找到答案,否则无解。
则复杂度为\(O(max(m, \varphi(p) / m))\)
当最坏的情况,即\(\varphi(p) = p - 1\)时,显然可知当\(m = \sqrt{p}\)时,复杂度最小为\(O(\sqrt{p})\)

细节:

  1. 计算m时加一或向上取整。
  2. 0到m计算方程右边,1到m计算左边。
  3. 当a被p整除时,方程左边恒等于0,而右边不为零时,无解,可直接特判。

扩展BSGS

用于解决上述问题当\(gcd(a, p)\)不为1时的解。

考虑怎么搞一搞把 a 和 p 搞成互质的数。

\(g = gcd(a, p)\),将同余式化为等式,两边同除g,即:

\[\begin{aligned} a^x + k \cdot p = b \quad \quad \\ \frac{a}{g} \cdot a^{x - 1} + k \cdot \frac{p}{g} = \frac{b}{g} \end{aligned} \]

当b不被g整除且b不为1时,方程无解。
证明:
设:\(a_1 = \frac{a}{g} \quad p_1 = \frac{p}{g}\)
原式可化为:

\[\begin{aligned} (a_1 \cdot g)^x + k \cdot p_1 \cdot g = b\\ g \cdot (a_1 ^ x \cdot g^{x - 1} + k \cdot p_1) = b \end{aligned} \]

所以g应为b的一个约数,除非 $ b = 1$ 时\(a^0 = 1\)否则无解。

不断寻找a和除以g之后的p的gcd,一直除,直到a和p'互质,设总共进行了k次处理:

\[\begin{aligned} a' \cdot a^{x - k} \equiv b' \pmod{p'} \end{aligned} \]

再用bsgs即可求出上述式子的解。

posted @ 2020-06-07 00:04  Mcggvc  阅读(100)  评论(0编辑  收藏  举报