BSGS离散对数(Baby-Step-Giant-Step)
题目:
给定(x,y,p,)求最小的自然数(k)满足(x^k=y(mod p))(ple2^{31})(满足一定有答案)
题解:
因为(x^{phi(p)-1}=1pmod{p})
那么答案最大不会超过(phi(p)-1),因为大于的话直接减掉(phi(p)-1)同样成立
直接枚举复杂度是(O(p))级别的
考虑(k)可以表示成(asqrt p +b)的形式,那么我们考虑要怎么求(a,b)
若(a,b)满足要求,既(x^{asqrt p } imes x^{b}=y pmod{p})
既(x^{asqrt p}=y imes x^{-b} pmod{p})
那么,如果我们对于每个(x^{asqrt p})都可以(O(1))判断,那么整个算法的复杂度就可以降到(O(sqrt p))
对于(1)到(sqrt p)我们直接处理,将其(x^{-b} imes ypmod{p})插入哈希表(因为p太大了所以不能直接用数组)。
那么对于每个(x^{asqrt{p}})即可在哈希表中查找。
那么复杂度就是(O(sqrt{p} imes 哈希表常数))
即可解决问题(√)
核心思想:
暴力出奇迹,转成根号级别的暴力,复杂度就对了。