已知y、z、p,求y^x≡z(mod p),p为质数。

证明:x最大只需取到p-2即可。有公式:y^(x mod(p-1))≡y^x(mod p)。x mod(p-1)可以看成x-m(p-1),那么原式变为y^(x-m(p-1))≡y^x(mod p),y^x/y^(p-1)^m≡y^x(mod p),根据费马小定理可知y^(p-1)≡1(mod p),于是得证。

设x=m*i+j(m是常量),那么y^(m*i-j)z(mod p),y^(m*i)z*y^j(mod p)。先从1到m枚举j,将z*y^j存放在hash中,然后再从1到p/m枚举i,在hash中寻找第一个满足y^(m*i)z*y^j(mod p)的i(看起来还真挺像meet in the middle)。很明显当m取sqrt(p)时时间复杂度最低,总时间复杂度为O(sqrt(p)*log(p))。