Skip to content

Commit 6d38090

Browse files
committed
Add gmp_root() and gmp_rootrem() functions
1 parent 1c8cbe4 commit 6d38090

File tree

4 files changed

+87
-1
lines changed

4 files changed

+87
-1
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ PHP NEWS
3232
. Moved GMP to use object as the underlying structure and implemented various
3333
improvements based on this.
3434
(RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita)
35+
. Added gmp_root() and gmp_rootrem() functions for calculating nth roots.
36+
(Nikita)
3537

3638
- Hash:
3739
. Added gost-crypto (CryptoPro S-box) GOST hash algo. (Manuel Mausz)

UPGRADING

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ PHP X.Y UPGRADE NOTES
8888
5. New Functions
8989
========================================
9090

91+
- GMP:
92+
Added gmp_root($a, $nth) and gmp_rootrem($a, $nth) for calculating nth roots.
93+
9194
- Openssl:
9295
Added string openssl_x509_fingerprint($x509, $type, $binary).
9396

ext/gmp/gmp.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,16 @@ ZEND_BEGIN_ARG_INFO(arginfo_gmp_sqrtrem, 0)
126126
ZEND_ARG_INFO(0, a)
127127
ZEND_END_ARG_INFO()
128128

129+
ZEND_BEGIN_ARG_INFO(arginfo_gmp_root, 0)
130+
ZEND_ARG_INFO(0, a)
131+
ZEND_ARG_INFO(0, nth)
132+
ZEND_END_ARG_INFO()
133+
134+
ZEND_BEGIN_ARG_INFO(arginfo_gmp_rootrem, 0)
135+
ZEND_ARG_INFO(0, a)
136+
ZEND_ARG_INFO(0, nth)
137+
ZEND_END_ARG_INFO()
138+
129139
ZEND_BEGIN_ARG_INFO(arginfo_gmp_perfect_square, 0)
130140
ZEND_ARG_INFO(0, a)
131141
ZEND_END_ARG_INFO()
@@ -256,6 +266,8 @@ const zend_function_entry gmp_functions[] = {
256266
ZEND_FE(gmp_fact, arginfo_gmp_fact)
257267
ZEND_FE(gmp_sqrt, arginfo_gmp_sqrt)
258268
ZEND_FE(gmp_sqrtrem, arginfo_gmp_sqrtrem)
269+
ZEND_FE(gmp_root, arginfo_gmp_root)
270+
ZEND_FE(gmp_rootrem, arginfo_gmp_rootrem)
259271
ZEND_FE(gmp_pow, arginfo_gmp_pow)
260272
ZEND_FE(gmp_powm, arginfo_gmp_powm)
261273
ZEND_FE(gmp_perfect_square, arginfo_gmp_perfect_square)
@@ -1514,6 +1526,73 @@ ZEND_FUNCTION(gmp_sqrtrem)
15141526
}
15151527
/* }}} */
15161528

1529+
/* {{{ proto GMP gmp_root(mixed a, int nth)
1530+
Takes integer part of nth root */
1531+
ZEND_FUNCTION(gmp_root)
1532+
{
1533+
zval *a_arg;
1534+
long nth;
1535+
mpz_ptr gmpnum_a, gmpnum_result;
1536+
gmp_temp_t temp_a;
1537+
1538+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &a_arg, &nth) == FAILURE) {
1539+
return;
1540+
}
1541+
1542+
if (nth <= 0) {
1543+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The root must be positive");
1544+
RETURN_FALSE;
1545+
}
1546+
1547+
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
1548+
1549+
if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) {
1550+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't take even root of negative number");
1551+
FREE_GMP_TEMP(temp_a);
1552+
RETURN_FALSE;
1553+
}
1554+
1555+
INIT_GMP_RETVAL(gmpnum_result);
1556+
mpz_root(gmpnum_result, gmpnum_a, (unsigned long) nth);
1557+
FREE_GMP_TEMP(temp_a);
1558+
}
1559+
/* }}} */
1560+
1561+
/* {{{ proto GMP gmp_rootrem(mixed a, int nth)
1562+
Calculates integer part of nth root and remainder */
1563+
ZEND_FUNCTION(gmp_rootrem)
1564+
{
1565+
zval *a_arg;
1566+
long nth;
1567+
mpz_ptr gmpnum_a, gmpnum_result1, gmpnum_result2;
1568+
gmp_temp_t temp_a;
1569+
1570+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &a_arg, &nth) == FAILURE) {
1571+
return;
1572+
}
1573+
1574+
if (nth <= 0) {
1575+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The root must be positive");
1576+
RETURN_FALSE;
1577+
}
1578+
1579+
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
1580+
1581+
if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) {
1582+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't take even root of negative number");
1583+
FREE_GMP_TEMP(temp_a);
1584+
RETURN_FALSE;
1585+
}
1586+
1587+
array_init(return_value);
1588+
add_index_zval(return_value, 0, gmp_create(&gmpnum_result1 TSRMLS_CC));
1589+
add_index_zval(return_value, 1, gmp_create(&gmpnum_result2 TSRMLS_CC));
1590+
1591+
mpz_rootrem(gmpnum_result1, gmpnum_result2, gmpnum_a, (unsigned long) nth);
1592+
FREE_GMP_TEMP(temp_a);
1593+
}
1594+
/* }}} */
1595+
15171596
/* {{{ proto bool gmp_perfect_square(mixed a)
15181597
Checks if a is an exact square */
15191598
ZEND_FUNCTION(gmp_perfect_square)

ext/gmp/php_gmp.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ ZEND_FUNCTION(gmp_neg);
4545
ZEND_FUNCTION(gmp_abs);
4646
ZEND_FUNCTION(gmp_fact);
4747
ZEND_FUNCTION(gmp_sqrt);
48+
ZEND_FUNCTION(gmp_sqrtrem);
49+
ZEND_FUNCTION(gmp_root);
50+
ZEND_FUNCTION(gmp_rootrem);
4851
ZEND_FUNCTION(gmp_pow);
4952
ZEND_FUNCTION(gmp_powm);
50-
ZEND_FUNCTION(gmp_sqrtrem);
5153
ZEND_FUNCTION(gmp_perfect_square);
5254
ZEND_FUNCTION(gmp_prob_prime);
5355
ZEND_FUNCTION(gmp_gcd);

0 commit comments

Comments
 (0)