Skip to content

Commit fc80114

Browse files
committed
Add gmp_kronecker()
Exposes the mpz_kronecker(), mpz_si_kronecker() and mpz_kronecher_si() for computing the Kronecker symbol.
1 parent 10a336d commit fc80114

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ PHP NEWS
5151
. Added gmp_binomial(n, k). (Nikita)
5252
. Added gmp_lcm(a, b). (Nikita)
5353
. Added gmp_perfect_power(a). (Nikita)
54+
. Added gmp_kronecker(a, b). (Nikita)
5455

5556
- intl:
5657
. Fixed bug #75317 (UConverter::setDestinationEncoding changes source instead

UPGRADING

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ GMP:
8989
. Added gmp_binomial(n, k) for calculating binomial coefficients.
9090
. Added gmp_lcm(a, b) for calculating the least common multiple.
9191
. Added gmp_perfect_power(a) to check if number is a perfect power.
92+
. Added gmp_kronecker(a, b) to compute the Kronecker symbol.
9293

9394
Intl:
9495
. Added void Spoofchecker::setRestrictionLevel(int $level) method, available

ext/gmp/gmp.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
17871832
ZEND_FUNCTION(gmp_cmp)

ext/gmp/php_gmp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ ZEND_FUNCTION(gmp_gcdext);
6161
ZEND_FUNCTION(gmp_invert);
6262
ZEND_FUNCTION(gmp_jacobi);
6363
ZEND_FUNCTION(gmp_legendre);
64+
ZEND_FUNCTION(gmp_kronecker);
6465
ZEND_FUNCTION(gmp_cmp);
6566
ZEND_FUNCTION(gmp_sign);
6667
ZEND_FUNCTION(gmp_and);

ext/gmp/tests/gmp_kronecker.phpt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
gmp_kronecker(): Kronecker symbol
3+
--FILE--
4+
<?php
5+
6+
var_dump(gmp_kronecker(23, 12));
7+
var_dump(gmp_kronecker(gmp_init(23), 12));
8+
var_dump(gmp_kronecker(23, gmp_init(12)));
9+
var_dump(gmp_kronecker(gmp_init(23), gmp_init(12)));
10+
var_dump(gmp_kronecker("23", 12));
11+
var_dump(gmp_kronecker(23, "12"));
12+
var_dump(gmp_kronecker("23", "12"));
13+
echo "\n";
14+
15+
var_dump(gmp_kronecker(23, -12));
16+
var_dump(gmp_kronecker(-23, 12));
17+
var_dump(gmp_kronecker(-23, -12));
18+
19+
?>
20+
--EXPECT--
21+
int(-1)
22+
int(-1)
23+
int(-1)
24+
int(-1)
25+
int(-1)
26+
int(-1)
27+
int(-1)
28+
29+
int(-1)
30+
int(1)
31+
int(-1)

0 commit comments

Comments
 (0)