BSGS離散對數(Baby-Step-Giant-Step)
阿新 • • 發佈:2017-12-29
blog 常數 離散 自然 處理 sqrt 插入 如果 枚舉
BSGS離散對數(Baby-Step-Giant-Step)
題目:
給定\(x,y,p,\)求最小的自然數\(k\)滿足\(x^k=y(\mod p)\)\(p\le2^{31}\)(滿足一定有答案)
題解:
因為\(x^{p-2}=1\pmod{p}\)
那麽答案最大不會超過\(p-2\),因為大於的話直接減掉\(p-2\)同樣成立
直接枚舉復雜度是\(O(p)\)級別的
考慮\(k\)可以表示成\(a\sqrt p +b\)的形式,那麽我們考慮要怎麽求\(a,b\)
若\(a,b\)滿足要求,既\(x^{a\sqrt p }\times x^{b}=y \pmod{p}\)
既\(x^{a\sqrt p}=y\times x^{-b} \pmod{p}\)
那麽,如果我們對於每個\(x^{a\sqrt(p)}\)都可以\(O(1)\)判斷,那麽整個算法的復雜度就可以降到\(O(\sqrt p)\)
對於\(1\)到\(\sqrt p\)我們直接處理,將其\(x^{-b}\times y\pmod{p}\)插入哈希表(因為p太大了所以不能直接用數組)。
那麽對於每個\(x^{a\sqrt{p}}\)即可在哈希表中查找。
那麽復雜度就是\(O(\sqrt{p}\times 哈希表常數)\)
即可解決問題\(√\)
核心思想:
暴力出奇跡,轉成根號級別的暴力,復雜度就對了。
BSGS離散對數(Baby-Step-Giant-Step)