PHP Conference Japan 2024

gmp_gcdext

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_gcdext計算最大公因數及其乘數

說明

gmp_gcdext(GMP|int|string $num1, GMP|int|string $num2): array

計算 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
?>

新增註解

使用者貢獻的註解 1 則註解

FatPhil
21 年前
擴展歐幾里得演算法可用於計算兩個
互質數的模反元素。gmp_invert 內部使用此擴展歐幾里得演算法,
但實際上丟棄了其中一個反元素。

若 gcd(a,b)=1,則 r.a+s.b=1
因此 r.a ≡ 1 (mod s) 且 s.b ≡ 1 (mod r)
注意 r 和 s 其中一個會是負數,所以你會想要
將其正規化。
To Top