Skip incremental scan in residue mode
This commit is contained in:
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);
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user