我们需要解决 (a^x equiv b (mod M)) 的一个解 (x),其中 (a, p) 互质。
首先,如果有解,那么解一定在 ([0, p]) 这个区间内,根据抽屉原理,(a^x mod p) 只会有 (p - 1) 个取值,故 ([0, p]) 中至少会存在两个相同余数的数,即一定存在一对 (i, j) 满足 (a^iequiv a^j (mod M)),那么在 (i) 之后,(a^i mod M, a^{i + 1} mod M, cdots a^{j} mod M) 这些数会循环出现,故如果有解,那么解一定在 ([0, p]) 这个区间内。
我们考虑把 (x) 进行拆分,(x=qm-p),其中 (m=leftlfloorsqrt{x} ight floor+1),(q in [1, m]),(p in [0, m])。
显然,(qm-p) 可以表示出 (0 sim m) 中的所有数。
我们把原式修改一下得到 (a^{qm-p} equiv b (mod M)),(a^{qm} equiv b imes a^{p} (mod M))
我们发现 (q) 与 (p) 没有关系了,考虑先 (O(sqrt{x})) 枚举 (p),把 ((b imes a^p) mod M) 放入哈希表(map 也行),然后再 (O(sqrt{x})) 枚举 (a^{qm}),找到最小的 (q) 满足 (a^{qm} mod M) 在哈希表中出现过,那么 (qm+p) 就是最小的答案。
扩展 BSGS
我们要解决的还是 (a^xequiv b (mod p)) 这个问题,只是不满足 (a) 与 (p) 互质。
若 (a) 与 (p) 互质,那么就会存在逆元,可以将 (x) 分解为 (qm - p) 来求解,所以我们要想办法让 (a, p) 变得互质。
我们考虑把这个式子转化为不定方程,(a^x -yp = b),首先,我们求出 (d_1=gcd(a, p)),然后整个式子都除以 (d_1),若 (b) 与 (d_1) 互质,那么就无解,否则我们继续求出 (d_2=gcd(a, p)),一直进行下去,直到 (a) 与 (p) 互质。
假设进行了 (k) 次,最后得到式子就是 (dfrac{a^k}{prodlimits_{i=1}^{k}d_i} imes a^{x-k}-dfrac{yp}{prodlimits_{i=1}^{k}d_i}=dfrac{b}{prodlimits_{i=1}^{k}d_i}),其中 (a) 与 (p) 互质。
我们再化为同余方程的形式,(dfrac{a^k}{prodlimits_{i=1}^{k}d_i} imes a^{x-k}equiv dfrac{b}{prodlimits_{i=1}^{k}d_i} (mod dfrac{p}{prodlimits_{i=1}^{k}d_i})),显然,求出 (dfrac{a^k}{prodlimits_{i=1}^{k}d_i}) 的逆元,然后直接移到右边,直接用 BSGS 来解决,然后最后把答案加上 (k) 即可。
注意,不保证答案小于 (k) 的情况,故在消因子前做一下 (O(k)) 枚举,直接验证 (a^i equiv b (mod p)),就能避免这种情况。