有方程: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 了。