定义:
若a*x≡1(mod b),且a,b互质,则称a关于1模b的逆元为x,记作:a^-1 = x;
比如 : 2*x≡1(mod 3),a=2,a的逆元为a^-1=x=1 ;
自己的一点理解:
1,为什么要求a,b互质?
如果a,b不互质,设a=mt,b=nt,则有:mt*x≡1(mod nt);(t!=1)
变形得到: mt*x+nt*y=1;根据裴蜀定理ax+by=1,当a,b互质时才有整数解,故原方程无解。
2,乘法逆元比较小白的理解方法
对于ax=1,都知道x=1/a,写成指数就是x=a^-1,称之为a的倒数;
对于ax≡1(mod b),转化成ax+by=1,当 y=0 时,原式就是ax=1,即x=1/a。可见,所谓逆元,就是ax先对b取模,再来ax=1,算此时的x。说通俗一点,逆元x就可以看做a在0~b-1内运算的倒数,不过加上了取模操作~~
但要注意,这个“倒数”,大多数只用在mod b的乘除运算中(目前只学到这里)。下面具体笔记。
3,乘法逆元目前我所能及的用法
乘法逆元我这个阶段最大的用处是:取模中用除法的地方转化为乘法。
应该知道,对于a≡b(mod c),有ax≡bx(mod c),a+x≡b+x(mod c),a-x≡b-x(mod c),但是没有a/x≡b/x(mod c)!!!
因此,需要找到一个方法来代替除法,就是用逆元。
比如:t/a mod b,可以转化成:t*a^-1 mod b。对于计算机这很重要,例如t=5,a=2,b=3,我们知道(t/a) mod b=(5 mod 3)/(2 mod 3)=1,但是直接(t/a) mod b=2,有误差。
举个例子:
2x≡1(mod 3),a^-1=2;
如果要求:(5/2)mod 3,正确答案为1;
直接: 2.5mod 3=2;(计算机取整)
用逆元: (5/2)mod 3=5*a^-1 mod 3=10 mod 3=1,正确。
为什么正确?t直接除以a可能会造成误差,比如小数等等,计算机不认这个;而逆元是整数间相乘,不会有误差。由上可见,a^-1在0~b-1内确实起到了等同于a的倒数的作用,主要是替代了mod下的除法。
小学生一样的证明:
设方程: ax≡1(mod b);
则有: ax-by=1;
得到: a^-1=x=(by+1)/a;
对于式子: t/a mod b;
用逆元: t*(by+1)/a mod b;
=> b*ty/a+t/a mod b;
=> t/a mod b;
结果与原式相同。所以以后遇到除法后mod就放心大胆地用逆元。
注意:
根据定义,逆元可以有多个(定义记不清了233),一般使用逆元都用最小正整数。
千万记住,a,b互质时才存在逆元!!!
运用逆元,一定是mod同一个数的前提下。
理解时不用多想,当做倒数直接用,用于mod下除法转为乘法。
求逆元模板:
此处主要是扩展欧几里得,需另外学习....求出的是最小正整数解。还有其他方法待补充。
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
LL xx,yy;
LL g=exgcd(b,a%b,xx,yy);
x=yy;
y=xx-(a/b)*yy;
return g;
}
LL inverse(LL a,LL b)
{
LL x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
LL inv=inverse(a,n); // ax≡1(mod n)