From 282861d996b45d26c1438a77e9a2d9cd6830da58 Mon Sep 17 00:00:00 2001 From: Jean-Paul Ruiz Date: Sun, 24 Aug 2025 15:00:48 -0400 Subject: [PATCH 1/3] Adding comparison test --- .phpunit.result.cache | 2 +- src/thehappycat/numerictools/Integer.php | 35 ++++++ tests/PrimalityComparisonTest.php | 153 +++++++++++++++++++++++ 3 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 tests/PrimalityComparisonTest.php diff --git a/.phpunit.result.cache b/.phpunit.result.cache index 71569de..6a4e4a4 100644 --- a/.phpunit.result.cache +++ b/.phpunit.result.cache @@ -1 +1 @@ -{"version":2,"defects":{"PrimeNumberTest::testIsPrime":8,"PrimeNumberTest::testModPow":8,"PrimeNumberTest::testLargePrimeNumbers":8,"PrimeNumberTest::testEdgeCases":8,"IntegerTest::testIntegerValidations":7,"IntegerTest::testDivisionByBiggerDivisorException":7,"PrimeGeneratorTest::testGeneratePrime":7,"PrimeGeneratorTest::testPrimeGenerationPerformance":8,"PrimeGeneratorTest::testLargePrimeGeneration":8},"times":{"IntegerTest::testIntegerValidations":0.002,"IntegerTest::testInvalidNumberException":0,"IntegerTest::testCreateDefault":0,"IntegerTest::testCreateByInt":0,"IntegerTest::testCreateByString":0,"IntegerTest::testPrint":0,"IntegerTest::testAdd":0.083,"IntegerTest::testLargeAddition":0,"IntegerTest::testSubtract":0.082,"IntegerTest::testLargeSubtraction":0,"IntegerTest::testNegativeSubtraction":0,"IntegerTest::testSubtractWithNegativeResults":0.172,"IntegerTest::testLargeNegativeSubtraction":0,"IntegerTest::testMultiplyByInt":0,"IntegerTest::testMultiplyByIntException":0,"IntegerTest::testMultiply":0.428,"IntegerTest::testGreaterThan":0.049,"IntegerTest::testGreaterOrEqualTo":0,"IntegerTest::testStringLength":14.224,"IntegerTest::testMaximumMultiplier":0.026,"IntegerTest::testMaxMultiplierException":0,"IntegerTest::testNumberLength":0,"IntegerTest::testDivision":0.003,"IntegerTest::testDivisionByZeroException":0,"IntegerTest::testDivisionByBiggerDivisorException":0,"IntegerTest::testSeveralDivisions":0.064,"IntegerTest::testModule":0.001,"IntegerTest::testCreatingLargeNumber":0.001,"PrimeNumberTest::testIsPrime":0.012,"PrimeNumberTest::testIsProbablePrime":0,"PrimeNumberTest::testModPow":0,"PrimeNumberTest::testGcd":0,"PrimeNumberTest::testLcm":0,"PrimeNumberTest::testLargePrimeNumbers":0.17,"PrimeNumberTest::testEdgeCases":0,"PrimeGeneratorTest::testGenerateRandomOdd":0,"PrimeGeneratorTest::testGeneratePrime":0.415,"PrimeGeneratorTest::testGeneratePrimeSmallBits":0.013,"PrimeGeneratorTest::testGenerateTwinPrimes":0.355,"PrimeGeneratorTest::testGenerateNextPrime":0.007,"PrimeGeneratorTest::testGeneratePrimesInRange":0.029,"PrimeGeneratorTest::testGenerateRandomPrimeInRange":0.01,"PrimeGeneratorTest::testGenerateSophieGermainPrime":0.745,"PrimeGeneratorTest::testInvalidBitLength":0,"PrimeGeneratorTest::testInvalidBitLengthRandomOdd":0,"PrimeGeneratorTest::testPrimeGenerationPerformance":0.525,"PrimeGeneratorTest::testLargePrimeGeneration":1.584,"PrimeGeneratorTest::testPrimeProperties":0.499}} \ No newline at end of file +{"version":2,"defects":{"PrimeNumberTest::testIsPrime":8,"PrimeNumberTest::testModPow":8,"PrimeNumberTest::testLargePrimeNumbers":8,"PrimeNumberTest::testEdgeCases":8,"IntegerTest::testIntegerValidations":7,"IntegerTest::testDivisionByBiggerDivisorException":7,"PrimeGeneratorTest::testGeneratePrime":7,"PrimeGeneratorTest::testPrimeGenerationPerformance":8,"PrimeGeneratorTest::testLargePrimeGeneration":8,"PrimalityComparisonTest::testSmallNumberComparison":7},"times":{"IntegerTest::testIntegerValidations":0.002,"IntegerTest::testInvalidNumberException":0,"IntegerTest::testCreateDefault":0,"IntegerTest::testCreateByInt":0,"IntegerTest::testCreateByString":0,"IntegerTest::testPrint":0,"IntegerTest::testAdd":0.083,"IntegerTest::testLargeAddition":0,"IntegerTest::testSubtract":0.082,"IntegerTest::testLargeSubtraction":0,"IntegerTest::testNegativeSubtraction":0,"IntegerTest::testSubtractWithNegativeResults":0.172,"IntegerTest::testLargeNegativeSubtraction":0,"IntegerTest::testMultiplyByInt":0,"IntegerTest::testMultiplyByIntException":0,"IntegerTest::testMultiply":0.428,"IntegerTest::testGreaterThan":0.049,"IntegerTest::testGreaterOrEqualTo":0,"IntegerTest::testStringLength":14.224,"IntegerTest::testMaximumMultiplier":0.026,"IntegerTest::testMaxMultiplierException":0,"IntegerTest::testNumberLength":0,"IntegerTest::testDivision":0.003,"IntegerTest::testDivisionByZeroException":0,"IntegerTest::testDivisionByBiggerDivisorException":0,"IntegerTest::testSeveralDivisions":0.064,"IntegerTest::testModule":0.001,"IntegerTest::testCreatingLargeNumber":0.001,"PrimeNumberTest::testIsPrime":0.012,"PrimeNumberTest::testIsProbablePrime":0,"PrimeNumberTest::testModPow":0,"PrimeNumberTest::testGcd":0,"PrimeNumberTest::testLcm":0,"PrimeNumberTest::testLargePrimeNumbers":0.17,"PrimeNumberTest::testEdgeCases":0,"PrimeGeneratorTest::testGenerateRandomOdd":0,"PrimeGeneratorTest::testGeneratePrime":0.415,"PrimeGeneratorTest::testGeneratePrimeSmallBits":0.013,"PrimeGeneratorTest::testGenerateTwinPrimes":0.355,"PrimeGeneratorTest::testGenerateNextPrime":0.007,"PrimeGeneratorTest::testGeneratePrimesInRange":0.029,"PrimeGeneratorTest::testGenerateRandomPrimeInRange":0.01,"PrimeGeneratorTest::testGenerateSophieGermainPrime":0.745,"PrimeGeneratorTest::testInvalidBitLength":0,"PrimeGeneratorTest::testInvalidBitLengthRandomOdd":0,"PrimeGeneratorTest::testPrimeGenerationPerformance":0.525,"PrimeGeneratorTest::testLargePrimeGeneration":1.584,"PrimeGeneratorTest::testPrimeProperties":0.499,"PrimalityComparisonTest::testSmallNumberComparison":0.005,"PrimalityComparisonTest::testMediumNumberComparison":1.723}} \ No newline at end of file diff --git a/src/thehappycat/numerictools/Integer.php b/src/thehappycat/numerictools/Integer.php index a11d3b8..28f32eb 100644 --- a/src/thehappycat/numerictools/Integer.php +++ b/src/thehappycat/numerictools/Integer.php @@ -641,6 +641,41 @@ public function isPrime(): bool return $this->isProbablePrime(20); } + /** + * Brute force primality test - tests every possible divisor + * WARNING: Extremely slow for large numbers! + * + * @return bool + */ + public function isPrimeBruteForce(): bool + { + if ($this->isNegative() || $this->isZero() || $this->getStringValue() === '1') { + return false; + } + + if ($this->getStringValue() === '2' || $this->getStringValue() === '3') { + return true; + } + + // Check if even + if ($this->mod(Integer::createByInt(2))->isZero()) { + return false; + } + + $sqrt = $this->sqrt(); + $divisor = Integer::createByInt(3); + + // Test odd divisors up to √n + while ($divisor->lessThanOrEqualTo($sqrt)) { + if ($this->mod($divisor)->isZero()) { + return false; // Found a divisor + } + $divisor = $divisor->add(Integer::createByInt(2)); + } + + return true; // No divisors found + } + /** * Check if this number is less than or equal to another number * diff --git a/tests/PrimalityComparisonTest.php b/tests/PrimalityComparisonTest.php new file mode 100644 index 0000000..4bcdad2 --- /dev/null +++ b/tests/PrimalityComparisonTest.php @@ -0,0 +1,153 @@ +isProbablePrime(5); + $probTime = (microtime(true) - $start) * 1000; + + // Test brute force method + $start = microtime(true); + $bruteResult = $number->isPrimeBruteForce(); + $bruteTime = (microtime(true) - $start) * 1000; + + echo "Probabilistic: " . ($probResult ? "Prime" : "Composite") . " in " . round($probTime, 2) . "ms\n"; + echo "Brute Force: " . ($bruteResult ? "Prime" : "Composite") . " in " . round($bruteTime, 2) . "ms\n"; + echo "Speedup: " . round($bruteTime / $probTime, 1) . "x faster\n"; + + $this->assertTrue($probResult); + $this->assertTrue($bruteResult); + // For small numbers, brute force might be faster due to setup overhead + $this->assertTrue($probTime < 10); // Should be fast + $this->assertTrue($bruteTime < 10); // Should be fast + } + + public function testMediumNumberComparison() + { + $number = Integer::createByString('1000000007'); // Known prime + + echo "\n=== Testing Medium Number (1000000007) ===\n"; + + // Test probabilistic method + $start = microtime(true); + $probResult = $number->isProbablePrime(5); + $probTime = (microtime(true) - $start) * 1000; + + // Test brute force method (this will take a while!) + echo "Running brute force test (this may take several minutes)...\n"; + $start = microtime(true); + $bruteResult = $number->isPrimeBruteForce(); + $bruteTime = (microtime(true) - $start) * 1000; + + echo "Probabilistic: " . ($probResult ? "Prime" : "Composite") . " in " . round($probTime, 2) . "ms\n"; + echo "Brute Force: " . ($bruteResult ? "Prime" : "Composite") . " in " . round($bruteTime, 2) . "ms\n"; + echo "Speedup: " . round($bruteTime / $probTime, 1) . "x faster\n"; + + $this->assertTrue($probResult); + $this->assertTrue($bruteResult); + $this->assertLessThan($bruteTime, $probTime); // Probabilistic should be faster + } + + public function testLargeNumberProbabilisticOnly() + { + $number = Integer::createByString('123456789012345678901234567890123456789'); + + echo "\n=== Testing Large Number (Probabilistic Only) ===\n"; + + // Only test probabilistic method for large numbers + $start = microtime(true); + $probResult = $number->isProbablePrime(10); + $probTime = (microtime(true) - $start) * 1000; + + echo "Number: " . $number->getStringValue() . "\n"; + echo "Digits: " . $number->getLength() . "\n"; + echo "Probabilistic: " . ($probResult ? "Prime" : "Composite") . " in " . round($probTime, 2) . "ms\n"; + echo "Brute Force: Would take approximately " . calculateBruteForceTime($number) . "\n"; + + // Don't test brute force - it would take too long! + $this->assertIsBool($probResult); + } + + public function testAccuracyComparison() + { + echo "\n=== Testing Accuracy ===\n"; + + // Test known primes + $knownPrimes = ['2', '3', '5', '7', '11', '13', '17', '19', '23', '29', '31', '37']; + $knownComposites = ['4', '6', '8', '9', '10', '12', '14', '15', '16', '18', '20', '21']; + + $probCorrect = 0; + $bruteCorrect = 0; + $total = count($knownPrimes) + count($knownComposites); + + // Test primes + foreach ($knownPrimes as $primeStr) { + $number = Integer::createByString($primeStr); + $probResult = $number->isProbablePrime(5); + $bruteResult = $number->isPrimeBruteForce(); + + if ($probResult) $probCorrect++; + if ($bruteResult) $bruteCorrect++; + } + + // Test composites + foreach ($knownComposites as $compositeStr) { + $number = Integer::createByString($compositeStr); + $probResult = $number->isProbablePrime(5); + $bruteResult = $number->isPrimeBruteForce(); + + if (!$probResult) $probCorrect++; + if (!$bruteResult) $bruteCorrect++; + } + + $probAccuracy = ($probCorrect / $total) * 100; + $bruteAccuracy = ($bruteCorrect / $total) * 100; + + echo "Probabilistic Accuracy: " . round($probAccuracy, 1) . "%\n"; + echo "Brute Force Accuracy: " . round($bruteAccuracy, 1) . "%\n"; + + $this->assertEquals(100, $bruteAccuracy); // Brute force should be 100% accurate + $this->assertGreaterThan(95, $probAccuracy); // Probabilistic should be >95% accurate + } +} + +/** + * Calculate estimated time for brute force primality test + * This is a rough approximation based on number size + */ +function calculateBruteForceTime(Integer $number): string +{ + $digits = $number->getLength(); + + // Rough approximation: O(√n) operations + // For n digits, √n ≈ 10^(n/2) + // Assuming each operation takes ~1 microsecond + + if ($digits <= 10) { + return "seconds"; + } elseif ($digits <= 20) { + return "minutes"; + } elseif ($digits <= 30) { + return "hours"; + } elseif ($digits <= 40) { + return "days"; + } else { + return "years or more"; + } +} From 07b822bac80582c86c5d641659b2589a9c037656 Mon Sep 17 00:00:00 2001 From: Jean-Paul Ruiz Date: Sun, 24 Aug 2025 15:07:06 -0400 Subject: [PATCH 2/3] Pushing PHPUnit result cache file --- .phpunit.result.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.phpunit.result.cache b/.phpunit.result.cache index 6a4e4a4..74f41f5 100644 --- a/.phpunit.result.cache +++ b/.phpunit.result.cache @@ -1 +1 @@ -{"version":2,"defects":{"PrimeNumberTest::testIsPrime":8,"PrimeNumberTest::testModPow":8,"PrimeNumberTest::testLargePrimeNumbers":8,"PrimeNumberTest::testEdgeCases":8,"IntegerTest::testIntegerValidations":7,"IntegerTest::testDivisionByBiggerDivisorException":7,"PrimeGeneratorTest::testGeneratePrime":7,"PrimeGeneratorTest::testPrimeGenerationPerformance":8,"PrimeGeneratorTest::testLargePrimeGeneration":8,"PrimalityComparisonTest::testSmallNumberComparison":7},"times":{"IntegerTest::testIntegerValidations":0.002,"IntegerTest::testInvalidNumberException":0,"IntegerTest::testCreateDefault":0,"IntegerTest::testCreateByInt":0,"IntegerTest::testCreateByString":0,"IntegerTest::testPrint":0,"IntegerTest::testAdd":0.083,"IntegerTest::testLargeAddition":0,"IntegerTest::testSubtract":0.082,"IntegerTest::testLargeSubtraction":0,"IntegerTest::testNegativeSubtraction":0,"IntegerTest::testSubtractWithNegativeResults":0.172,"IntegerTest::testLargeNegativeSubtraction":0,"IntegerTest::testMultiplyByInt":0,"IntegerTest::testMultiplyByIntException":0,"IntegerTest::testMultiply":0.428,"IntegerTest::testGreaterThan":0.049,"IntegerTest::testGreaterOrEqualTo":0,"IntegerTest::testStringLength":14.224,"IntegerTest::testMaximumMultiplier":0.026,"IntegerTest::testMaxMultiplierException":0,"IntegerTest::testNumberLength":0,"IntegerTest::testDivision":0.003,"IntegerTest::testDivisionByZeroException":0,"IntegerTest::testDivisionByBiggerDivisorException":0,"IntegerTest::testSeveralDivisions":0.064,"IntegerTest::testModule":0.001,"IntegerTest::testCreatingLargeNumber":0.001,"PrimeNumberTest::testIsPrime":0.012,"PrimeNumberTest::testIsProbablePrime":0,"PrimeNumberTest::testModPow":0,"PrimeNumberTest::testGcd":0,"PrimeNumberTest::testLcm":0,"PrimeNumberTest::testLargePrimeNumbers":0.17,"PrimeNumberTest::testEdgeCases":0,"PrimeGeneratorTest::testGenerateRandomOdd":0,"PrimeGeneratorTest::testGeneratePrime":0.415,"PrimeGeneratorTest::testGeneratePrimeSmallBits":0.013,"PrimeGeneratorTest::testGenerateTwinPrimes":0.355,"PrimeGeneratorTest::testGenerateNextPrime":0.007,"PrimeGeneratorTest::testGeneratePrimesInRange":0.029,"PrimeGeneratorTest::testGenerateRandomPrimeInRange":0.01,"PrimeGeneratorTest::testGenerateSophieGermainPrime":0.745,"PrimeGeneratorTest::testInvalidBitLength":0,"PrimeGeneratorTest::testInvalidBitLengthRandomOdd":0,"PrimeGeneratorTest::testPrimeGenerationPerformance":0.525,"PrimeGeneratorTest::testLargePrimeGeneration":1.584,"PrimeGeneratorTest::testPrimeProperties":0.499,"PrimalityComparisonTest::testSmallNumberComparison":0.005,"PrimalityComparisonTest::testMediumNumberComparison":1.723}} \ No newline at end of file +{"version":2,"defects":{"PrimeNumberTest::testIsPrime":8,"PrimeNumberTest::testModPow":8,"PrimeNumberTest::testLargePrimeNumbers":8,"PrimeNumberTest::testEdgeCases":8,"IntegerTest::testIntegerValidations":7,"IntegerTest::testDivisionByBiggerDivisorException":7,"PrimeGeneratorTest::testGeneratePrime":7,"PrimeGeneratorTest::testPrimeGenerationPerformance":8,"PrimeGeneratorTest::testLargePrimeGeneration":8,"PrimalityComparisonTest::testSmallNumberComparison":7},"times":{"IntegerTest::testIntegerValidations":0.002,"IntegerTest::testInvalidNumberException":0,"IntegerTest::testCreateDefault":0,"IntegerTest::testCreateByInt":0,"IntegerTest::testCreateByString":0,"IntegerTest::testPrint":0,"IntegerTest::testAdd":0.082,"IntegerTest::testLargeAddition":0,"IntegerTest::testSubtract":0.082,"IntegerTest::testLargeSubtraction":0,"IntegerTest::testNegativeSubtraction":0,"IntegerTest::testSubtractWithNegativeResults":0.176,"IntegerTest::testLargeNegativeSubtraction":0,"IntegerTest::testMultiplyByInt":0,"IntegerTest::testMultiplyByIntException":0,"IntegerTest::testMultiply":0.397,"IntegerTest::testGreaterThan":0.048,"IntegerTest::testGreaterOrEqualTo":0,"IntegerTest::testStringLength":14.207,"IntegerTest::testMaximumMultiplier":0.026,"IntegerTest::testMaxMultiplierException":0,"IntegerTest::testNumberLength":0,"IntegerTest::testDivision":0.002,"IntegerTest::testDivisionByZeroException":0,"IntegerTest::testDivisionByBiggerDivisorException":0,"IntegerTest::testSeveralDivisions":0.064,"IntegerTest::testModule":0,"IntegerTest::testCreatingLargeNumber":0.001,"PrimeNumberTest::testIsPrime":0.015,"PrimeNumberTest::testIsProbablePrime":0,"PrimeNumberTest::testModPow":0,"PrimeNumberTest::testGcd":0,"PrimeNumberTest::testLcm":0.001,"PrimeNumberTest::testLargePrimeNumbers":0.184,"PrimeNumberTest::testEdgeCases":0,"PrimeGeneratorTest::testGenerateRandomOdd":0,"PrimeGeneratorTest::testGeneratePrime":0.476,"PrimeGeneratorTest::testGeneratePrimeSmallBits":0.012,"PrimeGeneratorTest::testGenerateTwinPrimes":0.273,"PrimeGeneratorTest::testGenerateNextPrime":0.007,"PrimeGeneratorTest::testGeneratePrimesInRange":0.033,"PrimeGeneratorTest::testGenerateRandomPrimeInRange":0.012,"PrimeGeneratorTest::testGenerateSophieGermainPrime":0.197,"PrimeGeneratorTest::testInvalidBitLength":0,"PrimeGeneratorTest::testInvalidBitLengthRandomOdd":0,"PrimeGeneratorTest::testPrimeGenerationPerformance":0.424,"PrimeGeneratorTest::testLargePrimeGeneration":1.592,"PrimeGeneratorTest::testPrimeProperties":0.388,"PrimalityComparisonTest::testSmallNumberComparison":0.004,"PrimalityComparisonTest::testMediumNumberComparison":1.806,"PrimalityComparisonTest::testLargeNumberProbabilisticOnly":1.042,"PrimalityComparisonTest::testAccuracyComparison":0.009}} \ No newline at end of file From fc82d89cf2ac6aaf9d9245de5a76ed76c61ada60 Mon Sep 17 00:00:00 2001 From: Jean-Paul Ruiz Date: Sun, 24 Aug 2025 15:12:07 -0400 Subject: [PATCH 3/3] Fixing unit tests --- .phpunit.result.cache | 2 +- tests/PrimalityComparisonTest.php | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.phpunit.result.cache b/.phpunit.result.cache index 74f41f5..98580f0 100644 --- a/.phpunit.result.cache +++ b/.phpunit.result.cache @@ -1 +1 @@ -{"version":2,"defects":{"PrimeNumberTest::testIsPrime":8,"PrimeNumberTest::testModPow":8,"PrimeNumberTest::testLargePrimeNumbers":8,"PrimeNumberTest::testEdgeCases":8,"IntegerTest::testIntegerValidations":7,"IntegerTest::testDivisionByBiggerDivisorException":7,"PrimeGeneratorTest::testGeneratePrime":7,"PrimeGeneratorTest::testPrimeGenerationPerformance":8,"PrimeGeneratorTest::testLargePrimeGeneration":8,"PrimalityComparisonTest::testSmallNumberComparison":7},"times":{"IntegerTest::testIntegerValidations":0.002,"IntegerTest::testInvalidNumberException":0,"IntegerTest::testCreateDefault":0,"IntegerTest::testCreateByInt":0,"IntegerTest::testCreateByString":0,"IntegerTest::testPrint":0,"IntegerTest::testAdd":0.082,"IntegerTest::testLargeAddition":0,"IntegerTest::testSubtract":0.082,"IntegerTest::testLargeSubtraction":0,"IntegerTest::testNegativeSubtraction":0,"IntegerTest::testSubtractWithNegativeResults":0.176,"IntegerTest::testLargeNegativeSubtraction":0,"IntegerTest::testMultiplyByInt":0,"IntegerTest::testMultiplyByIntException":0,"IntegerTest::testMultiply":0.397,"IntegerTest::testGreaterThan":0.048,"IntegerTest::testGreaterOrEqualTo":0,"IntegerTest::testStringLength":14.207,"IntegerTest::testMaximumMultiplier":0.026,"IntegerTest::testMaxMultiplierException":0,"IntegerTest::testNumberLength":0,"IntegerTest::testDivision":0.002,"IntegerTest::testDivisionByZeroException":0,"IntegerTest::testDivisionByBiggerDivisorException":0,"IntegerTest::testSeveralDivisions":0.064,"IntegerTest::testModule":0,"IntegerTest::testCreatingLargeNumber":0.001,"PrimeNumberTest::testIsPrime":0.015,"PrimeNumberTest::testIsProbablePrime":0,"PrimeNumberTest::testModPow":0,"PrimeNumberTest::testGcd":0,"PrimeNumberTest::testLcm":0.001,"PrimeNumberTest::testLargePrimeNumbers":0.184,"PrimeNumberTest::testEdgeCases":0,"PrimeGeneratorTest::testGenerateRandomOdd":0,"PrimeGeneratorTest::testGeneratePrime":0.476,"PrimeGeneratorTest::testGeneratePrimeSmallBits":0.012,"PrimeGeneratorTest::testGenerateTwinPrimes":0.273,"PrimeGeneratorTest::testGenerateNextPrime":0.007,"PrimeGeneratorTest::testGeneratePrimesInRange":0.033,"PrimeGeneratorTest::testGenerateRandomPrimeInRange":0.012,"PrimeGeneratorTest::testGenerateSophieGermainPrime":0.197,"PrimeGeneratorTest::testInvalidBitLength":0,"PrimeGeneratorTest::testInvalidBitLengthRandomOdd":0,"PrimeGeneratorTest::testPrimeGenerationPerformance":0.424,"PrimeGeneratorTest::testLargePrimeGeneration":1.592,"PrimeGeneratorTest::testPrimeProperties":0.388,"PrimalityComparisonTest::testSmallNumberComparison":0.004,"PrimalityComparisonTest::testMediumNumberComparison":1.806,"PrimalityComparisonTest::testLargeNumberProbabilisticOnly":1.042,"PrimalityComparisonTest::testAccuracyComparison":0.009}} \ No newline at end of file +{"version":2,"defects":{"PrimeNumberTest::testIsPrime":8,"PrimeNumberTest::testModPow":8,"PrimeNumberTest::testLargePrimeNumbers":8,"PrimeNumberTest::testEdgeCases":8,"IntegerTest::testIntegerValidations":7,"IntegerTest::testDivisionByBiggerDivisorException":7,"PrimeGeneratorTest::testGeneratePrime":7,"PrimeGeneratorTest::testPrimeGenerationPerformance":8,"PrimeGeneratorTest::testLargePrimeGeneration":8,"PrimalityComparisonTest::testSmallNumberComparison":7},"times":{"IntegerTest::testIntegerValidations":0.002,"IntegerTest::testInvalidNumberException":0,"IntegerTest::testCreateDefault":0,"IntegerTest::testCreateByInt":0,"IntegerTest::testCreateByString":0,"IntegerTest::testPrint":0,"IntegerTest::testAdd":0.082,"IntegerTest::testLargeAddition":0,"IntegerTest::testSubtract":0.082,"IntegerTest::testLargeSubtraction":0,"IntegerTest::testNegativeSubtraction":0,"IntegerTest::testSubtractWithNegativeResults":0.176,"IntegerTest::testLargeNegativeSubtraction":0,"IntegerTest::testMultiplyByInt":0,"IntegerTest::testMultiplyByIntException":0,"IntegerTest::testMultiply":0.397,"IntegerTest::testGreaterThan":0.048,"IntegerTest::testGreaterOrEqualTo":0,"IntegerTest::testStringLength":14.207,"IntegerTest::testMaximumMultiplier":0.026,"IntegerTest::testMaxMultiplierException":0,"IntegerTest::testNumberLength":0,"IntegerTest::testDivision":0.002,"IntegerTest::testDivisionByZeroException":0,"IntegerTest::testDivisionByBiggerDivisorException":0,"IntegerTest::testSeveralDivisions":0.064,"IntegerTest::testModule":0,"IntegerTest::testCreatingLargeNumber":0.001,"PrimeNumberTest::testIsPrime":0.015,"PrimeNumberTest::testIsProbablePrime":0,"PrimeNumberTest::testModPow":0,"PrimeNumberTest::testGcd":0,"PrimeNumberTest::testLcm":0.001,"PrimeNumberTest::testLargePrimeNumbers":0.184,"PrimeNumberTest::testEdgeCases":0,"PrimeGeneratorTest::testGenerateRandomOdd":0,"PrimeGeneratorTest::testGeneratePrime":0.476,"PrimeGeneratorTest::testGeneratePrimeSmallBits":0.012,"PrimeGeneratorTest::testGenerateTwinPrimes":0.273,"PrimeGeneratorTest::testGenerateNextPrime":0.007,"PrimeGeneratorTest::testGeneratePrimesInRange":0.033,"PrimeGeneratorTest::testGenerateRandomPrimeInRange":0.012,"PrimeGeneratorTest::testGenerateSophieGermainPrime":0.197,"PrimeGeneratorTest::testInvalidBitLength":0,"PrimeGeneratorTest::testInvalidBitLengthRandomOdd":0,"PrimeGeneratorTest::testPrimeGenerationPerformance":0.424,"PrimeGeneratorTest::testLargePrimeGeneration":1.592,"PrimeGeneratorTest::testPrimeProperties":0.388,"PrimalityComparisonTest::testSmallNumberComparison":0.004,"PrimalityComparisonTest::testMediumNumberComparison":1.813,"PrimalityComparisonTest::testLargeNumberProbabilisticOnly":1.038,"PrimalityComparisonTest::testAccuracyComparison":0.008}} \ No newline at end of file diff --git a/tests/PrimalityComparisonTest.php b/tests/PrimalityComparisonTest.php index 4bcdad2..407e797 100644 --- a/tests/PrimalityComparisonTest.php +++ b/tests/PrimalityComparisonTest.php @@ -33,9 +33,13 @@ public function testSmallNumberComparison() $this->assertTrue($probResult); $this->assertTrue($bruteResult); - // For small numbers, brute force might be faster due to setup overhead - $this->assertTrue($probTime < 10); // Should be fast - $this->assertTrue($bruteTime < 10); // Should be fast + + // For small numbers, both should be fast (under 100ms in CI environment) + $this->assertTrue($probTime < 100, "Probabilistic test took too long: {$probTime}ms"); + $this->assertTrue($bruteTime < 100, "Brute force test took too long: {$bruteTime}ms"); + + // Both methods should give correct results + $this->assertTrue($probResult === $bruteResult, "Results should match"); } public function testMediumNumberComparison() @@ -61,7 +65,13 @@ public function testMediumNumberComparison() $this->assertTrue($probResult); $this->assertTrue($bruteResult); - $this->assertLessThan($bruteTime, $probTime); // Probabilistic should be faster + + // For medium numbers, probabilistic should be significantly faster + // Allow for some variance in CI environments + $this->assertTrue($probTime < $bruteTime * 0.8, "Probabilistic should be faster for medium numbers"); + + // Both methods should give correct results + $this->assertTrue($probResult === $bruteResult, "Results should match"); } public function testLargeNumberProbabilisticOnly()