Skip to content

Commit 9a2af3c

Browse files
committed
GH-13661: implements gmp_prevprime.
Sets the GMP instance to the greatest prime < than the argument provided (or left the instance unmodified).
1 parent f4e2031 commit 9a2af3c

File tree

5 files changed

+80
-1
lines changed

5 files changed

+80
-1
lines changed

ext/gmp/config.m4

+1
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ if test "$PHP_GMP" != "no"; then
4141
PHP_SUBST([GMP_SHARED_LIBADD])
4242
AC_DEFINE([HAVE_GMP], [1],
4343
[Define to 1 if the PHP extension 'gmp' is available.])
44+
AC_CHECK_FUNCS([__gmpz_prevprime])
4445
fi

ext/gmp/gmp.c

+25
Original file line numberDiff line numberDiff line change
@@ -2080,6 +2080,31 @@ ZEND_FUNCTION(gmp_scan1)
20802080
}
20812081
/* }}} */
20822082

2083+
#ifdef HAVE___GMPZ_PREVPRIME
2084+
ZEND_FUNCTION(gmp_prevprime)
2085+
{
2086+
zval *a_arg;
2087+
mpz_ptr gmpnum_a, gmpnum_result;
2088+
gmp_temp_t temp_a;
2089+
2090+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &a_arg) == FAILURE){
2091+
RETURN_THROWS();
2092+
}
2093+
2094+
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1);
2095+
INIT_GMP_RETVAL(gmpnum_result);
2096+
2097+
/*
2098+
* If it leads to a prime number the resulting
2099+
* GMP instance will reflect the change anyway ;
2100+
* on certainty (returning 2) or probability (1).
2101+
*/
2102+
(void)mpz_prevprime(gmpnum_result, gmpnum_a);
2103+
2104+
FREE_GMP_TEMP(temp_a);
2105+
}
2106+
#endif
2107+
20832108
ZEND_METHOD(GMP, __construct)
20842109
{
20852110
zend_string *arg_str = NULL;

ext/gmp/gmp.stub.php

+4
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,7 @@ function gmp_hamdist(GMP|int|string $num1, GMP|int|string $num2): int {}
184184
function gmp_nextprime(GMP|int|string $num): GMP {}
185185

186186
function gmp_binomial(GMP|int|string $n, int $k): GMP {}
187+
188+
#ifdef HAVE___GMPZ_PREVPRIME
189+
function gmp_prevprime(GMP|int|string $num): GMP {}
190+
#endif

ext/gmp/gmp_arginfo.h

+13-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/gmp/tests/gh13661.phpt

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
gmp_prevprime()
3+
--EXTENSIONS--
4+
gmp
5+
--SKIPIF--
6+
<?php if (!function_exists("gmp_prevprime")) die("skip no gmp_prevprime"); ?>
7+
--FILE--
8+
<?php
9+
10+
var_dump(gmp_prevprime(-1));
11+
var_dump(gmp_prevprime(1));
12+
var_dump(gmp_prevprime(3));
13+
var_dump(gmp_prevprime(gmp_init("3")));
14+
var_dump(gmp_prevprime(gmp_init(PHP_INT_MAX)));
15+
16+
?>
17+
--EXPECTF--
18+
object(GMP)#1 (1) {
19+
["num"]=>
20+
string(1) "0"
21+
}
22+
object(GMP)#1 (1) {
23+
["num"]=>
24+
string(1) "0"
25+
}
26+
object(GMP)#1 (1) {
27+
["num"]=>
28+
string(1) "2"
29+
}
30+
object(GMP)#1 (1) {
31+
["num"]=>
32+
string(1) "2"
33+
}
34+
object(GMP)#1 (1) {
35+
["num"]=>
36+
string(19) "%d"
37+
}

0 commit comments

Comments
 (0)