跳转至

离散对数

定义

前置知识:阶与原根

离散对数的定义方式和对数类似。取有原根的正整数模数 \(m\),设其一个原根为 \(g\). 对满足 \((a,m)=1\) 的整数 \(a\),我们知道必存在唯一的整数 \(0\leq k<\varphi(m)\) 使得

\[ g^k\equiv a\pmod m \]

我们称这个 \(k\) 为以 \(g\) 为底,模 \(m\) 的离散对数,记作 \(k=\operatorname{ind}_g a\),在不引起混淆的情况下可记作 \(\operatorname{ind} a\).

显然 \(\operatorname{ind}_g 1=0\)\(\operatorname{ind}_g g=1\).

性质

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

性质

\(g\) 是模 \(m\) 的原根,\((a,m)=(b,m)=1\),则:

  1. \(\operatorname{ind}_g(ab)\equiv\operatorname{ind}_g a+\operatorname{ind}_g b\pmod{\varphi(m)}\)

    进而 \((\forall n\in\mathbf{N}),~~\operatorname{ind}_g a^n\equiv n\operatorname{ind}_g a\pmod{\varphi(m)}\)

  2. \(g_1\) 也是模 \(m\) 的原根,则 \(\operatorname{ind}_g a\equiv\operatorname{ind}_{g_1}a \cdot \operatorname{ind}_g g_1\pmod{\varphi(m)}\)

  3. \(a\equiv b\pmod m\iff \operatorname{ind}_g a=\operatorname{ind}_g b\)
证明
  1. \(g^{\operatorname{ind}_g(ab)}\equiv ab\equiv g^{\operatorname{ind}_g a}g^{\operatorname{ind}_g b}\equiv g^{\operatorname{ind}_g a+\operatorname{ind}_g b}\pmod m\)
  2. \(x=\operatorname{ind}_{g_1}a\),则 \(a\equiv g_1^x\pmod m\). 又令 \(y=\operatorname{ind}_g g_1\),则 \(g_1\equiv g^y\pmod m\).

    \(a\equiv g^{xy}\pmod m\),即 \(\operatorname{ind}_g a\equiv xy\equiv\operatorname{ind}_{g_1}a \cdot \operatorname{ind}_g g_1\pmod{\varphi(m)}\)

  3. 注意到

    \[ \begin{aligned} \operatorname{ind}_g a=\operatorname{ind}_g b&\iff \operatorname{ind}_g a\equiv\operatorname{ind}_g b\pmod{\varphi(m)}\\ &\iff g^{\operatorname{ind}_g a}\equiv g^{\operatorname{ind}_g b}\pmod m\\ &\iff a\equiv b\pmod m \end{aligned} \]

大步小步算法

目前离散对数问题仍不存在多项式时间经典算法(离散对数问题的输入规模是输入数据的位数)。在密码学中,基于这一点人们设计了许多非对称加密算法,如 Ed25519

在算法竞赛中,BSGS(baby-step giant-step,大步小步算法)常用于求解离散对数问题。形式化地说,对 \(a,b,m\in\mathbf{Z}^+\),该算法可以在 \(O(\sqrt{m})\) 的时间内求解

\[ a^x \equiv b \pmod m \]

其中 \(a\perp m\)。方程的解 \(x\) 满足 \(0 \le x < m\).(注意 \(m\) 不一定是素数)

算法描述

\(x = A \left \lceil \sqrt m \right \rceil - B\),其中 \(0\le A,B \le \left \lceil \sqrt m \right \rceil\),则有 \(a^{A\left \lceil \sqrt m \right \rceil -B} \equiv b \pmod m\),稍加变换,则有 \(a^{A\left \lceil \sqrt m \right \rceil} \equiv ba^B \pmod m\).

我们已知的是 \(a,b\),所以我们可以先算出等式右边的 \(ba^B\) 的所有取值,枚举 \(B\),用 hash/map 存下来,然后逐一计算 \(a^{A\left \lceil \sqrt m \right \rceil}\),枚举 \(A\),寻找是否有与之相等的 \(ba^B\),从而我们可以得到所有的 \(x\)\(x=A \left \lceil \sqrt m \right \rceil - B\).

注意到 \(A,B\) 均小于 \(\left \lceil \sqrt m \right \rceil\),所以时间复杂度为 \(\Theta\left (\sqrt m\right )\),用 map 则多一个 \(\log\).

为什么要求 \(a\)\(m\) 互质

注意到我们求出的是 \(A,B\),我们需要保证从 \(a^{A\left \lceil \sqrt m \right \rceil} \equiv ba^B \pmod m\) 可以推回 \(a^{A\left \lceil \sqrt m \right \rceil -B} \equiv b \pmod m\),后式是前式左右两边除以 \(a^B\) 得到,所以必须有 \(a^B \perp m\)\(a\perp m\).

进阶篇

\(a,b\in\mathbf{Z}^+\)\(p\in\mathbf{P}\),求解

\[ x^a \equiv b \pmod p \]

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

由于式子中的模数 \(p\) 是一个质数,那么 \(p\) 一定存在一个原根 \(g\). 因此对于模 \(p\) 意义下的任意的数 $x~(1\le x