【學習筆記】BSGS 演算法
引入
BSGS(baby-step giant-step),即大步小步演算法,常用於求解離散對數問題。該演算法可以在 \(O(\sqrt p)\) 的時間複雜度內求解
\[a^x \equiv b \pmod p \]第一部分:\(a \perp p\)
我們將求解的答案 \(x\) 設為 \(km-c \ (c < m)\) 的形式,即
\[a^{km-c} \equiv b \pmod p \]在 \(a \perp p\) 條件下,上式等價於
\[a^{km} \equiv ba^{c} \pmod p \]先列舉 \(c\),使用雜湊表(或 map
)將所有 \(ba^c\) 的值存起來。
再列舉 \(k\),計算 \(a^{km}\) 的值並尋找是否有 \(ba^c\) 的值與之對應,從而找到方程所有解。
至此,我們找到了模 \(p\) 意義下的所有解。
不難發現,該演算法時間複雜度為 \(O(\max (m,\dfrac{p}{m}))\),當 \(m=\left\lceil \sqrt p \right\rceil\) 時,複雜度最優。
故該演算法的時間複雜度為 \(O(\sqrt p)\)。
第二部分: \(a,p\) 不互素
此時,\(a^{km} \equiv ba^{c} \pmod p\) 是 \(a^{km-c} \equiv b \pmod p\) 的必要不充分條件,我們需要進行變形使得 \(a\)
同餘的基本性質:若 \(a,b,d,m \in \mathbf{N^*},d \mid a,d \mid b,d \mid m\),則 \(a \equiv b \pmod p\) 等價於 \(\frac{a}{d} \equiv \frac{b}{d} \pmod {\frac{m}{d}}\)
設 \(d_1=\gcd(a,p)\)。
若 \(d_1 \nmid b\),則方程無解。
否則,將方程變形為
\[\dfrac{a}{d_1}a^{x-1} \equiv \dfrac{b}{d_1} \pmod {\dfrac{p}{d_1}} \]若 \(a\)
此時,原方程變形為
\[\dfrac{a^m}{d_1d_2 \cdots d_m}a^{x-m} \equiv \dfrac{b}{d_1d_2 \cdots d_m} \pmod {\dfrac{p}{d_1d_2 \cdots d_m}} \]通過第一部分的 BSGS 演算法,不難求出 \(x-m\) 的所有解,只需另外需考慮 \(x < m\)的情況即可。
時間複雜度仍為 \(O(\sqrt n)\)
離散對數
設 \(g\) 是模 \(n\) 的原根,那麼對於任意 \(a\) 滿足 \(a \perp n\),均存在 \(k\) 使得
\[g^k \equiv a \pmod n \]這樣的關係有助於把 \(\bmod \ n\) 的乘法轉化為 \(\bmod \ \varphi(n)\) 的加法。
考慮求解 \(x^a \equiv b \pmod p\),滿足 \(b \in \mathbf{N^*}\) 且 \(p\) 是素數。
設 \(g\) 為模 \(p\) 的原根,由於 \(g^0,g^1,g^2,\cdots,g^{p-2}\) 構成模 \(p\) 的一組簡化剩餘系且 \(p \nmid x\),故令 \(x=g^c,b=g^t\),得到
\[g^{ac} \equiv g^t \pmod p \]兩邊同時取離散對數,得到
\[ac \equiv t \pmod {\varphi(p)} \]我們可以先通過 BSGS 演算法求解出 \(t\),再通過擴充套件歐幾里得演算法求解出 \(c\),即可得到方程的一組特解:\(x_0=g^c\)。
找到一組特解 \(x_0=g^c\) 之後,令 \(x=g^k\),得到
\[g^{a \cdot k} \equiv g^{a \cdot c+t \cdot \varphi(p)} \pmod p \]故 \(k\) 的所有解為
\[\forall t \in \mathbf Z,a \mid t \cdot \varphi (p),k=c+ \dfrac{t \cdot \varphi(p)}{a} \]由於 \(a \mid t \cdot \varphi (p)\),則 \(\frac{a}{\gcd(a,\varphi (p))} \mid t\),故令 \(t=\frac{a}{\gcd(a,\varphi (p))} \cdot i\)
則原方程所有解為
\[\forall i \in \mathbf Z,x=g^{c+ \frac{\varphi (p)}{\gcd(a,\varphi (p))} \cdot i} \]