2024年PHP开发者大会 日本

gmp_gcdext

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

gmp_gcdext计算GCD和乘数

描述

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 对象,一个int,或一个string,它可以解释为一个数字,其逻辑与在gmp_init()中使用字符串进行自动基数检测(即base等于0时)相同。

num2

一个GMP 对象,一个int,或一个string,它可以解释为一个数字,其逻辑与在gmp_init()中使用字符串进行自动基数检测(即base等于0时)相同。

返回值

一个包含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
?>

添加注释

用户贡献的注释 1 条注释

1
FatPhil
21年前
扩展的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之一将为负数,因此您需要
将其规范化。
To Top