轉自:http://qinz.maybe.im/?p=50398
不知道爲什麼這算法會有這麼詭異的名字,比“舞蹈鏈”(Dancing link)還詭異。但話說回來,這算法確實是我數論學習上的Baby-step giant-step,另外發現自己似乎很久沒寫月志了,就寫篇紀念下吧~(其實算是Wikipedia上這篇文章的簡單翻譯-_-b)
定理的條件:m爲質數
衆所周知,,其中m爲質數,式中已知a、b、m求c很方便,用快速模取幕可以在的時間複雜度求出來。但如果已知a、c、m求b就不是那麼容易求了,簡單地枚舉需要的時間,但在競賽中這時間複雜度基本不可能通過。而Baby-step giant-step算法利用把轉化爲,利用Hash(或者二分查找)很強勢地使時間複雜度降到了,這種時間複雜度下對於的數據範圍來說是綽綽有餘的。下面就來介紹下這種神奇又簡單的算法(如果m是個合數的話還有一種更快的算法叫Pohlig-Hellman algorithm,大致思路是把合數分解再用中國剩餘定理合併起來,本文不作討論):
- 令n=ceil()
- for j=0 to n-1
計算出每一對(j,)保存在Hash表裏 - 計算出am滿足
- t=c
- for i=0 to n-1
檢查t是否在Hash表裏,如果在就返回i*n+j,如果不在t=t*am