1. 程式人生 > 其它 >【學習筆記】BSGS 演算法

【學習筆記】BSGS 演算法

淺談 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{p}{d_1}\) 仍不互素,則不斷重複上述過程,直到 \(a \perp \dfrac{p}{d_1d_2 \cdots d_m}\)

此時,原方程變形為

\[\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} \]

參考資料