扩展的 GCD 可用于计算两个互质数的模逆。
gmp_invert 在内部使用此扩展的 GCD 例程,
但实际上会丢弃其中一个逆。
如果 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 — 计算 GCD 和乘数
计算 g、s 和 t,使得 a*s + b*t = g = gcd(a,b)
,其中 gcd 是最大公约数。返回一个包含相应元素 g、s 和 t 的数组。
此函数可用于求解两个变量的线性丢番图方程。这些方程仅允许整数解,并具有以下形式:a*x + b*y = c
。有关更多信息,请访问 » "丢番图方程" 页面,位于 MathWorld
一个包含 GMP 数值的 array。
范例 #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
?>