baby step giant step

我们研究一些小问题

先研究对于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


你可能感兴趣的:(baby step giant step)