数论笔记
BSGS(大步小步法)
求解形如(a^x equiv b (mod p))的方程的(x)解((gcd(a,b) = 1))
令(x = msqrt{p}-n(m,nleq sqrt{p})),那么(a^{msqrt{p}-n}equiv b(mod p)),将两边同乘一个(a^n),可得(a^{msqrt{p}}equiv ba^n(mod p))
然后先枚举(n),用哈希表把右边存下来,再枚举(m),看有无能与它同余的(n)值,就可以知道(x)。
若要求最小解,哈希表中相同哈希值的那一位取(n)的最大值,然后在比较的时候取一下(max)值就好了。
总结:数论中常用的构造法的一个鲜明的例子,将枚举(p)次构造成两边各枚举(sqrt{p})次,以后数论中要常想到用这种构造法。
扩展BSGS
假如上面的(a,p)不互质该怎么办呢?
辣么我们通过不断除去(gcd(a,p)),来使它们变得互质,具体而言:
首先求(gcd(a,p)=c_i),然后可以得到(frac{a}{c_i}a^{x-1}equiv frac{b}{c_i}(mod frac{p}{c_i}))
然后,(frac{a}{c_i}a^{x-1})与(frac{p}{c_i})可能依然不互质,那么我们依葫芦画瓢,再除去一个(gcd(a,frac{p}{c_i}))。
如果仍然不互质,就一直除到两者互质为止,假设我们除了(k)次,那么我们可得
(frac{a^k}{prod_{i=1}^{k} c_i}a^{x-k}equiv frac{b}{prod_{i=1}^{k} c_i}(mod frac{p}{prod_{i=1}^{k} c_i}))
然后(frac{a^k}{prod_{i=1}^{k} c_i})是个可以算出来的常量,我们把它除到右边去就好了,因为(frac{p}{prod_{i=1}^{k} c_i})与(a)互质,所以有逆元,可以除。
当然,(x)可能小于(k),我们(O(sqrt{p}))的时间直接枚举看看在小于(k)的范围内有没有解就好了。