aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/brick/math/src/BigInteger.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/brick/math/src/BigInteger.php')
-rw-r--r--vendor/brick/math/src/BigInteger.php183
1 files changed, 39 insertions, 144 deletions
diff --git a/vendor/brick/math/src/BigInteger.php b/vendor/brick/math/src/BigInteger.php
index f213fbedb..435679331 100644
--- a/vendor/brick/math/src/BigInteger.php
+++ b/vendor/brick/math/src/BigInteger.php
@@ -26,10 +26,8 @@ final class BigInteger extends BigNumber
*
* No leading zeros must be present.
* No leading minus sign must be present if the number is zero.
- *
- * @var string
*/
- private $value;
+ private string $value;
/**
* Protected constructor. Use a factory method to obtain an instance.
@@ -44,15 +42,11 @@ final class BigInteger extends BigNumber
/**
* Creates a BigInteger of the given value.
*
- * @param BigNumber|int|float|string $value
- *
- * @return BigInteger
- *
* @throws MathException If the value cannot be converted to a BigInteger.
*
* @psalm-pure
*/
- public static function of($value) : BigNumber
+ public static function of(BigNumber|int|float|string $value) : BigInteger
{
return parent::of($value)->toBigInteger();
}
@@ -71,8 +65,6 @@ final class BigInteger extends BigNumber
* @param string $number The number to convert, in the given base.
* @param int $base The base of the number, between 2 and 36.
*
- * @return BigInteger
- *
* @throws NumberFormatException If the number is empty, or contains invalid chars for the given base.
* @throws \InvalidArgumentException If the base is out of range.
*
@@ -138,8 +130,6 @@ final class BigInteger extends BigNumber
* @param string $number The number to parse.
* @param string $alphabet The alphabet, for example '01' for base 2, or '01234567' for base 8.
*
- * @return BigInteger
- *
* @throws NumberFormatException If the given number is empty or contains invalid chars for the given alphabet.
* @throws \InvalidArgumentException If the alphabet does not contain at least 2 chars.
*
@@ -183,8 +173,6 @@ final class BigInteger extends BigNumber
* @param bool $signed Whether to interpret as a signed number in two's-complement representation with a leading
* sign bit.
*
- * @return BigInteger
- *
* @throws NumberFormatException If the string is empty.
*/
public static function fromBytes(string $value, bool $signed = true) : BigInteger
@@ -217,15 +205,13 @@ final class BigInteger extends BigNumber
*
* Using the default random bytes generator, this method is suitable for cryptographic use.
*
- * @psalm-param callable(int): string $randomBytesGenerator
+ * @psalm-param (callable(int): string)|null $randomBytesGenerator
*
* @param int $numBits The number of bits.
* @param callable|null $randomBytesGenerator A function that accepts a number of bytes as an integer, and returns a
* string of random bytes of the given length. Defaults to the
* `random_bytes()` function.
*
- * @return BigInteger
- *
* @throws \InvalidArgumentException If $numBits is negative.
*/
public static function randomBits(int $numBits, ?callable $randomBytesGenerator = null) : BigInteger
@@ -266,13 +252,14 @@ final class BigInteger extends BigNumber
* and returns a string of random bytes of the given length.
* Defaults to the `random_bytes()` function.
*
- * @return BigInteger
- *
* @throws MathException If one of the parameters cannot be converted to a BigInteger,
* or `$min` is greater than `$max`.
*/
- public static function randomRange($min, $max, ?callable $randomBytesGenerator = null) : BigInteger
- {
+ public static function randomRange(
+ BigNumber|int|float|string $min,
+ BigNumber|int|float|string $max,
+ ?callable $randomBytesGenerator = null
+ ) : BigInteger {
$min = BigInteger::of($min);
$max = BigInteger::of($max);
@@ -298,8 +285,6 @@ final class BigInteger extends BigNumber
/**
* Returns a BigInteger representing zero.
*
- * @return BigInteger
- *
* @psalm-pure
*/
public static function zero() : BigInteger
@@ -320,8 +305,6 @@ final class BigInteger extends BigNumber
/**
* Returns a BigInteger representing one.
*
- * @return BigInteger
- *
* @psalm-pure
*/
public static function one() : BigInteger
@@ -342,8 +325,6 @@ final class BigInteger extends BigNumber
/**
* Returns a BigInteger representing ten.
*
- * @return BigInteger
- *
* @psalm-pure
*/
public static function ten() : BigInteger
@@ -361,16 +342,29 @@ final class BigInteger extends BigNumber
return $ten;
}
+ public static function gcdMultiple(BigInteger $a, BigInteger ...$n): BigInteger
+ {
+ $result = $a;
+
+ foreach ($n as $next) {
+ $result = $result->gcd($next);
+
+ if ($result->isEqualTo(1)) {
+ return $result;
+ }
+ }
+
+ return $result;
+ }
+
/**
* Returns the sum of this number and the given one.
*
* @param BigNumber|int|float|string $that The number to add. Must be convertible to a BigInteger.
*
- * @return BigInteger The result.
- *
* @throws MathException If the number is not valid, or is not convertible to a BigInteger.
*/
- public function plus($that) : BigInteger
+ public function plus(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -392,11 +386,9 @@ final class BigInteger extends BigNumber
*
* @param BigNumber|int|float|string $that The number to subtract. Must be convertible to a BigInteger.
*
- * @return BigInteger The result.
- *
* @throws MathException If the number is not valid, or is not convertible to a BigInteger.
*/
- public function minus($that) : BigInteger
+ public function minus(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -414,11 +406,9 @@ final class BigInteger extends BigNumber
*
* @param BigNumber|int|float|string $that The multiplier. Must be convertible to a BigInteger.
*
- * @return BigInteger The result.
- *
* @throws MathException If the multiplier is not a valid number, or is not convertible to a BigInteger.
*/
- public function multipliedBy($that) : BigInteger
+ public function multipliedBy(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -441,12 +431,10 @@ final class BigInteger extends BigNumber
* @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
* @param int $roundingMode An optional rounding mode.
*
- * @return BigInteger The result.
- *
* @throws MathException If the divisor is not a valid number, is not convertible to a BigInteger, is zero,
* or RoundingMode::UNNECESSARY is used and the remainder is not zero.
*/
- public function dividedBy($that, int $roundingMode = RoundingMode::UNNECESSARY) : BigInteger
+ public function dividedBy(BigNumber|int|float|string $that, int $roundingMode = RoundingMode::UNNECESSARY) : BigInteger
{
$that = BigInteger::of($that);
@@ -466,10 +454,6 @@ final class BigInteger extends BigNumber
/**
* Returns this number exponentiated to the given value.
*
- * @param int $exponent The exponent.
- *
- * @return BigInteger The result.
- *
* @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000.
*/
public function power(int $exponent) : BigInteger
@@ -498,11 +482,9 @@ final class BigInteger extends BigNumber
*
* @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
*
- * @return BigInteger
- *
* @throws DivisionByZeroException If the divisor is zero.
*/
- public function quotient($that) : BigInteger
+ public function quotient(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -526,11 +508,9 @@ final class BigInteger extends BigNumber
*
* @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
*
- * @return BigInteger
- *
* @throws DivisionByZeroException If the divisor is zero.
*/
- public function remainder($that) : BigInteger
+ public function remainder(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -556,7 +536,7 @@ final class BigInteger extends BigNumber
*
* @throws DivisionByZeroException If the divisor is zero.
*/
- public function quotientAndRemainder($that) : array
+ public function quotientAndRemainder(BigNumber|int|float|string $that) : array
{
$that = BigInteger::of($that);
@@ -582,11 +562,9 @@ final class BigInteger extends BigNumber
*
* @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
*
- * @return BigInteger
- *
* @throws DivisionByZeroException If the divisor is zero.
*/
- public function mod($that) : BigInteger
+ public function mod(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -602,10 +580,6 @@ final class BigInteger extends BigNumber
/**
* Returns the modular multiplicative inverse of this BigInteger modulo $m.
*
- * @param BigInteger $m
- *
- * @return BigInteger
- *
* @throws DivisionByZeroException If $m is zero.
* @throws NegativeNumberException If $m is negative.
* @throws MathException If this BigInteger has no multiplicative inverse mod m (that is, this BigInteger
@@ -642,12 +616,10 @@ final class BigInteger extends BigNumber
* @param BigNumber|int|float|string $exp The exponent. Must be positive or zero.
* @param BigNumber|int|float|string $mod The modulus. Must be strictly positive.
*
- * @return BigInteger
- *
* @throws NegativeNumberException If any of the operands is negative.
* @throws DivisionByZeroException If the modulus is zero.
*/
- public function modPow($exp, $mod) : BigInteger
+ public function modPow(BigNumber|int|float|string $exp, BigNumber|int|float|string $mod) : BigInteger
{
$exp = BigInteger::of($exp);
$mod = BigInteger::of($mod);
@@ -671,10 +643,8 @@ final class BigInteger extends BigNumber
* The GCD is always positive, unless both operands are zero, in which case it is zero.
*
* @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number.
- *
- * @return BigInteger
*/
- public function gcd($that) : BigInteger
+ public function gcd(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -696,8 +666,6 @@ final class BigInteger extends BigNumber
*
* The result is the largest x such that x² ≤ n.
*
- * @return BigInteger
- *
* @throws NegativeNumberException If this number is negative.
*/
public function sqrt() : BigInteger
@@ -713,8 +681,6 @@ final class BigInteger extends BigNumber
/**
* Returns the absolute value of this number.
- *
- * @return BigInteger
*/
public function abs() : BigInteger
{
@@ -723,8 +689,6 @@ final class BigInteger extends BigNumber
/**
* Returns the inverse of this number.
- *
- * @return BigInteger
*/
public function negated() : BigInteger
{
@@ -737,10 +701,8 @@ final class BigInteger extends BigNumber
* This method returns a negative BigInteger if and only if both operands are negative.
*
* @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number.
- *
- * @return BigInteger
*/
- public function and($that) : BigInteger
+ public function and(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -753,10 +715,8 @@ final class BigInteger extends BigNumber
* This method returns a negative BigInteger if and only if either of the operands is negative.
*
* @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number.
- *
- * @return BigInteger
*/
- public function or($that) : BigInteger
+ public function or(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -769,10 +729,8 @@ final class BigInteger extends BigNumber
* This method returns a negative BigInteger if and only if exactly one of the operands is negative.
*
* @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number.
- *
- * @return BigInteger
*/
- public function xor($that) : BigInteger
+ public function xor(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);
@@ -781,8 +739,6 @@ final class BigInteger extends BigNumber
/**
* Returns the bitwise-not of this BigInteger.
- *
- * @return BigInteger
*/
public function not() : BigInteger
{
@@ -791,10 +747,6 @@ final class BigInteger extends BigNumber
/**
* Returns the integer left shifted by a given number of bits.
- *
- * @param int $distance The distance to shift.
- *
- * @return BigInteger
*/
public function shiftedLeft(int $distance) : BigInteger
{
@@ -811,10 +763,6 @@ final class BigInteger extends BigNumber
/**
* Returns the integer right shifted by a given number of bits.
- *
- * @param int $distance The distance to shift.
- *
- * @return BigInteger
*/
public function shiftedRight(int $distance) : BigInteger
{
@@ -840,8 +788,6 @@ final class BigInteger extends BigNumber
*
* For positive BigIntegers, this is equivalent to the number of bits in the ordinary binary representation.
* Computes (ceil(log2(this < 0 ? -this : this+1))).
- *
- * @return int
*/
public function getBitLength() : int
{
@@ -860,8 +806,6 @@ final class BigInteger extends BigNumber
* Returns the index of the rightmost (lowest-order) one bit in this BigInteger.
*
* Returns -1 if this BigInteger contains no one bits.
- *
- * @return int
*/
public function getLowestSetBit() : int
{
@@ -881,8 +825,6 @@ final class BigInteger extends BigNumber
/**
* Returns whether this number is even.
- *
- * @return bool
*/
public function isEven() : bool
{
@@ -891,8 +833,6 @@ final class BigInteger extends BigNumber
/**
* Returns whether this number is odd.
- *
- * @return bool
*/
public function isOdd() : bool
{
@@ -906,8 +846,6 @@ final class BigInteger extends BigNumber
*
* @param int $n The bit to test, 0-based.
*
- * @return bool
- *
* @throws \InvalidArgumentException If the bit to test is negative.
*/
public function testBit(int $n) : bool
@@ -919,10 +857,7 @@ final class BigInteger extends BigNumber
return $this->shiftedRight($n)->isOdd();
}
- /**
- * {@inheritdoc}
- */
- public function compareTo($that) : int
+ public function compareTo(BigNumber|int|float|string $that) : int
{
$that = BigNumber::of($that);
@@ -933,49 +868,31 @@ final class BigInteger extends BigNumber
return - $that->compareTo($this);
}
- /**
- * {@inheritdoc}
- */
public function getSign() : int
{
return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1);
}
- /**
- * {@inheritdoc}
- */
public function toBigInteger() : BigInteger
{
return $this;
}
- /**
- * {@inheritdoc}
- */
public function toBigDecimal() : BigDecimal
{
- return BigDecimal::create($this->value);
+ return self::newBigDecimal($this->value);
}
- /**
- * {@inheritdoc}
- */
public function toBigRational() : BigRational
{
- return BigRational::create($this, BigInteger::one(), false);
+ return self::newBigRational($this, BigInteger::one(), false);
}
- /**
- * {@inheritdoc}
- */
public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
{
return $this->toBigDecimal()->toScale($scale, $roundingMode);
}
- /**
- * {@inheritdoc}
- */
public function toInt() : int
{
$intValue = (int) $this->value;
@@ -987,9 +904,6 @@ final class BigInteger extends BigNumber
return $intValue;
}
- /**
- * {@inheritdoc}
- */
public function toFloat() : float
{
return (float) $this->value;
@@ -1000,10 +914,6 @@ final class BigInteger extends BigNumber
*
* The output will always be lowercase for bases greater than 10.
*
- * @param int $base
- *
- * @return string
- *
* @throws \InvalidArgumentException If the base is out of range.
*/
public function toBase(int $base) : string
@@ -1027,8 +937,6 @@ final class BigInteger extends BigNumber
*
* @param string $alphabet The alphabet, for example '01' for base 2, or '01234567' for base 8.
*
- * @return string
- *
* @throws NegativeNumberException If this number is negative.
* @throws \InvalidArgumentException If the given alphabet does not contain at least 2 chars.
*/
@@ -1063,8 +971,6 @@ final class BigInteger extends BigNumber
*
* @param bool $signed Whether to output a signed number in two's-complement representation with a leading sign bit.
*
- * @return string
- *
* @throws NegativeNumberException If $signed is false, and the number is negative.
*/
public function toBytes(bool $signed = true) : string
@@ -1108,9 +1014,6 @@ final class BigInteger extends BigNumber
return \hex2bin($hex);
}
- /**
- * {@inheritdoc}
- */
public function __toString() : string
{
return $this->value;
@@ -1136,8 +1039,6 @@ final class BigInteger extends BigNumber
*
* @param array{value: string} $data
*
- * @return void
- *
* @throws \LogicException
*/
public function __unserialize(array $data): void
@@ -1153,8 +1054,6 @@ final class BigInteger extends BigNumber
* This method is required by interface Serializable and SHOULD NOT be accessed directly.
*
* @internal
- *
- * @return string
*/
public function serialize() : string
{
@@ -1167,10 +1066,6 @@ final class BigInteger extends BigNumber
* @internal
* @psalm-suppress RedundantPropertyInitializationCheck
*
- * @param string $value
- *
- * @return void
- *
* @throws \LogicException
*/
public function unserialize($value) : void