]> granicus.if.org Git - php/commitdiff
Add gmp_lcm()
authorNikita Popov <nikita.ppv@gmail.com>
Sat, 9 Dec 2017 20:22:37 +0000 (21:22 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 11 Dec 2017 18:25:54 +0000 (19:25 +0100)
Exposes mpz_lcm() and mpz_lcm_ui() for calculating the least
common multiple.

We already expose the somewhat complementary gmp_gcd() function.

NEWS
UPGRADING
ext/gmp/gmp.c
ext/gmp/php_gmp.h
ext/gmp/tests/gmp_lcm.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index cde7a3656d6fd2a53616cef469962a85da11fc2d..ddc07a560572acb5860eac6533cff3c4644b97f9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -49,6 +49,7 @@ PHP                                                                        NEWS
 - GMP:
   . Export internal structures and accessor helpers for GMP object. (Sara)
   . Added gmp_binomial(n, k). (Nikita)
+  . Added gmp_lcm(a, b). (Nikita)
 
 - intl:
   . Fixed bug #75317 (UConverter::setDestinationEncoding changes source instead 
index a68d3180741c4a4ab94ca100b7b689cbc7cfc17d..1560e5913f065f267404ce3b42e530a9ff8b87cb 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -87,6 +87,7 @@ Date:
 
 GMP:
   . Added gmp_binomial(n, k) for calculating binomial coefficients.
+  . Added gmp_lcm(a, b) for calculating the least common multiple.
 
 Intl:
   . Added void Spoofchecker::setRestrictionLevel(int $level) method, available
index 667df7cdad40d7aac82bdc5df17d90532b6953e6..225b2ca03479cae5c55a9ec390889f9301d44f9b 100644 (file)
@@ -167,6 +167,7 @@ const zend_function_entry gmp_functions[] = {
        ZEND_FE(gmp_prob_prime, arginfo_gmp_prob_prime)
        ZEND_FE(gmp_gcd,                arginfo_gmp_binary)
        ZEND_FE(gmp_gcdext,             arginfo_gmp_binary)
+       ZEND_FE(gmp_lcm,                arginfo_gmp_binary)
        ZEND_FE(gmp_invert,             arginfo_gmp_binary)
        ZEND_FE(gmp_jacobi,             arginfo_gmp_binary)
        ZEND_FE(gmp_legendre,   arginfo_gmp_binary)
@@ -1679,6 +1680,14 @@ ZEND_FUNCTION(gmp_gcd)
 }
 /* }}} */
 
+/* {{{ proto GMP gmp_lcm(mixed a, mixed b)
+   Computes least common multiple (lcm) of a and b */
+ZEND_FUNCTION(gmp_lcm)
+{
+       gmp_binary_ui_op(mpz_lcm, (gmp_binary_ui_op_t) mpz_lcm_ui);
+}
+/* }}} */
+
 /* {{{ proto array gmp_gcdext(mixed a, mixed b)
    Computes G, S, and T, such that AS + BT = G = `gcd' (A, B) */
 ZEND_FUNCTION(gmp_gcdext)
index 8ba4b89d5b6ab3168ec94ff8f48fe2e150aec066..2ee7879e82e1bc5442c7826867cdf8f5be2efd89 100644 (file)
@@ -79,6 +79,7 @@ ZEND_FUNCTION(gmp_popcount);
 ZEND_FUNCTION(gmp_hamdist);
 ZEND_FUNCTION(gmp_nextprime);
 ZEND_FUNCTION(gmp_binomial);
+ZEND_FUNCTION(gmp_lcm);
 
 ZEND_BEGIN_MODULE_GLOBALS(gmp)
        zend_bool rand_initialized;
diff --git a/ext/gmp/tests/gmp_lcm.phpt b/ext/gmp/tests/gmp_lcm.phpt
new file mode 100644 (file)
index 0000000..1534b3f
--- /dev/null
@@ -0,0 +1,45 @@
+--TEST--
+gmp_lcm(): Least common multiple
+--FILE--
+<?php
+
+var_dump(gmp_lcm(100, 77));
+var_dump(gmp_lcm(99, 77));
+var_dump(gmp_lcm(99, -77));
+var_dump(gmp_lcm(-99, -77));
+
+var_dump(gmp_lcm(gmp_init(99), gmp_init(77)));
+
+var_dump(gmp_lcm(93, 0));
+var_dump(gmp_lcm(0, 93));
+
+?>
+--EXPECT--
+object(GMP)#1 (1) {
+  ["num"]=>
+  string(4) "7700"
+}
+object(GMP)#1 (1) {
+  ["num"]=>
+  string(3) "693"
+}
+object(GMP)#1 (1) {
+  ["num"]=>
+  string(3) "693"
+}
+object(GMP)#1 (1) {
+  ["num"]=>
+  string(3) "693"
+}
+object(GMP)#3 (1) {
+  ["num"]=>
+  string(3) "693"
+}
+object(GMP)#3 (1) {
+  ["num"]=>
+  string(1) "0"
+}
+object(GMP)#3 (1) {
+  ["num"]=>
+  string(1) "0"
+}