有方程:a^x mod b = c;
已知a,b,c求一个最小的x
把式子变换为
a^(x'k+y) mod b = c >>
a^y mod b = c / a^(x'k)
我们可以枚举x',然后查找在a^(0~k-1)内是否有 c / a^(x'k) ,复杂度为 k+n/k,易知k为sqrt(n)时最优。
接下来的工作就是求a^(x'k)乘法逆元,由于b不是质数,不可以用欧拉函数,不过实际上我们是可以把bc的公因数提取出来的,提取出来之后就进入了一个phi(b/gcd(b,c))的循环节中,可以求逆元了,由于a^x不一定含有这个公因数所以之前要先朴素的运算到大约40左右(43是我学号,纯属蛋疼),在40次运算过后就进入这个循环节了,如果没有进入就肯定是No Solution 了。