1. 程式人生 > >大步小步演算法(BSGS)及擴充套件 & bzoj 2480

大步小步演算法(BSGS)及擴充套件 & bzoj 2480

大步小步演算法用於解決離散對數問題:
求滿足axy(modp)的最小自然數x,其中ap互質,或者報告無解。

根據尤拉定理,aϕ(p)1(modp),所以,如果有解,必然有一個在[0,ϕ(p))內。為了簡單起見,直接考察[0,p1)

讓我們運用meet-in-middle的思想。設x=kmr(1rm)m是某個選定的數,那麼

(am)kyar(modp)
列舉r=1,2,...,m,將(yarmodp,r)存入一張表。列舉k=1,2,...,ceiling(pm),查詢是否存在r使得yar(am)kam用快速冪計算。如果存在,返回kmr;如果從未找到,則無解。

設表的插入和查詢的時間複雜度分別是O

(f(p))O(g(p)),則本演算法的時間複雜度為O(mf(p)+pmg(p)+lgm)。由算術-幾何均值不等式,有mf(p)+pmg(p)2pf(p)g(p),等號當且僅當mf(p)=pmg(p)時取得。當使用雜湊表或者map時,f(p)=g(p),於是m=p時。因此,對於每一個p,取m=p時演算法有最優複雜度。

使用雜湊表,BSGS的時間複雜度是O(p);使用map,BSGS的時間複雜度是O(plgp)

以上通過設x=kmr而非km+r避免了求逆元,但是需要逆元存在,ap$互質的條件保證了這一點。

如果ap不互質怎麼辦呢?
轉化。

ax=y
+kp

a>1,設g1=gcd(a,p),則y必須含因子g1,否則無解。約去這個g1,得
ag1ax1=yg1+kpg1
然而,也許g2=gcd(a,pg1)>1,那就再把g2約掉