「笔记」浅谈扩展欧几里得算法
扩展欧几里得算法
以前写的= = 现在发的原因是 懒得写博客= =
\(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)\))
- 给出方程\(ax + by = c\)。
- 用辗转相除法算出\(d = \gcd(a, b)\)。
- 运用扩展欧几里德算法求出\(ax + by = gcd(a,b)\)的\(一组解(x1, y1)\)。
- 根据\(c % gcd(a, b)\)判断方程\(ax + by =c\)是否有解 。
- 根据\(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\)
转载不必联系作者,但请声明出处