逆元
我们需要考虑如何求解线性方程ax≡b(mod m)。对于实数运算下的方程ax=b我们既然已经知道了a的倒数,那我们可以直接通过a的倒数乘b求得方程的解,如果在(mod m)的运算下,也有类似于a的倒数一样的数存在,方程就可以解了。如果存在ay≡1(mod m)我们把这样的数y叫做a的逆元,记作a-1。如果能求解逆元,那么就有x=a-1*xa=a-1*b这样也就求出x了,由于方程ax≡1(mod m)等价于存在整数k使得ax=1+mk,因此可以推出ax-mk=1的x的问题,所以我们可以用扩展欧几里得算法extgcd(已在前文中说过),同时也可以知道如果gcd(a,m)!=1,逆元是不存在的。
伪代码如下:
int mod_inverse(int a,int m){
int x,y;
extgcd(a,m,x,y);
return (m+x%m)%m;
}
如果a,m不互质那么ax≡b(mod m)就等价于(a/gcd(a,m))x≡(b/gcd(a,m))(mod m/gcd(a,m))
不难看出,如果b不含有gcd(a,m)时方程无解,在有解的情况下,我们有
x≡(a/gcd(a,m))-1*(b/gcd(a,m))(mod m/gcd(a,m))
所以,原方程的解为x≡(a/gcd(a,m))-1×(b/gcd(a,m))+(m/gcd(a,m))×k(mod m)
求逆元的话除了这种“定义法”,还可以用欧拉定理和费马小定理来求解