@@ -126,6 +126,16 @@ ZEND_BEGIN_ARG_INFO(arginfo_gmp_sqrtrem, 0)
126
126
ZEND_ARG_INFO (0 , a )
127
127
ZEND_END_ARG_INFO ()
128
128
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
+
129
139
ZEND_BEGIN_ARG_INFO (arginfo_gmp_perfect_square , 0 )
130
140
ZEND_ARG_INFO (0 , a )
131
141
ZEND_END_ARG_INFO ()
@@ -256,6 +266,8 @@ const zend_function_entry gmp_functions[] = {
256
266
ZEND_FE (gmp_fact , arginfo_gmp_fact )
257
267
ZEND_FE (gmp_sqrt , arginfo_gmp_sqrt )
258
268
ZEND_FE (gmp_sqrtrem , arginfo_gmp_sqrtrem )
269
+ ZEND_FE (gmp_root , arginfo_gmp_root )
270
+ ZEND_FE (gmp_rootrem , arginfo_gmp_rootrem )
259
271
ZEND_FE (gmp_pow , arginfo_gmp_pow )
260
272
ZEND_FE (gmp_powm , arginfo_gmp_powm )
261
273
ZEND_FE (gmp_perfect_square , arginfo_gmp_perfect_square )
@@ -1514,6 +1526,73 @@ ZEND_FUNCTION(gmp_sqrtrem)
1514
1526
}
1515
1527
/* }}} */
1516
1528
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
+
1517
1596
/* {{{ proto bool gmp_perfect_square(mixed a)
1518
1597
Checks if a is an exact square */
1519
1598
ZEND_FUNCTION (gmp_perfect_square )
0 commit comments