From d6dc1b38fc9f0c8d97ca9a824a9eabc90242e89a Mon Sep 17 00:00:00 2001 From: peterLee Date: Fri, 10 Nov 2017 19:43:56 +0800 Subject: [PATCH] Add the isPrimeNumber method (#4) * add required extension: ext-gmp * update the PHP version * remove checking PHP 5.6 * add allow_failure for hhvm and 5.6 * remove hhvm and php 5.6 * add the isPrimeNumber method. * modify the test prime number method --- src/BigInteger.php | 17 +++++++ tests/BigIntegerPrimeNumberTest.php | 75 +++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 tests/BigIntegerPrimeNumberTest.php diff --git a/src/BigInteger.php b/src/BigInteger.php index 1e456bb..77ad9d1 100644 --- a/src/BigInteger.php +++ b/src/BigInteger.php @@ -221,6 +221,23 @@ public function subtract(string $value): BigInteger return $this->assignValue($calculatedValue); } + /** + * Checks if the big integr is the prime number. + * + * @param float $probabilityFactor A normalized factor between 0 and 1 used for checking the probability. + * @return bool Returns true if the number is a prime number false if not. + */ + public function isPrimeNumber(float $probabilityFactor = 1.0): bool + { + $reps = (int)floor(($probabilityFactor * 5.0) + 5.0); + + if ($reps < 5 || $reps > 10) { + throw new InvalidArgumentException('The provided probability number should be 5 to 10.'); + } + + return gmp_prob_prime($this->value, $reps) !== 0; + } + /** * Checks if this object is mutable. * diff --git a/tests/BigIntegerPrimeNumberTest.php b/tests/BigIntegerPrimeNumberTest.php new file mode 100644 index 0000000..b339c68 --- /dev/null +++ b/tests/BigIntegerPrimeNumberTest.php @@ -0,0 +1,75 @@ +isPrimeNumber(); + + // Assert + $this::assertFalse($withoutPrimeNumber); + } + + public function testIsPrimeNumberWithPrimeNumber() + { + // Arrange + $bigInteger = new BigInteger('11'); + + // Act + $withPrimeNumber = $bigInteger->isPrimeNumber(); + + // Assert + $this::assertTrue($withPrimeNumber); + } + + public function testIsPrimeNumberWithoutProbabilePrimeNumber() + { + // Arrange + $bigInteger = new BigInteger('1111111111111111111'); + + // Act + $probabilePrimeNumber = $bigInteger->isPrimeNumber(); + + // Assert + $this::assertTrue($probabilePrimeNumber); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testIsPrimeNumberProvidedProbabilityNumberIsLessThan5() + { + // Arrange + $bigInteger = new BigInteger('1111111111111111111'); + + // Act + $probabilePrimeNumber = $bigInteger->isPrimeNumber(-1.0); + + // Assert + // ... + } + + /** + * @expectedException InvalidArgumentException + */ + public function testIsPrimeNumberProvidedProbabilityNumberIsGreaterThan10() + { + // Arrange + $bigInteger = new BigInteger('1111111111111111111'); + + // Act + $probabilePrimeNumber = $bigInteger->isPrimeNumber(2.0); + + // Assert + // ... + } +}