1.公式推导
假设现在有两个数x,y,求x mod y的逆元。
1.贝祖定理:任意两个整数a,b,最大公约数为d=gcd(a,b),那么对于任意的整数x,y,ax+by=m,构成的m一定是d的整数倍(即m%d=0)。
2.设第一个等式为ax0+by0=gcd(x0,y0),第二个等式为bx1+(a%b)y1=gcd(b,a%b),则x0=y1,y0=x1-(a/b)y1,详细推导见下图。
3.最后返回的gcd一定等于1,否则逆元不存在。
4.当y=0时,x=1,a=1(此时a是最大公约数)。
2.代码
int extendedGCD(int a, int m, int& x, int& y) {
if (m == 0) {
x = 1;
y = 0;
return a;
}
int x1, y1;
int gcd = extendedGCD(m, a % m, x1, y1);
//得到上一个x0和y0
x = y1;
y = x1 - (a / m) * y1;
return gcd;
}
// 计算逆元
int modInverse(int a, int m) {
int x, y;
int gcd = extendedGCD(a, m, x, y);
if (gcd != 1) {
// 如果最大公约数不是 1,则没有逆元
std::cerr << "逆元不存在,因为最大公约数不是1。" << std::endl;
return -1;
}
// 确保逆元为正数
return (x % m);
}
int main() {
int a, m;
std::cin >> a >> m;
int inverse = modInverse(a, m);
if (inverse != -1) {
std::cout << inverse << std::endl;
}
return 0;
}