BSGS 算法 简记

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.
}

猜你喜欢

转载自www.cnblogs.com/-Wallace-/p/12604105.html