exgcd&二元一次丢番图方程
exgcd,二元一次丢番图方程
1.定理
对于任意整数\(a,b\),存在一对整数\(x,y\),满足\(ax + by = gcd(a,b)\).
2.证明
1 | int gcd(int a,int b) { |
这是辗转相除法求gcd的代码。
我们可以发现当\(b = 0\)时,有一组\(x = 1,y = 0\),使得\(ax + by = a \times 1 + b \times 0 = gcd(a,b) = a\)。
对于任意一组\(a,b\),假设存在一对整数\(x,y\)使得\(bx + (a \% b)y = gcd(b,a \% b) = gcd(a,b)\),对它变形: \[ bx + (a \% b)y = gcd(b,a \% b) = gcd(a,b)\\bx + (a - b \times \lfloor a / b \rfloor)y = gcd(a,b)\\ya + (x - y \times \lfloor a / b \rfloor)b = gcd(a,b) \] 所以我们有了一对\(x' = y,y' = x - y * \lfloor a / b \rfloor\)使得\(ax' + by' = gcd(a,b)\)。
3.代码
1 |
|
4.求通解
上文中我们求出了一对\(x_0,y_0\)满足\(ax_0 + by_0 = gcd(a,b)\),现在来求通解。
取一组解\((x_1,y_1)\),再任取一组解\((x_2,y_2)\),有: \[ ax_1 + by_1 = ax_2 + by_2 = gcd(a,b)\\a(x_1 - x_2) = b(y_2 - y_1)\\两边同时除以gcd(a,b),设a / gcd(a,b) = a',b / gcd (a,b) = b'\\a'(x_1 - x_2) = b'(y_2 - y_1)\\此时gcd(a',b') = 1\\所以x_1 - x_2 = kb',y_2 - y_1 = ka' \]
5.另外一个定理
关于整数\(x,y\)的方程\(ax + by = c\)有解的充要条件是\(gcd(a,b)|c\)。