1 //求解模方程 a^x = b(mod n) n为素数,无解返回-1 2 int log_mod(int a, int b, int n) { 3 int m, v, e = 1, i; 4 m = (int) sqrt(n+0.5); 5 v = inv(pow_mod(a, m, n), n); 6 map<int, int> x; 7 x[1] = 0; 8 for(int i = 1; i < m; i++) { 9 e = e*a%n; 10 if(!x.count(e)) x[e] = i; 11 } 12 for(i = 0; i < m; i++) { 13 if(x.count(b)) return i*m + x[b]; 14 b = b*v%n; 15 } 16 return -1; 17 }