void exgcd(int a, int b){
if(!b) {
x = 1; y = 0;
return;
}
exgcd(b,a%b);
int tmp = x;
x = y; y = tmp - (a / b) * y;
}
至此,我们成功找到了 ax+by=gcd(a,b) 的一组解 (x,y) ,可是这又有什么用呢?
Part 3:乘法逆元
定义:我们定义当 ax \equiv1(\bmod b) 时, x 被称为 a 在模 b 意义下的乘法逆元(即模 b 情况下的倒数)
我们都知道,除以一个数等于乘上它的倒数,所以如果我们要在模 p 意义下除以一个数,只需要乘上它在模 p 意义下的乘法逆元即可。乘法逆元是我们解决分数取模的有力工具
那么,怎么求乘法逆元呢?我们回到它的定义式
ax\equiv 1
由于是在模 b 意义下,所以左边可以加任意个 b 而使得同余符号仍成立,于是我们不妨令 ax+by=1
是不是很眼熟?我们刚刚解决过的 ax+by=gcd(a,b) 的问题又出现了,但是在这里,它强制要求 a,b 互质。用拓展欧几里得算法我们可以轻松地求出一组满足条件的解 (x,y) (事实上, a,b 互质是存在一个 x 满足这个定义式的充要条件)。但是很多时候求出来的 x 未必是最小的非负整数,这个时候我们可以通过对 x 批量加减 b 来找到其它所有解,因为: