1. 程式人生 > >POJ 2417 Discrete Logging(BSGS演算法,gcd(a,p)=1)

POJ 2417 Discrete Logging(BSGS演算法,gcd(a,p)=1)

題目連結:
POJ 2417 Discrete Logging
題意:
axb(modp)的最小x。(p為素數,2a<p,1b<p)
分析:
BSGS
一開始用map一直T,參(zhao)考(ban)了這裡
用了hash才過。。。

BSGS演算法用於求解:ax=b(modp)在已知a,b,p(p)的情況下的最小解x。時間複雜度O(sqrt(p))
x=im+j,其中m=ceil(sqrt(p))0i<m,0j<m那麼就相當於求解:

aim+jb(modp)>aj=b(aim)(modp),aim
aimp

所以可以先處理出aj(modp)的答案放入一個hash表中BabyStep,然後列舉i:0>mGaintStep,查詢b(aim)(modp)是否在hash表中出現,如果出現,令出現的編號為id,則答案就是id+im.在時間允許的情況下,hash表採用map也可以。
為什麼列舉i<m就可以了呢?顯然列舉i<m就列舉完了x<p的所有情況。
x>=p時可以令x=kp+t(t<p),則ax(modp)=akp+t(modp)=(akpat)(modp)=((ap)k)(modp)at(modp).
由費馬小定理得:a
p
1(modp)p
,那麼ax(modp)=1k(modp)at(modp)=at(modp)
所以只需要列舉所有