]> granicus.if.org Git - php/commitdiff
Add gmp_perfect_power()
authorNikita Popov <nikita.ppv@gmail.com>
Sat, 9 Dec 2017 20:32:42 +0000 (21:32 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 11 Dec 2017 18:25:54 +0000 (19:25 +0100)
Exposes the mpz_perfect_power_p() function.

We already had the more specific gmp_perfect_square() function.

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

diff --git a/NEWS b/NEWS
index ddc07a560572acb5860eac6533cff3c4644b97f9..533f0d451488e3557f0aa56f20d3dc511fe60389 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -50,6 +50,7 @@ PHP                                                                        NEWS
   . Export internal structures and accessor helpers for GMP object. (Sara)
   . Added gmp_binomial(n, k). (Nikita)
   . Added gmp_lcm(a, b). (Nikita)
+  . Added gmp_perfect_power(a). (Nikita)
 
 - intl:
   . Fixed bug #75317 (UConverter::setDestinationEncoding changes source instead 
index 1560e5913f065f267404ce3b42e530a9ff8b87cb..955b53ce1c7e0a1b2ade32956a61ffef6143c079 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -88,6 +88,7 @@ Date:
 GMP:
   . Added gmp_binomial(n, k) for calculating binomial coefficients.
   . Added gmp_lcm(a, b) for calculating the least common multiple.
+  . Added gmp_perfect_power(a) to check if number is a perfect power.
 
 Intl:
   . Added void Spoofchecker::setRestrictionLevel(int $level) method, available
index 225b2ca03479cae5c55a9ec390889f9301d44f9b..7453b85ba94b0b4ea2ee5705c97aa9535c0d7516 100644 (file)
@@ -164,6 +164,7 @@ const zend_function_entry gmp_functions[] = {
        ZEND_FE(gmp_pow,                arginfo_gmp_pow)
        ZEND_FE(gmp_powm,               arginfo_gmp_powm)
        ZEND_FE(gmp_perfect_square,     arginfo_gmp_unary)
+       ZEND_FE(gmp_perfect_power,      arginfo_gmp_unary)
        ZEND_FE(gmp_prob_prime, arginfo_gmp_prob_prime)
        ZEND_FE(gmp_gcd,                arginfo_gmp_binary)
        ZEND_FE(gmp_gcdext,             arginfo_gmp_binary)
@@ -1652,6 +1653,25 @@ ZEND_FUNCTION(gmp_perfect_square)
 }
 /* }}} */
 
+/* {{{ proto bool gmp_perfect_power(mixed a)
+   Checks if a is a perfect power */
+ZEND_FUNCTION(gmp_perfect_power)
+{
+       zval *a_arg;
+       mpz_ptr gmpnum_a;
+       gmp_temp_t temp_a;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &a_arg) == FAILURE){
+               return;
+       }
+
+       FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+
+       RETVAL_BOOL((mpz_perfect_power_p(gmpnum_a) != 0));
+       FREE_GMP_TEMP(temp_a);
+}
+/* }}} */
+
 /* {{{ proto int gmp_prob_prime(mixed a[, int reps])
    Checks if a is "probably prime" */
 ZEND_FUNCTION(gmp_prob_prime)
index 2ee7879e82e1bc5442c7826867cdf8f5be2efd89..99dfe476d08c32d99f99c7118760ab1bff208c71 100644 (file)
@@ -54,6 +54,7 @@ ZEND_FUNCTION(gmp_rootrem);
 ZEND_FUNCTION(gmp_pow);
 ZEND_FUNCTION(gmp_powm);
 ZEND_FUNCTION(gmp_perfect_square);
+ZEND_FUNCTION(gmp_perfect_power);
 ZEND_FUNCTION(gmp_prob_prime);
 ZEND_FUNCTION(gmp_gcd);
 ZEND_FUNCTION(gmp_gcdext);
diff --git a/ext/gmp/tests/gmp_perfect_power.phpt b/ext/gmp/tests/gmp_perfect_power.phpt
new file mode 100644 (file)
index 0000000..df37f4e
--- /dev/null
@@ -0,0 +1,41 @@
+--TEST--
+gmp_perfect_power(): Check if number is a perfect power
+--FILE--
+<?php
+
+var_dump(gmp_perfect_power(0));
+var_dump(gmp_perfect_power(1));
+var_dump(gmp_perfect_power(2));
+var_dump(gmp_perfect_power(4));
+var_dump(gmp_perfect_power(6));
+var_dump(gmp_perfect_power(8));
+echo "\n";
+
+var_dump(gmp_perfect_power(-1));
+var_dump(gmp_perfect_power(-2));
+var_dump(gmp_perfect_power(-4));
+var_dump(gmp_perfect_power(-6));
+var_dump(gmp_perfect_power(-8));
+echo "\n";
+
+$n = gmp_init("7442665456261594668083173595997");
+var_dump(gmp_perfect_power($n));
+var_dump(gmp_perfect_power($n+1));
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+
+bool(true)
+bool(false)