1. 程式人生 > >使用裴蜀公式來求解線性方程組的第一個大於零的解

使用裴蜀公式來求解線性方程組的第一個大於零的解

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;
    }    
}