summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-12-09 21:32:42 +0100
committerNikita Popov <nikita.ppv@gmail.com>2017-12-11 19:25:54 +0100
commit10a336d3d062fdfa0133b22fb4f79852ec939ea5 (patch)
treef4e4de6f93634b4efa12f90d320ab3c134d14aa8
parenta1d36a1157bd88afd64119be059812dd46c4fb2d (diff)
downloadphp-git-10a336d3d062fdfa0133b22fb4f79852ec939ea5.tar.gz
Add gmp_perfect_power()
Exposes the mpz_perfect_power_p() function. We already had the more specific gmp_perfect_square() function.
-rw-r--r--NEWS1
-rw-r--r--UPGRADING1
-rw-r--r--ext/gmp/gmp.c20
-rw-r--r--ext/gmp/php_gmp.h1
-rw-r--r--ext/gmp/tests/gmp_perfect_power.phpt41
5 files changed, 64 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index ddc07a5605..533f0d4514 100644
--- 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
diff --git a/UPGRADING b/UPGRADING
index 1560e5913f..955b53ce1c 100644
--- 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
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index 225b2ca034..7453b85ba9 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -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)
diff --git a/ext/gmp/php_gmp.h b/ext/gmp/php_gmp.h
index 2ee7879e82..99dfe476d0 100644
--- a/ext/gmp/php_gmp.h
+++ b/ext/gmp/php_gmp.h
@@ -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
index 0000000000..df37f4eeeb
--- /dev/null
+++ b/ext/gmp/tests/gmp_perfect_power.phpt
@@ -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)