欧几里得算法(gcd)与扩展欧几里德算法

  • 以下 a b \frac{a}{b}代表的均是下取整之后的结果

欧几里得算法(gcd)

欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。也叫辗转相除法(取自百度)
代码为

int gcd(int a, int b)
{
	return b ?  gcd(b, a % b) : a;
}

只需要证明 g c d ( a , b ) = = g c d ( b , a % b ) gcd(a, b) == gcd(b, a \% b) 即可
假设a与b的最大公约数为c,由于 a % b = a a b b a\%b=a - \frac{a}{b} * b
明显最大公约数一样

扩展欧几里得算法

一般用于求方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) 的解
又由欧几里得算法知 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b)
则方程可以写成 b x 1 + ( a % b ) y 1 = g c d ( b , a % b ) = g c d ( a , b ) bx_1+(a\%b)y_1=gcd(b,a\%b)=gcd(a,b)
把上式左边展开合并同类项有 a y 1 + b ( x 1 a b y 1 ) = g c d ( a , b ) ay_1+b(x_1-\frac{a}{b}*y_1)=gcd(a,b)
因此我们可以通过递归来求解,求出下一层解之后,只需要通过 x = y 1 , y = x 1 a b y 1 x=y_1,y = x_1-\frac{a}{b}*y_1 来替换即可
而当b递归到零时, a x + b y = a ax+by=a ,明显 x = 1 , y = 0 x=1,y=0 即为次方程的解,而将这个一步一步递归到最顶层时,即可求出方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) 的解
代码为

int x, y;
int exgcd(int a, int b)
{
	if(!b)
	{
		x = 1, y = 0;
		return a;
	}
	int d = exgcd(b, a % b);
	int t = x;
	x = y;
	y = x - a / b * y;
	return d;
}
发布了2 篇原创文章 · 获赞 13 · 访问量 867

猜你喜欢

转载自blog.csdn.net/weixin_43819867/article/details/105348198
今日推荐