定义
前置知识:阶与原根。
离散对数的定义方式和对数类似。取有原根的正整数模数 ,设其一个原根为 . 对满足 的整数 ,我们知道必存在唯一的整数 使得
我们称这个 为以 为底,模 的离散对数,记作 ,在不引起混淆的情况下可记作 .
显然 ,.
性质
离散对数的性质也和对数有诸多类似之处。
性质
设 是模 的原根,,则:
进而
若 也是模 的原根,则
证明
令 ,则 . 又令 ,则 .
故 ,即
注意到
大步小步算法
目前离散对数问题仍不存在多项式时间经典算法(离散对数问题的输入规模是输入数据的位数)。在密码学中,基于这一点人们设计了许多非对称加密算法,如 Ed25519。
在算法竞赛中,BSGS(baby-step giant-step,大步小步算法)常用于求解离散对数问题。形式化地说,对 ,该算法可以在 的时间内求解
其中 。方程的解 满足 .(注意 不一定是素数)
算法描述
令 ,其中 ,则有 ,稍加变换,则有 .
我们已知的是 ,所以我们可以先算出等式右边的 的所有取值,枚举 ,用 hash/map 存下来,然后逐一计算 ,枚举 ,寻找是否有与之相等的 ,从而我们可以得到所有的 ,.
注意到 均小于 ,所以时间复杂度为 ,用 map 则多一个 .
为什么要求 与 互质
注意到我们求出的是 ,我们需要保证从 可以推回 ,后式是前式左右两边除以 得到,所以必须有 即 .
扩展 BSGS 算法
对 ,求解
其中 不一定互质。
当 时,在模 意义下 存在逆元,因此可以使用 BSGS 算法求解。于是我们想办法让他们变得互质。
具体地,设 . 如果 ,则原方程无解。否则我们把方程同时除以 ,得到
如果 和 仍不互质就再除,设 . 如果 ,则方程无解;否则同时除以 得到
同理,这样不停的判断下去,直到 .
记 ,于是方程就变成了这样:
由于 ,于是推出 . 这样 就有逆元了,于是把它丢到方程右边,这就是一个普通的 BSGS 问题了,于是求解 后再加上 就是原方程的解啦。
注意,不排除解小于等于 的情况,所以在消因子之前做一下 枚举,直接验证 ,这样就能避免这种情况。
习题
- SPOJ MOD 模板
- SDOI2013 随机数生成器
- SGU261 Discrete Roots 模板
- SDOI2011 计算器 模板
- Luogu4195【模板】exBSGS/Spoj3105 Mod 模板
- Codeforces - Lunar New Year and a Recursive Sequence
- LOJ6542 离散对数 index calculus 方法,非模板
本页面部分内容以及代码译自博文 Дискретное извлечение корня 与其英文翻译版 Discrete Root。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。
参考资料
- Discrete logarithm - Wikipedia
- 潘承洞,潘承彪。初等数论。
- 冯克勤。初等数论及其应用。