From: Nikita Popov Date: Sat, 9 Dec 2017 20:32:42 +0000 (+0100) Subject: Add gmp_perfect_power() X-Git-Tag: php-7.3.0alpha1~823 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10a336d3d062fdfa0133b22fb4f79852ec939ea5;p=php Add gmp_perfect_power() Exposes the mpz_perfect_power_p() function. We already had the more specific gmp_perfect_square() function. --- 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-- + +--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)