Support for q > 2^64 added in --mersenne=bydivisor mode
This commit is contained in:
1 parent
cf5bd6bc1a
commit
86f20ed083
11 files changed
+542
-222
No files matched your search
@@ -1,3 +1,4 @@
|
||||
using System.Numerics;
|
||||
using FluentAssertions;
|
||||
using PerfectNumbers.Core.Gpu.Accelerators;
|
||||
using Xunit;
|
||||
@@ -12,7 +13,7 @@ public class MersenneNumberDivisorByDivisorTesterTests
|
||||
{
|
||||
var candidates = new List<ulong> { 5UL, 7UL, 11UL, 13UL };
|
||||
var tester = new FakeTester();
|
||||
var results = new List<(ulong Prime, bool Searched, bool Detailed, bool Passed, ulong Divisor)>();
|
||||
var results = new List<(ulong Prime, bool Searched, bool Detailed, bool Passed, BigInteger Divisor)>();
|
||||
int compositeMarks = 0;
|
||||
int clearedMarks = 0;
|
||||
|
||||
@@ -31,12 +32,12 @@ public class MersenneNumberDivisorByDivisorTesterTests
|
||||
compositeMarks.Should().Be(2);
|
||||
clearedMarks.Should().Be(2);
|
||||
results.Should().Equal(
|
||||
new[]
|
||||
new (ulong Prime, bool Searched, bool Detailed, bool Passed, BigInteger Divisor)[]
|
||||
{
|
||||
(5UL, true, true, true, 0UL),
|
||||
(7UL, true, true, false, 7UL),
|
||||
(11UL, true, true, false, 11UL),
|
||||
(13UL, true, true, true, 0UL),
|
||||
(5UL, true, true, true, BigInteger.Zero),
|
||||
(7UL, true, true, false, new BigInteger(7)),
|
||||
(11UL, true, true, false, new BigInteger(11)),
|
||||
(13UL, true, true, true, BigInteger.Zero),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -46,7 +47,7 @@ public class MersenneNumberDivisorByDivisorTesterTests
|
||||
|
||||
public int BatchSize { get; set; }
|
||||
|
||||
public ulong MinK { get; set; }
|
||||
public BigInteger MinK { get; set; }
|
||||
|
||||
public string? StateFilePath { get; set; }
|
||||
|
||||
@@ -54,7 +55,7 @@ public class MersenneNumberDivisorByDivisorTesterTests
|
||||
{
|
||||
}
|
||||
|
||||
public void ResumeFromState(ulong lastSavedK)
|
||||
public void ResumeFromState(BigInteger lastSavedK)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -70,7 +71,7 @@ public class MersenneNumberDivisorByDivisorTesterTests
|
||||
return DivisorLimit;
|
||||
}
|
||||
|
||||
public bool IsPrime(PrimeOrderCalculatorAccelerator gpu, ulong prime, out bool divisorsExhausted, out ulong divisor)
|
||||
public bool IsPrime(PrimeOrderCalculatorAccelerator gpu, ulong prime, out bool divisorsExhausted, out BigInteger divisor)
|
||||
{
|
||||
divisorsExhausted = true;
|
||||
if (prime % 7UL == 0UL)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Numerics;
|
||||
using FluentAssertions;
|
||||
using PerfectNumbers.Core.Cpu;
|
||||
using PerfectNumbers.Core.Gpu.Accelerators;
|
||||
@@ -17,17 +18,17 @@ public class MersenneNumberDivisorCpuTesterTests
|
||||
var gpu = PrimeOrderCalculatorAccelerator.Rent(1);
|
||||
try
|
||||
{
|
||||
tester.IsPrime(gpu, 5UL, out bool divisorsExhausted, out ulong divisor).Should().BeTrue();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().Be(0UL);
|
||||
tester.IsPrime(gpu, 5UL, out bool divisorsExhausted, out BigInteger divisor).Should().BeTrue();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().Be(BigInteger.Zero);
|
||||
|
||||
tester.IsPrime(gpu, 7UL, out divisorsExhausted, out divisor).Should().BeTrue();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().Be(0UL);
|
||||
tester.IsPrime(gpu, 7UL, out divisorsExhausted, out divisor).Should().BeTrue();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().Be(BigInteger.Zero);
|
||||
|
||||
tester.IsPrime(gpu, 11UL, out divisorsExhausted, out divisor).Should().BeFalse();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().BeGreaterThan(0UL);
|
||||
tester.IsPrime(gpu, 11UL, out divisorsExhausted, out divisor).Should().BeFalse();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().BeGreaterThan(BigInteger.Zero);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Numerics;
|
||||
using System.Reflection;
|
||||
using FluentAssertions;
|
||||
using PerfectNumbers.Core.Cpu;
|
||||
@@ -102,17 +103,17 @@ public class MersenneNumberDivisorGpuTesterTests
|
||||
var gpu = PrimeOrderCalculatorAccelerator.Rent(1);
|
||||
try
|
||||
{
|
||||
tester.IsPrime(gpu, 31UL, out bool exhausted, out ulong divisor).Should().BeTrue();
|
||||
tester.IsPrime(gpu, 31UL, out bool exhausted, out BigInteger divisor).Should().BeTrue();
|
||||
exhausted.Should().BeTrue();
|
||||
divisor.Should().Be(0UL);
|
||||
divisor.Should().Be(BigInteger.Zero);
|
||||
|
||||
tester.IsPrime(gpu, 37UL, out exhausted, out divisor).Should().BeFalse();
|
||||
exhausted.Should().BeTrue();
|
||||
divisor.Should().BeGreaterThan(0UL);
|
||||
divisor.Should().BeGreaterThan(BigInteger.Zero);
|
||||
|
||||
tester.IsPrime(gpu, 43UL, out exhausted, out divisor).Should().BeFalse();
|
||||
exhausted.Should().BeTrue();
|
||||
divisor.Should().BeGreaterThan(0UL);
|
||||
divisor.Should().BeGreaterThan(BigInteger.Zero);
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -145,15 +146,15 @@ public class MersenneNumberDivisorGpuTesterTests
|
||||
var gpu = PrimeOrderCalculatorAccelerator.Rent(1);
|
||||
try
|
||||
{
|
||||
tester.IsPrime(gpu, 31UL, out _, out ulong divisor).Should().BeTrue();
|
||||
divisor.Should().Be(0UL);
|
||||
tester.IsPrime(gpu, 31UL, out _, out BigInteger divisor).Should().BeTrue();
|
||||
divisor.Should().Be(BigInteger.Zero);
|
||||
tester.IsPrime(gpu, 37UL, out bool exhausted, out divisor).Should().BeFalse();
|
||||
exhausted.Should().BeTrue();
|
||||
divisor.Should().BeGreaterThan(0UL);
|
||||
divisor.Should().BeGreaterThan(BigInteger.Zero);
|
||||
|
||||
tester.IsPrime(gpu, 41UL, out bool divisorsExhausted, out divisor).Should().BeFalse();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().BeGreaterThan(0UL);
|
||||
divisor.Should().BeGreaterThan(BigInteger.Zero);
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -175,16 +176,16 @@ public class MersenneNumberDivisorGpuTesterTests
|
||||
var gpu = PrimeOrderCalculatorAccelerator.Rent(1);
|
||||
try
|
||||
{
|
||||
tester.IsPrime(gpu, exponent, out bool exhausted, out ulong divisor).Should().Be(expectedPrime);
|
||||
tester.IsPrime(gpu, exponent, out bool exhausted, out BigInteger divisor).Should().Be(expectedPrime);
|
||||
|
||||
exhausted.Should().BeTrue();
|
||||
if (expectedPrime)
|
||||
{
|
||||
divisor.Should().Be(0UL);
|
||||
divisor.Should().Be(BigInteger.Zero);
|
||||
}
|
||||
else
|
||||
{
|
||||
divisor.Should().BeGreaterThan(0UL);
|
||||
divisor.Should().BeGreaterThan(BigInteger.Zero);
|
||||
}
|
||||
}
|
||||
finally
|
||||
@@ -207,9 +208,9 @@ public class MersenneNumberDivisorGpuTesterTests
|
||||
var gpu = PrimeOrderCalculatorAccelerator.Rent(1);
|
||||
try
|
||||
{
|
||||
tester.IsPrime(gpu, 41UL, out bool divisorsExhausted, out ulong divisor).Should().BeFalse();
|
||||
tester.IsPrime(gpu, 41UL, out bool divisorsExhausted, out BigInteger divisor).Should().BeFalse();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().BeGreaterThan(0UL);
|
||||
divisor.Should().BeGreaterThan(BigInteger.Zero);
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -397,9 +398,9 @@ public class MersenneNumberDivisorGpuTesterTests
|
||||
.GetField("_divisorLimit", BindingFlags.NonPublic | BindingFlags.Instance)!
|
||||
.SetValue(tester, 200UL);
|
||||
|
||||
tester.IsPrime(gpu, 19UL, out bool divisorsExhausted, out ulong divisor).Should().BeTrue();
|
||||
tester.IsPrime(gpu, 19UL, out bool divisorsExhausted, out BigInteger divisor).Should().BeTrue();
|
||||
divisorsExhausted.Should().BeTrue();
|
||||
divisor.Should().Be(0UL);
|
||||
divisor.Should().Be(BigInteger.Zero);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user