使用裴蜀公式來求解線性方程組的第一個大於零的解
1. 假設方程組為ax + by = m
在數論中,裴蜀定理是一個關於最大公約數(或最大公約式)的定理。裴蜀定理得名於法國數學家艾蒂安·裴蜀,說明了對任何整數a、b和它們的最大公約數d,關於未知數x和y的線性丟番圖方程(稱為裴蜀等式):
ax + by = m
有解當且僅當m是d的倍數。裴蜀等式有解時必然有無窮多個整數解,每組解x、y都稱為裴蜀數,可用輾轉相除法求得。
例如,12和42的最大公因子是6,則方程12x + 42y = 6有解。事實上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 = 6。
特別來說,方程 ax + by = 1 有解當且僅當整數a和b互素。
裴蜀等式也可以用來給最大公約數定義:d其實就是最小的可以寫成ax + by形式的正整數。這個定義的本質是整環中“理想”的概念。因此對於多項式整環也有相應的裴蜀定理
所以在求解兩個數的最大公約數的時候不斷更新x和y,當求出的解x小於零的時候通過迴圈加上B的倍數那麼就可以得到第一個大於零的解
2.程式碼如下:
import java.util.Scanner;
public class Main{
static long x;
static long y;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long A = sc.nextLong();
long B = sc.nextLong();
long C = sc.nextLong();
long res;
try {
res = linearEquation(A, B, C);
System.out.println(" x = " + res);
} catch (Exception e) {
System.out.println("無解");
}
}
public static long ext_gcd(long A, long B){
if(B == 0){
x = 1;
y = 0;
return A;
}
long res = ext_gcd(B, A % B);
long x1 = x;
x = y;
y = x1 - (A / B) * y;
return res;
}
public static long linearEquation(long A, long B, long C) throws Exception{
long d = ext_gcd(A, B);
if(C % d != 0){
throw new Exception("無解");
}
A /= d;
B /= d;
C /= d;
x *= C;
//通解求出第一個大於零的解
// A'x'+B'y'+(u+(-u))A'B'=1
// => (x' + uB')*A' + (y' - uA')*B' = 1
// => X = x' + uB', Y = y' - uA'
while(x < 0){
x += B;
}
y = (C - A * x) / B;
System.out.print("y = " +y);
return x;
}
}