Skip incremental scan in residue mode

This commit is contained in:
Marek Lemańczyk committed 2025-09-13 11:57:04 +02:00
1 parent 5d6d5e69b0
commit f73a5a7ff4
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);
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,
ulong maxK = 5_000_000UL)
{
private readonly bool _useIncremental = useIncremental;
private readonly bool _useResidue = useResidue;
private readonly bool _useIncremental = useIncremental && !useResidue;
private readonly ulong _maxK = maxK;
private readonly GpuKernelType _kernelType = kernelType;
private readonly bool _useModuloWorkaround = useModuloWorkaround;
@@ -217,11 +217,13 @@ public sealed class MersenneNumberTester(
UInt128 maxK = UInt128Numbers.Two.Pow(exponent) / 2 + 1;
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)
{
// Disable this is if we don't want to hard limit maxK
// maxK = _maxK > maxK ? maxK : _maxK;
if ((UInt128)_maxK < maxK)
{
maxK = _maxK;
}
if (_useGpuScan)
{
@@ -232,10 +234,7 @@ public sealed class MersenneNumberTester(
_residueCpuTester!.Scan(exponent, twoP, lastIsSeven, maxK, ref prePrime);
}
if (!prePrime)
{
return false;
}
return prePrime;
}
if (!_useIncremental)