Skip to content

离散对数 学习笔记

离散对数的定义方式和对数类似。取有原根的正整数模数 ,设其一个原根为 . 对满足 的整数 ,我们知道必存在唯一的整数 使得

我们称这个 为以 为底,模 的离散对数,记作 ,在不引起混淆的情况下可记作 .

显然 .

性质

离散对数的性质也和对数有诸多类似之处。

是模 的原根,,则:

  1. 进而

  2. 也是模 的原根,则

引入

BSGS(baby-step giant-step),即大步小步算法,常用于求解离散对数问题。该算法可以在 的时间复杂度内求解

方法

我们将求解的答案 设为 的形式,即

也就是

于是就可以用 Meet in middle 攻击了

进阶篇

,求解

该问题可以转化为 BSGS 求解的问题。

由于式子中的模数 是一个质数,那么 一定存在一个原根 . 因此对于模 意义下的任意的数 有且仅有一个数 满足 .

方法一

我们令 的原根(我们一定可以找到这个 问题转化为求解 . 稍加变换,得到

于是就转换成了 BSGS 的基本模型了,可以在 解出 ,这样可以得到原方程的一个特解 .

方法二

我们仍令 ,并且设 ,于是我们得到

方程两边同时取离散对数得到

我们可以通过 BSGS 求解 得到 ,于是这就转化成了一个线性同余方程的问题。这样也可以解出 ,求出 的一个特解 .

找到所有解

在知道 的情况下,我们想得到原问题的所有解。首先我们知道 ,于是可以得到

于是得到所有解为

对于上面这个式子,显然有 . 因此我们设 ,得到

这就是原问题的所有解。

扩展篇(扩展 BSGS)

,求解

其中 不一定互质。

时,在模 意义下 存在逆元,因此可以使用 BSGS 算法求解。于是我们想办法让他们变得互质。

具体地,设 . 如果 ,则原方程无解。否则我们把方程同时除以 ,得到

如果 仍不互质就再除,设 . 如果 ,则方程无解;否则同时除以 得到

同理,这样不停的判断下去,直到 .

,于是方程就变成了这样:

由于 ,于是推出 . 这样 就有逆元了,于是把它丢到方程右边,这就是一个普通的 BSGS 问题了,于是求解 后再加上 就是原方程的解啦。

注意,不排除解小于等于 的情况,所以在消因子之前做一下 枚举,直接验证 ,这样就能避免这种情况。

补充:小粉兔的另一种 exBSGS

洛谷 P5345: 【XR-1】快乐肥宅 - 粉兔 - 博客园

主要思想是特判 “尾巴然后将环上的问题转化为朴素 BSGS