初学乘法逆元的笔记(数论)

定义:

        若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) 



猜你喜欢

转载自blog.csdn.net/wwwengine/article/details/81009836