裴蜀定理&&扩展欧几里得算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/SinclairWang/article/details/102686499

裴蜀定理

也就是Bezout定理,对于任意整数a,b,存在一对整数x,y,满足 a x + b y = g c d ( a , b ) ax+by=gcd(a,b)
在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理,裴蜀定理得名于法国数学家艾蒂安·裴蜀。
裴蜀定理说明了对任何整数 a、b和它们的最大公约数 d ,关于未知数 x 和 y 的线性丢番图方程(称为裴蜀等式)。

证明:

  • 若b=0时,此时迭代到算法的最后一步,显然存在一对整数, x = 1 , y = 0 x=1,y=0 ,使得 a 1 + 0 0 = g c d ( a , 0 ) a*1+0*0 = gcd(a,0)
  • 若b>0时,则 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b) = gcd(b,a\,mod\,b) ,假设存在一对整数 x 1 , y 1 x_1,y_1 ,满足 b x 1 + ( a m o d b ) y 1 = g c d ( b , a m o d b ) b*x_1+(a\,mod\,b)*y_1 = gcd(b,a\,mod\,b) ,因为 b x 1 + ( a m o d b ) y 1 = b x 1 + ( a a / b b ) y 1 = a y 1 + b ( x 1 ( a / b ) y 1 ) b*x_1+(a\,mod\,b)*y_1 = b*x_1+(a-a/b*b)y_1 = a*y_1 +b*(x_1-(a/b)*y_1)
  • 证毕

裴蜀定理是按照欧几里得算法的思路被证明的,并且同时给出了整数x和y的计算方法。这种计算方法被称为扩展欧几里得算法

联立一下
{ g c d = a x + b y g c d = a y 1 + b ( x 1 ( a / b ) y 1 ) \begin{cases} gcd=a*x+b*y \\ gcd = a*y_1 + b*(x_1-(a/b)*y_1) \end{cases}

可以得出
{ x = y 1 y = x 1 ( a / b ) y 1 \begin{cases} x=y_1 \\ y = x_1-(a/b)*y_1 \end{cases}

实现

int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x = 1,b = 0;
		return a;
	}
	int ans = exgcd(b,a%b,x,y);
	int z = y;
	y = x - (a/b)*z,x = z;
	return ans;
}

说明

上述程序求出的是一组特解 x 0 , y 0 x_0,y_0 ,并返回a,b的最大公约数d。

未完,待续…

猜你喜欢

转载自blog.csdn.net/SinclairWang/article/details/102686499
今日推荐