com php-src: Add gmp_root() and gmp_rootrem() functions: NEWS UPGRADING ext/gmp/gmp.c ext/gmp/ php_gmp.h
| From: | Nikita Popov | Date: | Thu, 28 Nov 2013 23:01:59 +0000 |
| Subject: | com php-src: Add gmp_root() and gmp_rootrem() functions: NEWS UPGRADING ext/gmp/gmp.c ext/gmp/ php_gmp.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-74150@lists.php.net to get a copy of this message | ||
Commit: 6d38090c8d1a47844c854a73b57518fb2a7c10a8
Author: Nikita Popov <nikic@php.net> Thu, 28 Nov 2013 23:42:23 +0100
Parents: 1c8cbe4b4e8e373b37c740b7d96e4beb96414ea0
Branches: PHP-5.6 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=6d38090c8d1a47844c854a73b57518fb2a7c10a8
Log:
Add gmp_root() and gmp_rootrem() functions
Changed paths:
M NEWS
M UPGRADING
M ext/gmp/gmp.c
M ext/gmp/php_gmp.h
Diff:
diff --git a/NEWS b/NEWS
index 29dd740..dabe0cf 100644
--- a/NEWS
+++ b/NEWS
@@ -32,6 +32,8 @@ PHP NEWS
. Moved GMP to use object as the underlying structure and implemented various
improvements based on this.
(RFC: https://wiki.php..net/rfc/operator_overloading_gmp).
(Nikita)
+ . Added gmp_root() and gmp_rootrem() functions for calculating nth roots.
+ (Nikita)
- Hash:
. Added gost-crypto (CryptoPro S-box) GOST hash algo. (Manuel Mausz)
diff --git a/UPGRADING b/UPGRADING
index b680a9f..6392c5f 100755
--- a/UPGRADING
+++ b/UPGRADING
@@ -88,6 +88,9 @@ PHP X.Y UPGRADE NOTES
5. New Functions
========================================
+- GMP:
+ Added gmp_root($a, $nth) and gmp_rootrem($a, $nth) for calculating nth roots.
+
- Openssl:
Added string openssl_x509_fingerprint($x509, $type, $binary).
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp..c
index d3b6189..e64acf9 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -126,6 +126,16 @@ ZEND_BEGIN_ARG_INFO(arginfo_gmp_sqrtrem, 0)
ZEND_ARG_INFO(0, a)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO(arginfo_gmp_root, 0)
+ ZEND_ARG_INFO(0, a)
+ ZEND_ARG_INFO(0, nth)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_gmp_rootrem, 0)
+ ZEND_ARG_INFO(0, a)
+ ZEND_ARG_INFO(0, nth)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_INFO(arginfo_gmp_perfect_square, 0)
ZEND_ARG_INFO(0, a)
ZEND_END_ARG_INFO()
@@ -256,6 +266,8 @@ const zend_function_entry gmp_functions[] = {
ZEND_FE(gmp_fact, arginfo_gmp_fact)
ZEND_FE(gmp_sqrt, arginfo_gmp_sqrt)
ZEND_FE(gmp_sqrtrem, arginfo_gmp_sqrtrem)
+ ZEND_FE(gmp_root, arginfo_gmp_root)
+ ZEND_FE(gmp_rootrem, arginfo_gmp_rootrem)
ZEND_FE(gmp_pow, arginfo_gmp_pow)
ZEND_FE(gmp_powm, arginfo_gmp_powm)
ZEND_FE(gmp_perfect_square, arginfo_gmp_perfect_square)
@@ -1514,6 +1526,73 @@ ZEND_FUNCTION(gmp_sqrtrem)
}
/* }}} */
+/* {{{ proto GMP gmp_root(mixed a, int nth)
+ Takes integer part of nth root */
+ZEND_FUNCTION(gmp_root)
+{
+ zval *a_arg;
+ long nth;
+ mpz_ptr gmpnum_a, gmpnum_result;
+ gmp_temp_t temp_a;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &a_arg, &nth) ==
FAILURE) {
+ return;
+ }
+
+ if (nth <= 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The root must be positive");
+ RETURN_FALSE;
+ }
+
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+
+ if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't take even root of negative
number");
+ FREE_GMP_TEMP(temp_a);
+ RETURN_FALSE;
+ }
+
+ INIT_GMP_RETVAL(gmpnum_result);
+ mpz_root(gmpnum_result, gmpnum_a, (unsigned long) nth);
+ FREE_GMP_TEMP(temp_a);
+}
+/* }}} */
+
+/* {{{ proto GMP gmp_rootrem(mixed a, int nth)
+ Calculates integer part of nth root and remainder */
+ZEND_FUNCTION(gmp_rootrem)
+{
+ zval *a_arg;
+ long nth;
+ mpz_ptr gmpnum_a, gmpnum_result1, gmpnum_result2;
+ gmp_temp_t temp_a;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &a_arg, &nth) ==
FAILURE) {
+ return;
+ }
+
+ if (nth <= 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The root must be positive");
+ RETURN_FALSE;
+ }
+
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+
+ if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't take even root of negative
number");
+ FREE_GMP_TEMP(temp_a);
+ RETURN_FALSE;
+ }
+
+ array_init(return_value);
+ add_index_zval(return_value, 0, gmp_create(&gmpnum_result1 TSRMLS_CC));
+ add_index_zval(return_value, 1, gmp_create(&gmpnum_result2 TSRMLS_CC));
+
+ mpz_rootrem(gmpnum_result1, gmpnum_result2, gmpnum_a, (unsigned long) nth);
+ FREE_GMP_TEMP(temp_a);
+}
+/* }}} */
+
/* {{{ proto bool gmp_perfect_square(mixed a)
Checks if a is an exact square */
ZEND_FUNCTION(gmp_perfect_square)
diff --git a/ext/gmp/php_gmp.h b/ext/gmp/php_gmp.h
index e1aaef8..902c3ac 100644
--- a/ext/gmp/php_gmp.h
+++ b/ext/gmp/php_gmp.h
@@ -45,9 +45,11 @@ ZEND_FUNCTION(gmp_neg);
ZEND_FUNCTION(gmp_abs);
ZEND_FUNCTION(gmp_fact);
ZEND_FUNCTION(gmp_sqrt);
+ZEND_FUNCTION(gmp_sqrtrem);
+ZEND_FUNCTION(gmp_root);
+ZEND_FUNCTION(gmp_rootrem);
ZEND_FUNCTION(gmp_pow);
ZEND_FUNCTION(gmp_powm);
-ZEND_FUNCTION(gmp_sqrtrem);
ZEND_FUNCTION(gmp_perfect_square);
ZEND_FUNCTION(gmp_prob_prime);
ZEND_FUNCTION(gmp_gcd);