浅谈扩展欧几里得算法

扩展欧几里得算法

以前写的= = 现在发的原因是 懒得写博客= =

(ax+by=gcd(a,b))

求满足等式的整数解(x,y)

假设(a>b)

假设有一组合法解为(x_1,y_1),则有(ax_1+by_1=gcd(a,b))

由欧几里得算法((gcd(a,b)=gcd(b, a\% b)))得

[ax + by = gcd(a,b) = gcd(b, a\%b) = bx_1 + (a \% b)y_1 ]

因为(a\% b = a - lfloorfrac{a}{b} floor * b)

所以原式可以转化为:

(ax+by = bx_1 + (a - lfloorfrac{a}{b} floor * b)y_1)

(ax+by=bx_1+ay_1 - lfloorfrac{a}{b} floor by_1)

(ax+by=ay_1 + b(x_1-lfloorfrac{a}{b} floor y_1))

由此得

(x = y_1,y = x_1 - lfloorfrac{a}{b} floor y_1)

这样就能得到一组合法解

(b=0)时 , (gcd(a,b)=a),
此时有唯一的解 : (x = 1,y = 0)

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

求ax+by=c的最小整数解

(下面的(d)都是指(gcd(a,b)))

  1. 给出方程(ax + by = c)
  2. 用辗转相除法算出(d = gcd(a, b))
  3. 运用扩展欧几里德算法求出(ax + by = gcd(a,b))(一组解(x1, y1))
  4. 根据(c % gcd(a, b))判断方程(ax + by =c)是否有解 。
  5. 根据(ax + by = c)的通解公式(x_1 = (x + k * (b / d)) * (c / d)),令(b_1 = b / d),所以(x_1)的最小正整数解为:(x_1 = (x_1 \% b_1 + b_1) \% b_1), 对应的 (y1 = (c - a*x_1) / b)
原文地址:https://www.cnblogs.com/loceaner/p/12750679.html