@@ -172,6 +172,7 @@ const zend_function_entry gmp_functions[] = {
172172 ZEND_FE (gmp_invert , arginfo_gmp_binary )
173173 ZEND_FE (gmp_jacobi , arginfo_gmp_binary )
174174 ZEND_FE (gmp_legendre , arginfo_gmp_binary )
175+ ZEND_FE (gmp_kronecker , arginfo_gmp_binary )
175176 ZEND_FE (gmp_cmp , arginfo_gmp_binary )
176177 ZEND_FE (gmp_sign , arginfo_gmp_unary )
177178 ZEND_DEP_FE (gmp_random , arginfo_gmp_random )
@@ -1782,6 +1783,50 @@ ZEND_FUNCTION(gmp_legendre)
17821783}
17831784/* }}} */
17841785
1786+ /* {{{ proto int gmp_kronecker(mixed a, mixed b)
1787+ Computes the Kronecker symbol */
1788+ ZEND_FUNCTION (gmp_kronecker )
1789+ {
1790+ zval * a_arg , * b_arg ;
1791+ mpz_ptr gmpnum_a , gmpnum_b ;
1792+ gmp_temp_t temp_a , temp_b ;
1793+ zend_bool use_a_si = 0 , use_b_si = 0 ;
1794+ int result ;
1795+
1796+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "zz" , & a_arg , & b_arg ) == FAILURE ){
1797+ return ;
1798+ }
1799+
1800+ if (Z_TYPE_P (a_arg ) == IS_LONG && Z_TYPE_P (b_arg ) != IS_LONG ) {
1801+ use_a_si = 1 ;
1802+ temp_a .is_used = 0 ;
1803+ } else {
1804+ FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a );
1805+ }
1806+
1807+ if (Z_TYPE_P (b_arg ) == IS_LONG ) {
1808+ use_b_si = 1 ;
1809+ temp_b .is_used = 0 ;
1810+ } else {
1811+ FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a );
1812+ }
1813+
1814+ if (use_a_si ) {
1815+ ZEND_ASSERT (use_b_si == 0 );
1816+ result = mpz_si_kronecker ((gmp_long ) Z_LVAL_P (a_arg ), gmpnum_b );
1817+ } else if (use_b_si ) {
1818+ result = mpz_kronecker_si (gmpnum_a , (gmp_long ) Z_LVAL_P (b_arg ));
1819+ } else {
1820+ result = mpz_kronecker (gmpnum_a , gmpnum_b );
1821+ }
1822+
1823+ FREE_GMP_TEMP (temp_a );
1824+ FREE_GMP_TEMP (temp_b );
1825+
1826+ RETURN_LONG (result );
1827+ }
1828+ /* }}} */
1829+
17851830/* {{{ proto int gmp_cmp(mixed a, mixed b)
17861831 Compares two numbers */
17871832ZEND_FUNCTION (gmp_cmp )
0 commit comments