No. of divisor cycle iterations made configurable

This commit is contained in:
Marek Lemańczyk committed 2025-09-11 01:20:15 +02:00
1 parent c8c80f2f91
commit f17f83e326
2 files changed
+14 -6

No files matched your search

+12 -6
View File
@@ -29,10 +29,9 @@ internal static class Program
private static bool _useResidue;
private static bool _useDivisor;
private static ulong _divisor;
private static MersenneNumberDivisorGpuTester? _divisorTester;
private static (ulong divisor, uint cycle)[]? _divisorCandidates;
private const int ExtraDivisorCycleSearchLimit = 32;
private static ulong? _orderWarmupLimitOverride;
private static MersenneNumberDivisorGpuTester? _divisorTester;
private static (ulong divisor, uint cycle)[]? _divisorCandidates;
private static ulong? _orderWarmupLimitOverride;
private static unsafe delegate*<ulong, ref ulong, ulong> _transformP;
private static long _state;
private static bool _limitReached;
@@ -76,6 +75,7 @@ private static ulong? _orderWarmupLimitOverride;
string cyclesPath = DefaultCyclesPath;
int cyclesBatchSize = 512;
bool continueCyclesGeneration = false;
int divisorCyclesSearchLimit = PerfectNumberConstants.ExtraDivisorCycleSearchLimit;
// NTT backend selection (GPU): reference vs staged
for (int i = 0; i < args.Length; i++)
@@ -137,6 +137,11 @@ private static ulong? _orderWarmupLimitOverride;
int eq = arg.IndexOf('=');
divisor = ulong.Parse(arg.AsSpan(eq + 1));
}
else if (arg.StartsWith("--divisor-cycles-limit=", StringComparison.OrdinalIgnoreCase))
{
int eq = arg.IndexOf('=');
divisorCyclesSearchLimit = int.Parse(arg.AsSpan(eq + 1));
}
else if (arg.StartsWith("--residue-max-k=", StringComparison.OrdinalIgnoreCase))
{
int eq = arg.IndexOf('=');
@@ -714,6 +719,7 @@ private static ulong? _orderWarmupLimitOverride;
Console.WriteLine(" --divisor-cycles-device=cpu|gpu device for cycles generation (default gpu)");
Console.WriteLine(" --divisor-cycles-batch-size=<value> batch size for cycles generation (default 512)");
Console.WriteLine(" --divisor-cycles-continue continue divisor cycles generation");
Console.WriteLine(" --divisor-cycles-limit=<value> cycle search iterations when --mersenne=divisor");
Console.WriteLine(" --use-order test primality via q order");
Console.WriteLine(" --workaround-mod avoid '%' operator on the GPU");
@@ -948,7 +954,7 @@ private static ulong? _orderWarmupLimitOverride;
return IsEvenPerfectCandidate(p, out _, out _);
}
internal static bool IsEvenPerfectCandidate(ulong p, out bool searchedMersenne, out bool detailedCheck)
internal static bool IsEvenPerfectCandidate(ulong p, int divisorCyclesSearchLimit, out bool searchedMersenne, out bool detailedCheck)
{
searchedMersenne = false;
detailedCheck = false;
@@ -1043,7 +1049,7 @@ private static ulong? _orderWarmupLimitOverride;
}
}
for (int k = 1; k <= ExtraDivisorCycleSearchLimit; k++)
for (int k = 1; k <= divisorCyclesSearchLimit; k++)
{
ulong kMul2 = 2UL * (ulong)k;
if (p > ulong.MaxValue / kMul2)
@@ -5,4 +5,6 @@ public static class PerfectNumberConstants
public const ulong BiggestKnownEvenPerfectP = 136279841UL;
public static readonly uint PrimesLimit = 1_000_000; //(ulong)Array.MaxLength;// 1_000_000;
public const int MaxQForDivisorCycles = 4_000_000;
public const int ExtraDivisorCycleSearchLimit = 64;
}