Introduction
BSGS 算法用于解决 离散对数的问题。具体的:
求关于 \(x\) 的方程 \(a^x \equiv b \pmod c\) 的最小非负整数解。其中 \(c\) 为质数。
暴力枚举显然会超时,我们需要一个更高效的算法。
BSGS Algorithm
算法流程:
-
令 \(m = \lceil \sqrt{c} \rceil\) ,将要求的 \(x\) 表示为 \(im - j\) 的形式。
-
那么原方程可化为 \(a^{im - j} \equiv b \pmod c\) 。移项,得 \(a^{im} \equiv a^j b \pmod c\)
-
枚举所有的 \(j \in [0,m]\) ,预先求出 \(a^j b\)。为了实现快速查找,我们将这些 \(a^j b\) 插入一个哈希表中。
-
枚举所有的 \(i \in (0,m]\) ,找出一个最大的 \(j\) ,满足 \(a^{im} \equiv a^j b \pmod c\)。如果找到了,那么答案即为 \(im - j\)。
-
如果最后没找到,无解。
伪代码:
clear hash_table;
make m = ceil(sqrt(c));
for each j in [0,m] do:
push (b*a^j) into hash_table;
for each i in (0,m] do: {
find the largest j that satisfy [a^(i*m) ≡ b*a^j (mod c)];
if j is exist then:
print (i*m-j) and quit.
}