BSGS 与 exBSGS 算法学习笔记

· · 算法·理论

什么是 BSGS?

BSGS 是用来解决高次同余方程模数是质数的一种算法。

高次同余方程

已知整数 a, b, p,其中 p 为质数,求最小的非负整数 x,使得 a^x \equiv b \pmod{p}

因为 p 是质数,根据费马小定理,a^{p-1} \equiv 1 \pmod{p}。又知道 a^0 \equiv 1 \pmod{p},所以幂有长度不超过 p 的循环节。暴力枚举 x < p 即可。

但是如果 p 达到了 10^9 级别怎么办?

引入 BSGS

BSGS = Baby Steps Giant Steps,可以音译为北上广深,拔山盖世(你也可以音译为爆杀高三),只要见到别不认识就行。

BSGS 算法的思想是 meet in the middle,时间复杂度 O(\sqrt{p})

x = im - jx 相当于被除数,m 相当于除数,i 相当于商,j 相当于负余数),其中 m = \left\lceil \sqrt{p} \right\rceil,这样原式变为 a^{im-j} \equiv b \pmod{p},可以进一步变形得到:

(a^m)^i \equiv b \cdot a^j \pmod{p} $i$ 的取值范围是 $[1, m]$,可以直接枚举等号左边,到哈希表中去找是否有相同的值。找到的第一个相等的 $i$,对应的 $im - j$ 就是最小的 $x$。 ### BSGS 例题 **[P3846 [TJOI2007] 可爱的质数/【模板】BSGS](https://www.luogu.com.cn/problem/P3846)** 模板题,按照正常 BSGS 的思路写代码就可以。 [代码](https://www.luogu.com.cn/paste/z2k4ywz8) --- **[P2485 [SDOI2011]计算器](https://www.luogu.com.cn/problem/P2485)** $K = 1$ 时:直接快速幂算出 $y^z \bmod p$; $K = 2$ 时:费马小定理算出 $xy \equiv 1 \pmod{p}$ 时 $x$ 的值,将结果乘上 $z$ 即可,注意当 $p \mid y$ 且 $z \nmid y$ 时无解; $K = 3$ 时,用 BSGS 求出 $x$,注意特判 $p \mid y$ 的情况。 [代码](https://www.luogu.com.cn/paste/4g5szkwj) --- **[P4454 [CQOI2018]破解D-H协议](https://www.luogu.com.cn/problem/P4454)** 这题说了一大堆,其实一半都没用,这道题的意思就是求出 $A = g^a \bmod P$ 的 $a$,然后求出 $K = B^a \bmod P$ 的 $K$ 或者 求出 $B = g^b \bmod P$ 的 $b$,然后求出 $K = A^b \bmod P$ 的 $K$。 那么我们可以用 BSGS 求出 $a$ 或 $b$,然后快速幂求出 $K$。 [代码](https://www.luogu.com.cn/paste/6eb16vo4) --- **[P4884 多少个 1?](https://www.luogu.com.cn/problem/P4884)** $$\begin{matrix}\underbrace{111 \cdots 11}\\N \text{个} 1\end{matrix} \equiv K \pmod{m}$$ $$\begin{matrix}\underbrace{999 \cdots 99}\\N \text{个} 9\end{matrix} \equiv 9K \pmod{m}$$ $$10^N \equiv 9K + 1 \pmod{m}$$ 现在我们就可以用正常的 BSGS 求出 $N_{min}$ 了,但是这里需要注意,由于 $m$ 比较大,`long long` 乘法有溢出风险,所以要用龟速乘。 [代码](https://www.luogu.com.cn/paste/7zh6orv5) --- ## 什么是 exBSGS exBSGS 是用来解决高次同余方程**通用**的一种算法。 ### 引入 exGSGS **exBSGS = 扩展 BSGS 算法**,针对 $p$ 可能不是质数的情况。 无解的判定条件是:$(a, p) \nmid b$ 且 $b \neq 1$。 对于式子: $$a^x \equiv b \pmod{p}, g = (a, p)$$ 两边同时除掉 $g$: $$a^{x-1} \cdot \frac{a}{g} \equiv \frac{b}{g} \pmod{\frac{p}{g}}$$ 设 $a' = \frac{a}{g}, b' = \frac{b}{g}, p' = \frac{p}{g}$。 原式变成: $$a^{x-1} \cdot a' \equiv b' \pmod{p'}$$ 一直这样迭代下去,直到无解或者 $a', p'$ 互质即可。 最终原式变为(设 $M = \prod\limits_{i=1}^kg_i$): $$a^{x-k} \cdot \frac{a^k}{M} \equiv \frac{b}{M} \pmod{\frac{p}{M}}$$ 此时 $\frac{a^k}{M}$ 与 $\frac{p}{M}$ 互质,可以用正常的 BSGS 解决。 ### exBSGS 例题 **[P4195 【模板】扩展 BSGS/exBSGS](https://www.luogu.com.cn/problem/P4195)** 模板题,按照引入中的 exBSGS 的思路加上正常 BSGS 的思路写代码就可以。 [代码](https://www.luogu.com.cn/paste/utiv1x10) > 关于 BSGS 与 exBSGS 的学习笔记就到这里啦!持续更新……