Baby-step giant-step

轉自:http://qinz.maybe.im/?p=50398

不知道爲什麼這算法會有這麼詭異的名字,比“舞蹈鏈”(Dancing link)還詭異。但話說回來,這算法確實是我數論學習上的Baby-step giant-step,另外發現自己似乎很久沒寫月志了,就寫篇紀念下吧~(其實算是Wikipedia上這篇文章的簡單翻譯-_-b)


定理的條件:m爲質數  

衆所周知,a^b \equiv c \pmod m,其中m爲質數,式中已知a、b、m求c很方便,用快速模取幕可以在O(\log_2 m)的時間複雜度求出來。但如果已知a、c、m求b就不是那麼容易求了,簡單地枚舉需要O(m)的時間,但在競賽中這時間複雜度基本不可能通過。而Baby-step giant-step算法利用b=in+j \,,n=\lceil \sqrt{m} \rceil \,,0 \leq i < m \,,0 \leq j < ma^b \equiv c \pmod m轉化爲c(a^{-n})^i \equiv a^j \pmod m,利用Hash(或者二分查找)很強勢地使時間複雜度降到了O(\sqrt m),這種時間複雜度下對於m<2^{32}的數據範圍來說是綽綽有餘的。下面就來介紹下這種神奇又簡單的算法(如果m是個合數的話還有一種更快的算法叫Pohlig-Hellman algorithm,大致思路是把合數分解再用中國剩餘定理合併起來,本文不作討論):

  1. 令n=ceil(\sqrt m)
  2. for j=0 to n-1
      計算出每一對(j,a^j)保存在Hash表裏
  3. 計算出am滿足a^{-n} \equiv am \pmod m
  4. t=c
  5. for i=0 to n-1
      檢查t是否在Hash表裏,如果在就返回i*n+j,如果不在t=t*am
發佈了18 篇原創文章 · 獲贊 12 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章