1. 程式人生 > >BSGS離散對數(Baby-Step-Giant-Step)

BSGS離散對數(Baby-Step-Giant-Step)

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)