$\text{Baby Step/Giant Step Algorithm}$ 用于解决这样一类同余方程的方法
$$a^x \equiv b\pmod c$$
结合原根的知识还能解决模数有原根的$N$次剩余问题
$$x^n \equiv b\pmod c$$
基础问题 $a^x\equiv b\pmod c$
具体来说,BSGS
的思路就是分块预处理
+hash
。
下面分情况讨论:
Case gcd(a,c) == 1
由欧拉定理可知$x$的取值范围不会大于$\varphi(c)$,我们直接取$x<c$即可。
$a,c$互素时,存在$a$在模$c$意义下的逆元。
令分块的大小为$\lceil\sqrt c\rceil$,即我们将解的形式限定为$x=A\times\lceil\sqrt c\rceil - B,A,B\in[0,\lceil\sqrt c\rceil]$,直接将$a^B$的部分放到同余式右侧。
现在需要解决的问题变成:
$$a^{A\times\lceil\sqrt c\rceil}\equiv b\times a^{B}\pmod c$$
- 首先预处理,枚举$b\times a^B$的取值,并将其存下来(
hash
) - 枚举$A$的取值,并查看是否存在对应的$B$是得两侧相等。
- 得到结果,或者无解。
Case gcd(a,c) != 1
一个比较好的想法是,我们将其转换成互素的情况。
由于$ax\equiv b\pmod c, g=\gcd(a, b, c)$可以转化成 $$\frac{a}{g}x\equiv \frac{b}{g}\pmod{\frac{c}{g}}$$
同样的,我们也可以不断去消去$c$中与$a$不互素的部分,从而达到目的
具体步骤为:
- $a\times a^{x-1}\equiv b\pmod c$
- $g=(a,c)$,若$g\nmid b$则无解
- $\frac{a}{g}\times a^{x-1}\equiv \frac{b}{g}\pmod{\frac{c}{g}}$
- 循环操作直到$(a,c)=1$或$\frac{a^k}{G}=\frac{b}{G}$
代码模板
|
|
$N$次剩余问题(离散对数)
要求模数要有原根,令为$g$。
- 两侧取离散对数得到$N\log x\equiv \log b\pmod{\varphi(c)}$
- 求出右侧$\log b$,即求$g^y\equiv b\pmod c$
- 现在转换为一次同余式的求解
例题代码
51nod 1038 X^A mod P
X^A mod P = B,其中P为质数。给出P和A B,求< P的所有X。
|
|