PHP と GMP を使用して大きな数値の高速乗算を実装する方法
はじめに:
コンピューター サイエンスでは、整数演算は最も基本的でよく使用される演算の 1 つです。ただし、大きな整数が関与する場合、従来の算術手法は非効率的になります。この記事では、PHP で GMP (GNU Multiple Precision) ライブラリを使用して大きな数値の高速乗算を実装する方法を紹介し、対応するコード例を示します。
1) 乗算する 2 つの大きな数 $x$ と $y$ を $acdot10^m b$ と $acdot10^m b$ の形式に分解します。 $ccdot10^m d$, このうち、$a$と$c$はそれぞれ$x$と$y$の上位部分、$b$と$d$は$x$の下位部分で、それぞれ $y$ であり、$m$ は適切なビット数です。
2) 2 つの大きな数値を乗算して $(acdot10^m b)(ccdot10^m d)$ を取得します。式 $accdot10^{2m} [(a b)(c d)-ac-bd] cdot10^ を使用します。 m bd$ の計算結果。
3) 乗算の 3 つの部分 $ac$、$bd$、$(a b)(c d)$ を再帰的に計算します。
4) 基本ケースに到達するまで複数回再帰して、乗算の問題を単純な乗算に落とし込みます。
上記の手順により、大きな数の高速な乗算を実現できます。
<?php function multiply($x, $y) { $x_gmp = gmp_init($x); $y_gmp = gmp_init($y); // 当待乘数小于等于一个阈值时,直接返回乘法结果 if (gmp_cmp($x_gmp, "1000000") <= 0 || gmp_cmp($y_gmp, "1000000") <= 0) { return gmp_strval(gmp_mul($x_gmp, $y_gmp)); } // 将待乘数分解为高位部分$a$和低位部分$b$ $x_str = gmp_strval($x_gmp); $split_point = ceil(strlen($x_str) / 2); $a = substr($x_str, 0, -$split_point); $b = substr($x_str, -$split_point); // 将乘数对应分解为高位部分$c$和低位部分$d$ $y_str = gmp_strval($y_gmp); $c = substr($y_str, 0, -$split_point); $d = substr($y_str, -$split_point); // 计算子问题的结果 $ac = multiply($a, $c); $bd = multiply($b, $d); $abcd = multiply(gmp_add($a, $b), gmp_add($c, $d)); $ad_bc = gmp_sub($abcd, gmp_add($ac, $bd)); // 计算最终结果并返回 $result = gmp_add(gmp_mul(gmp_pow(10, 2 * $split_point), $ac), gmp_add(gmp_mul(gmp_pow(10, $split_point), $ad_bc), $bd)); return gmp_strval($result); } // 示例输入 $x = "12345678901234567890"; $y = "98765432109876543210"; // 调用乘法函数 $result = multiply($x, $y); echo "Result: " . $result . " "; ?>
上記のコードの使用、大きな数値の高速な乗算を実装できます。
結論:
この記事では、PHP で GMP ライブラリを使用して大きな数値の高速な乗算を実装する方法を紹介します。高速乗算アルゴリズムを使用すると、乗算演算の複雑さを $O(n^2)$ から $O(nlog n)$ に減らすことができ、アルゴリズムの効率が向上します。この記事が、大きな数の高速な乗算を理解して実装するのに役立つことを願っています。
以上がPHP と GMP を使用して大きな数の高速乗算を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。