扩展欧几里得算法
以前写的= = 现在发的原因是 懒得写博客= =
(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)))
- 给出方程(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)