BSGS 大步小步演算法

2022-08-19 07:57:08 字數 928 閱讀 2790

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,我們就得到了乙個\(o(p)\)的演算法,然而太慢了。

考慮分塊演算法,對\(x\)每\(m\)分一塊,則有

\[a^\equiv b\pmod

\]移項整理

\[\left(a^m\right)^i\equiv a^j b\pmod

\]那麼我們列舉\(i\),就可以求出\(a^j\)。再對於\(j\in[0,m-1]\)的\(a^j\)存進雜湊表/map,就可以得到\(x=im-j\)了。如果不考慮查詢雜湊表/map的時間,則時間複雜度為\(o(m+\frac)\)。

那\(m\)應該取何值呢?由基本不等式顯然有:

\[m+\frac\ge\sqrt}=\sqrt

\]當\(m=\frac\)時取等。

那麼我們令\(m=\lceil\sqrt\rceil\),就得到了乙個\(o(\sqrt)\)的演算法。

\(-1\)為無解。

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

return ans;

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

ll am=pow(a,m,p),aj=am*pow(b,p-2,p)%p;

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

return -1;

}int main()else

}}

大步小步演算法

考慮這樣乙個問題 題目給定正整數 a,b,p 求滿足 a x equiv b pmod p 的所有正整數解 x 保證 p 是素數。分析首先由費馬小定理,a equiv 1 pmod p 也就是說暴力演算法只需要列舉到 p 1 即可,我們考慮優化。我們考慮只暴力求解 a x bmod p 的前 m 個...

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...