扩展欧几里得算法

扩展欧几里得算法

定义:

贝祖定理对于任意整数a,b,存在一对整数x,y,满足ax+by=gcd(a,b)

用欧几里得算法计算一组x,y的方法,称作“扩展欧几里得”算法

求解

思路

假设a>b

[(1) b=0:gcd(a,b)=a,ax+by=a,则x=1,y=0; ]

[(2)b eq0,如图 ]

求解扩展欧几里得

Code

int exgcd(int a,int b,int &x,int &y){//求解ax+by=gcd(a,b)x,y 并返回 最大公约数 
	if(b==0){
		x=1,y=0;
		return a;
	}
	int d=exgcd(b,a%b,x,y);
	int tmp=x;x=y;y=tmp-(a/b)*y;
	return d;
}

一般

对于ax+by=c 该方程有解当且仅当

gcd(a,b)|c

此时可先求ax+by=gcd(a,b)的解x',y',即ax'+by'=gcd(a,b),令d=gcd(a,b),等式两边同时乘以c/d可得原方程的一组解为:

[left{egin{matrix}x={x}'cdot c/d \ y={y}'cdot c/d end{matrix} ight. ]

Ps:通解

[left{egin{matrix}x={x}'cdot frac{c}{d}+kfrac{b}{d} \ y={y}'cdot frac{c}{d}-kfrac{a}{d} end{matrix} ight. ]

•通解说明:

•ax+by=c,令a(x+t1)+b(y+t2)=c,可得

•at1=-bt2,左右两边必须同时包含a,b的因子

•最小的满足上式的正整数为lcm(a,b)

•即

[acdot t1=-bcdot t2=kcdot lcm(a,b) ]

•则

[t1=k cdot frac{lcm(a,b)}{a}=kcdot frac {frac{acdot b}{gcd(a,b)}}{a}=kcdot frac{b}{gcd(a,b)} ]

[t2=-k cdot frac{lcm(a,b)}{a}=-kcdot frac {frac{acdot b}{gcd(a,b)}}{a}=-kcdot frac{b}{gcd(a,b)} ]

获得最小正解的方法:

令d=gcd(a,b);

首先获得一个解x':

[x=x{'}cdot frac{c}{d} ]

根据通解修正为正数:

[x=(x\%frac{b}{d}+frac {b}{d})\%frac{b}{d} ]

得到另一个解y:

[y=frac{c-a*x}{b} ]

应用

应用1:求解线性同余方程

1)什么是线性方程:

我们把一次方程(图像是直线)称作线性方程,比如O(n)算法常被称作线性时间。

2)什么是线性同余方程:

形如

[axequiv bleft ( mod m ight ) ]

叫做线性同余方程。

3)求解思路:

方程等价于m|(ax-b),即ax-b是m的倍数,不妨设为-y倍。于是该方程改写为:ax+my=b

剩下的根据扩展欧几里得定理求解。

由欧几里得:有解时当且仅当gcd(a,m)|b

在有解时,先用欧几里得算法求出一整数x0,y0,满足

[a cdot x_0+m cdot y_0=gcdleft( a,m ight) ]

然后

[x=x_0 cdot b/gcdleft(a,m ight) ]

就是原线性同余方程的一个解。

方程的通解则是所有模m/gcd(a,m)与x同余的整数。

获得最小正解的方法:

令d=gcd(a,b);

首先获得一个解x':

[x=x{'}cdot frac{c}{d} ]

根据通解修正为正数:

[x=(x\%frac{m}{d}+frac {m}{d})\%frac{m}{d} ]

例题:青蛙约会

这篇博客

应用2:乘法逆元

1)概念:

[bcdot x equiv 1left(mod m ight) ]

且b,m互质,则称x为b的逆元,记作

[b^{-1}left(不仅仅是frac{1}{b} ight) ]

2)作用:

根据可乘性,两边同时乘以a,再同除以b(因为b,m互质所以可以除),得

[frac{a}{b} equiv a cdot b^{-1} left(mod m ight) ]

可以看出,通过逆元可以把除法的求余运算变成乘法的求余运算。

3)求解思路:

方法一:(效率较高,常用)

显然,b,m互质时,对于

[bcdot xequiv 1left(mod m ight),gcdleft(b,m ight)=1|1 ]

满足线性同余方程有解的条件,所以可用扩展欧几里得算法求出x,即为b模m的逆元。

方法二:

显然,b,m互质时,根据欧拉定理可得

[b^{varphi left(m ight)}=1left(mod m ight) ]

[b^{varphi left(m ight)}=bcdot b^{varphi left(m ight)-1} ]

[b^{varphi left(m ight)-1} ]

为b模m的逆元

特别的,当m本身是质数的时候,由费马小定理(欧拉定理)可得

[b^{m-1}equiv 1left(mod m ight) ]

[b^{m-2} ]

就是b模m的逆元。

原文地址:https://www.cnblogs.com/saitoasuka/p/10335922.html