Merge pull request #16 from mlemanczyk/codex/fix-evenperfectbitscanner-gpu-output

Fix residue mode to skip incremental scan
This commit is contained in:
Marek Lemańczyk authored and GitHub committed 2025-09-13 11:57:17 +02:00
commit 3f39e78e48
2 files changed
+14 -8

No files matched your search

@@ -12,5 +12,12 @@ public class MersenneResidueModeTests
var tester = new MersenneNumberTester(useResidue: true, useIncremental: false); var tester = new MersenneNumberTester(useResidue: true, useIncremental: false);
tester.IsMersennePrime(136_000_002UL).Should().BeFalse(); tester.IsMersennePrime(136_000_002UL).Should().BeFalse();
} }
[Fact]
public void IsMersennePrime_residue_mode_accepts_prime_exponent()
{
var tester = new MersenneNumberTester(useResidue: true, useIncremental: true, maxK: 1_000UL);
tester.IsMersennePrime(31UL).Should().BeTrue();
}
} }
+7 -8
View File
@@ -27,8 +27,8 @@ public sealed class MersenneNumberTester(
bool useResidue = true, bool useResidue = true,
ulong maxK = 5_000_000UL) ulong maxK = 5_000_000UL)
{ {
private readonly bool _useIncremental = useIncremental;
private readonly bool _useResidue = useResidue; private readonly bool _useResidue = useResidue;
private readonly bool _useIncremental = useIncremental && !useResidue;
private readonly ulong _maxK = maxK; private readonly ulong _maxK = maxK;
private readonly GpuKernelType _kernelType = kernelType; private readonly GpuKernelType _kernelType = kernelType;
private readonly bool _useModuloWorkaround = useModuloWorkaround; private readonly bool _useModuloWorkaround = useModuloWorkaround;
@@ -217,11 +217,13 @@ public sealed class MersenneNumberTester(
UInt128 maxK = UInt128Numbers.Two.Pow(exponent) / 2 + 1; UInt128 maxK = UInt128Numbers.Two.Pow(exponent) / 2 + 1;
bool lastIsSeven = (exponent & 3UL) == 3UL; bool lastIsSeven = (exponent & 3UL) == 3UL;
// This is how maxK was for residue test before changes UInt128 maxK = maxKOverride ?? ResidueMaxK; // In residue mode the residue scan is the final primality check.
if (_useResidue) if (_useResidue)
{ {
// Disable this is if we don't want to hard limit maxK if ((UInt128)_maxK < maxK)
// maxK = _maxK > maxK ? maxK : _maxK; {
maxK = _maxK;
}
if (_useGpuScan) if (_useGpuScan)
{ {
@@ -232,10 +234,7 @@ public sealed class MersenneNumberTester(
_residueCpuTester!.Scan(exponent, twoP, lastIsSeven, maxK, ref prePrime); _residueCpuTester!.Scan(exponent, twoP, lastIsSeven, maxK, ref prePrime);
} }
if (!prePrime) return prePrime;
{
return false;
}
} }
if (!_useIncremental) if (!_useIncremental)