Forever Young

「笔记」浅谈扩展欧几里得算法

扩展欧几里得算法

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

\(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 - \lfloor\frac{a}{b} \rfloor * b\)

所以原式可以转化为:

\(ax+by = bx_1 + (a - \lfloor\frac{a}{b} \rfloor * b)y_1\)

\(ax+by=bx_1+ay_1 - \lfloor\frac{a}{b} \rfloor by_1\)

\(ax+by=ay_1 + b(x_1-\lfloor\frac{a}{b}\rfloor y_1)\)

由此得

\(x = y_1,y = x_1 - \lfloor\frac{a}{b} \rfloor 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\)
posted @ 2020-04-22 11:07  Loceaner  阅读(255)  评论(0编辑  收藏  举报