擴展歐幾里得演算法可用於計算兩個
互質數的模反元素。gmp_invert 內部使用此擴展歐幾里得演算法,
但實際上丟棄了其中一個反元素。
若 gcd(a,b)=1,則 r.a+s.b=1
因此 r.a ≡ 1 (mod s) 且 s.b ≡ 1 (mod r)
注意 r 和 s 其中一個會是負數,所以你會想要
將其正規化。
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
gmp_gcdext — 計算最大公因數及其乘數
計算 g、s 和 t,使得 a*s + b*t = g = gcd(a,b)
,其中 gcd 為最大公因數。返回一個包含 g、s 和 t 的陣列。
這個函數可以用於求解兩個變數的線性丟番圖方程式。這些方程式只允許整數解,形式如下:a*x + b*y = c
。更多資訊,請前往 MathWorld 的 » 「丟番圖方程式」頁面
num1
一個 GMP 物件、一個 整數,或者一個可以被解釋為數字的 字串,其遵循與在 gmp_init() 中使用字串並啟用自動基數檢測(即 base
等於 0 時)相同的邏輯。
num2
一個 GMP 物件、一個 整數,或者一個可以被解釋為數字的 字串,其遵循與在 gmp_init() 中使用字串並啟用自動基數檢測(即 base
等於 0 時)相同的邏輯。
一個 GMP 數字的 陣列。
範例 #1 求解線性丟番圖方程式
<?php
// 解方程式 a*s + b*t = g
// 其中 a = 12, b = 21, g = gcd(12, 21) = 3
$a = gmp_init(12);
$b = gmp_init(21);
$g = gmp_gcd($a, $b);
$r = gmp_gcdext($a, $b);
$check_gcd = (gmp_strval($g) == gmp_strval($r['g']));
$eq_res = gmp_add(gmp_mul($a, $r['s']), gmp_mul($b, $r['t']));
$check_res = (gmp_strval($g) == gmp_strval($eq_res));
if ($check_gcd && $check_res) {
$fmt = "解:%d*%d + %d*%d = %d\n";
printf($fmt, gmp_strval($a), gmp_strval($r['s']), gmp_strval($b),
gmp_strval($r['t']), gmp_strval($r['g']));
} else {
echo "解方程式時發生錯誤\n";
}
// 輸出:解:12*2 + 21*-1 = 3
?>