演算法 BSGS演算法

2022-05-06 20:51:12 字數 968 閱讀 7474

bsgs演算法用於求解關於x的模方程\(a^x\equiv b\mod p\)(p為質數),相當於求模意義下的對數。

思想:由費馬小定理,\(a^\equiv 1\mod p\),在p-1次方後開始迴圈,所以若原方程有解,\(x_\in[0,p-1]\)。

設\(x=i*m+j\),有\(a^\equiv b\mod p\),移項得\(^i\equiv b*a^\mod p\),類似天天愛跑步,對於左右互不影響的等式可以開桶統計。例如可以列舉i,檢查另一側是否有對應的j滿足條件。

實現時,先把一側的值存入map或hash表,再在另一側列舉。寫成\(x=i*m-j\)的形式,可以避免求逆元。

時間複雜度:\(j\in[0,m-1]\),\(i\in [0,\frac p m]\),複雜度為\(o(\max(m,\frac p m))\),當\(m=\sqrt p\)時取最優,為\(o(\sqrt p)\)。

細節:特判a==0的情況。

寫成\(x=i*m-j\),j從0列舉到m,i從1列舉到m,因為\(0=1*m-m\)。

列舉j時,如果模出結果相同,在hash表中用大的j覆蓋小的j,因為\(x=i*m-j\),顯然j越大x越小。

傳入時a、b先模p。

#include using namespace std;

typedef long long ll;

const int mod=20180801,n=3e7+5;

struct hashtable

inline int hash(ll key)

inline ll find(ll key)

inline void insert(ll key,ll val)

}mp;

ll qpow(ll a,ll b,ll p)

ll bsgs(ll a,ll b,ll p)

int main()

return 0;

}

BSGS 大步小步演算法

bsgs被用於求解離散對數,即同餘方程 a x equiv b pmod 求 x 的最小非負整數解。保證 a perp p 互質 首先,我們根據費馬小定理,有 a equiv 1 pmod 則顯然有 a equiv a x pmod 即 a equiv a x pmod 那麼顯然 x,我們就得到了乙...

學習筆記 BSGS 演算法

bsgs baby step giant step 即大步小步演算法,常用於求解離散對數問題。該演算法可以在 o sqrt p 的時間複雜度內求解 a x equiv b pmod p 我們將求解的答案 x 設為 km c c m 的形式,即 a equiv b pmod p 在 a perp p ...

北上廣深演算法 BSGS

給定 a,p b a,p,b,a,p,b,求滿足 ax b mo dp a equiv b pmod p ax b m odp 的最小自然數 xxx。普通的 bsgs 假設了 p pp 為質數。令 x i m jx i times m j x i m j,其中 m p m lceil sqrt rc...