mirror of
https://github.com/phpseclib/phpseclib.git
synced 2024-12-29 04:23:34 +00:00
BigInteger: refactor randomPrime somewhat
This commit is contained in:
parent
e85f5c7198
commit
043ad01eca
@ -3116,10 +3116,18 @@ class Math_BigInteger {
|
|||||||
*/
|
*/
|
||||||
function randomPrime($min = false, $max = false, $timeout = false)
|
function randomPrime($min = false, $max = false, $timeout = false)
|
||||||
{
|
{
|
||||||
|
if ($min === false) {
|
||||||
|
$min = new Math_BigInteger(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($max === false) {
|
||||||
|
$max = new Math_BigInteger(0x7FFFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
$compare = $max->compare($min);
|
$compare = $max->compare($min);
|
||||||
|
|
||||||
if (!$compare) {
|
if (!$compare) {
|
||||||
return $min;
|
return $min->isPrime() ? $min : false;
|
||||||
} else if ($compare < 0) {
|
} else if ($compare < 0) {
|
||||||
// if $min is bigger then $max, swap $min and $max
|
// if $min is bigger then $max, swap $min and $max
|
||||||
$temp = $max;
|
$temp = $max;
|
||||||
@ -3127,36 +3135,6 @@ class Math_BigInteger {
|
|||||||
$min = $temp;
|
$min = $temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// gmp_nextprime() requires PHP 5 >= 5.2.0 per <http://php.net/gmp-nextprime>.
|
|
||||||
if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && function_exists('gmp_nextprime') ) {
|
|
||||||
// we don't rely on Math_BigInteger::random()'s min / max when gmp_nextprime() is being used since this function
|
|
||||||
// does its own checks on $max / $min when gmp_nextprime() is used. When gmp_nextprime() is not used, however,
|
|
||||||
// the same $max / $min checks are not performed.
|
|
||||||
if ($min === false) {
|
|
||||||
$min = new Math_BigInteger(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($max === false) {
|
|
||||||
$max = new Math_BigInteger(0x7FFFFFFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
$x = $this->random($min, $max);
|
|
||||||
|
|
||||||
$x->value = gmp_nextprime($x->value);
|
|
||||||
|
|
||||||
if ($x->compare($max) <= 0) {
|
|
||||||
return $x;
|
|
||||||
}
|
|
||||||
|
|
||||||
$x->value = gmp_nextprime($min->value);
|
|
||||||
|
|
||||||
if ($x->compare($max) <= 0) {
|
|
||||||
return $x;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static $one, $two;
|
static $one, $two;
|
||||||
if (!isset($one)) {
|
if (!isset($one)) {
|
||||||
$one = new Math_BigInteger(1);
|
$one = new Math_BigInteger(1);
|
||||||
@ -3166,6 +3144,22 @@ class Math_BigInteger {
|
|||||||
$start = time();
|
$start = time();
|
||||||
|
|
||||||
$x = $this->random($min, $max);
|
$x = $this->random($min, $max);
|
||||||
|
|
||||||
|
// gmp_nextprime() requires PHP 5 >= 5.2.0 per <http://php.net/gmp-nextprime>.
|
||||||
|
if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && function_exists('gmp_nextprime') ) {
|
||||||
|
$p->value = gmp_nextprime($x->value);
|
||||||
|
|
||||||
|
if ($p->compare($max) <= 0) {
|
||||||
|
return $p;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$min->equals($x)) {
|
||||||
|
$x = $x->subtract($one);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $x->randomPrime($min, $x);
|
||||||
|
}
|
||||||
|
|
||||||
if ($x->equals($two)) {
|
if ($x->equals($two)) {
|
||||||
return $x;
|
return $x;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user