逆元

我们需要考虑如何求解线性方程axb(mod m)。对于实数运算下的方程ax=b我们既然已经知道了a的倒数,那我们可以直接通过a的倒数乘b求得方程的解,如果在(mod m)的运算下,也有类似于a的倒数一样的数存在,方程就可以解了。如果存在ay1(mod m)我们把这样的数y叫做a的逆元,记作a-1。如果能求解逆元,那么就有x=a-1*xa=a-1*b这样也就求出x了,由于方程ax1(mod m)等价于存在整数k使得ax=1+mk,因此可以推出ax-mk=1x的问题,所以我们可以用扩展欧几里得算法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;

}

如果am不互质那么axb(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)

求逆元的话除了这种“定义法”,还可以用欧拉定理和费马小定理来求解

posted @ 2016-01-27 10:06  543~  阅读(254)  评论(0编辑  收藏  举报