大步小步演算法

2022-07-21 14:54:24 字數 886 閱讀 6636

考慮這樣乙個問題:

題目給定正整數 \(a,b,p\) 求滿足 \(a^x\equiv b\pmod p\) 的所有正整數解 \(x\),保證 \(p\) 是素數。

分析首先由費馬小定理,\(a^\equiv 1\pmod p\),也就是說暴力演算法只需要列舉到 \(p-1\) 即可,我們考慮優化。

我們考慮只暴力求解 \(a^x\bmod p\) 的前 \(m\) 個值,也即 \(a^1\bmod p,a^2\bmod p,\cdots,a^m\bmod p\)。那麼現在來考慮後面的數,將其 \(m\) 個一組分組(就是 \(m+1,m+2,\cdots,2m\) 一組,\(2m+1,2m+2,\cdots,3m\) 一組)。對於每一組這樣考慮:如果

\[a^\equiv b\pmod p

\]這等價於

\[a^t\equiv b\cdot (a^)^\equiv b\cdot (a^)^k\pmod p

\]也就是說,我們在列舉每乙個 \(k\) 的時候可以直接將 \(b\cdot (a^)^k \bmod p\) 與每乙個 \(a^i\) 對比,看是否有相同的,這可以用 \(map\) 實現。

這個演算法被稱為大步小步(baby step giant step, bsgs, 拔山蓋世)演算法。它的複雜度為 \(o((m+\frac n m)\log m)\),當 \(m=\sqrt\) 時最優,為 \(o(\sqrt\log n)\)

ll bsgs(ll a, ll b, ll mod)

ll inv = qpow(tmp, mod - 2, mod);

for(int i = 0; i < m; ++i)

return -1;

}

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,我們就得到了乙...

Poj2417 大步小步演算法

poj2417 given a prime p,2 p 231 an integer b,2 b p and an integer n,1 n p compute the discrete logarithm of n base b,modulo p that is,find an integer ...

uva 11916 大步小步演算法

uva11916 emoogle grid rujia liu include include include include includeusing namespace std const int mod 100000007 const int maxb 500 10 int n,m,k,b,r...