Skip to content

Commit 6459664

Browse files
authored
ext/gmp: expose the possibility of being a prime in gmp_prevprime (#22907)
Follow up #22807 to expose the "definitelyPrime" parameter in the gmp_prevprime function to indicate the possibility of whether the outputted number is actually a prime.
1 parent 7d83eeb commit 6459664

6 files changed

Lines changed: 44 additions & 6 deletions

File tree

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ PHP NEWS
33
?? ??? ????, PHP 8.6.0beta1
44

55
- GMP:
6+
. Added optional $definitely_prime output parameter to gmp_prevprime().
7+
(Weilin Du)
68
. Added gmp_powm_sec(). (Weilin Du)
79

810
30 Jul 2026, PHP 8.6.0alpha3

UPGRADING

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,11 @@ PHP 8.6 UPGRADE NOTES
275275
. Added gmp_powm_sec() for side-channel quiet modular exponentiation.
276276
Requires GNU MP 5.0.0 or later.
277277
. Added gmp_prevprime() to get the largest prime smaller than the given
278-
number. A ValueError is thrown if no such prime exists. This function is
279-
available only when PHP is built against GNU MP 6.3.0 or later; it is not
280-
available on official Windows builds using MPIR.
278+
number. The optional $definitely_prime output parameter indicates whether
279+
the returned number is definitely prime, as opposed to probably prime.
280+
A ValueError is thrown if no such prime exists. This function is available
281+
only when PHP is built against GNU MP 6.3.0 or later; it is not available
282+
on official Windows builds using MPIR.
281283

282284
- Intl:
283285
. Added Locale::getDisplayKeyword() and Locale::getDisplayKeywordValue(),

ext/gmp/gmp.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1087,10 +1087,13 @@ GMP_UNARY_OP_FUNCTION(nextprime);
10871087
ZEND_FUNCTION(gmp_prevprime)
10881088
{
10891089
mpz_ptr gmpnum_a, gmpnum_result;
1090+
zval *definitely_prime = NULL;
10901091
int res;
10911092

1092-
ZEND_PARSE_PARAMETERS_START(1, 1)
1093+
ZEND_PARSE_PARAMETERS_START(1, 2)
10931094
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_a)
1095+
Z_PARAM_OPTIONAL
1096+
Z_PARAM_ZVAL(definitely_prime)
10941097
ZEND_PARSE_PARAMETERS_END();
10951098

10961099
if (mpz_cmp_ui(gmpnum_a, 2) <= 0) {
@@ -1106,6 +1109,9 @@ ZEND_FUNCTION(gmp_prevprime)
11061109
INIT_GMP_RETVAL(gmpnum_result);
11071110
res = mpz_prevprime(gmpnum_result, gmpnum_a);
11081111
ZEND_ASSERT(res);
1112+
if (definitely_prime) {
1113+
ZEND_TRY_ASSIGN_REF_BOOL(definitely_prime, res == 2);
1114+
}
11091115
}
11101116
/* }}} */
11111117
#endif

ext/gmp/gmp.stub.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ function gmp_hamdist(GMP|int|string $num1, GMP|int|string $num2): int {}
188188
function gmp_nextprime(GMP|int|string $num): GMP {}
189189

190190
#ifdef HAVE___GMPZ_PREVPRIME
191-
function gmp_prevprime(GMP|int|string $num): GMP {}
191+
/** @param bool $definitely_prime */
192+
function gmp_prevprime(GMP|int|string $num, &$definitely_prime = null): GMP {}
192193
#endif
193194

194195
function gmp_binomial(GMP|int|string $n, int $k): GMP {}

ext/gmp/gmp_arginfo.h

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/gmp/tests/gmp_prevprime.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,42 @@ foreach ([-1, 0, 1, 2] as $value) {
1919
}
2020
}
2121

22+
$definitelyPrime = null;
23+
try {
24+
var_dump(gmp_prevprime(2, $definitelyPrime));
25+
} catch (\ValueError $e) {
26+
echo $e->getMessage() . \PHP_EOL;
27+
}
28+
var_dump($definitelyPrime);
29+
2230
var_dump(gmp_strval(gmp_prevprime(3)));
2331
var_dump(gmp_strval(gmp_prevprime(4)));
2432
var_dump(gmp_strval(gmp_prevprime(10000)));
2533

34+
$definitelyPrime = null;
35+
var_dump(gmp_strval(gmp_prevprime(3, $definitelyPrime)));
36+
var_dump($definitelyPrime);
37+
38+
$probablePrime = gmp_nextprime(gmp_pow(10, 80));
39+
$definitelyPrime = null;
40+
$previousPrime = gmp_prevprime(gmp_add($probablePrime, 1), $definitelyPrime);
41+
var_dump(gmp_cmp($previousPrime, $probablePrime) === 0);
42+
var_dump(is_bool($definitelyPrime));
43+
var_dump($definitelyPrime === (gmp_prob_prime($previousPrime) === 2));
44+
2645
?>
2746
--EXPECT--
2847
gmp_prevprime(): Argument #1 ($num) must be greater than 2
2948
gmp_prevprime(): Argument #1 ($num) must be greater than 2
3049
gmp_prevprime(): Argument #1 ($num) must be greater than 2
3150
gmp_prevprime(): Argument #1 ($num) must be greater than 2
51+
gmp_prevprime(): Argument #1 ($num) must be greater than 2
52+
NULL
3253
string(1) "2"
3354
string(1) "3"
3455
string(4) "9973"
56+
string(1) "2"
57+
bool(true)
58+
bool(true)
59+
bool(true)
60+
bool(true)

0 commit comments

Comments
 (0)