我们研究一些小问题
先研究对于a^L mod c = b(已知a,b,c, c为质数,求最小的L)的情况。
那么对于L < C的情况:
设m = [sqrt(c)],L = k*m + j;
则(a^(k*m))*(a^j) mod c = b;
baby step:
我们可以知道j < m
我们预处理出a^0 ~ a^(m-1) % c,并且将他们堆入Hash中。(O(m))
giant step:
我们设a^(-m) = p
则(a^j) mod c = b * (p^k) mod c;
我们枚举k.
若b*(p^k) mod c存在于Hash表当中,那代表我们已经找到答案了,可以直接退出。
O(m)
总体复杂度O(m)
练习题:poj2417
接下来是比较难的问题。
给定a,b,c(只有大小限制), 求最小的L使得a^L mod c = b
这题没有了上题的a,b,c互质的情况。
我们可以进行一些消元。
设a^L = k * c + b;
则a * a^(L-1) = k * c + b;
设gcd(a,c) = d
那么(a/d) * a^(L - 1) = k * (c / d) + b/d;
若b mod d <> 0,那么无解。
否则我们记录一个D = π(a/d),d = a除的次数。
那么到最后我们就可以得到D * a^j mod c' = b'
并且此时a,b,c互质了。
我们直接套用上面的普通解法即可。
练习题:spoj_MOD
spoj_Mod