Treat Pollard Rho success as the GPU primality check

This commit is contained in:
Marek Lemańczyk committed 2025-10-05 06:26:09 +02:00
1 parent b6b372bc59
commit 26cc574020
7 files changed
+2188 -213

No files matched your search

+22 -8
View File
@@ -143,7 +143,8 @@ public class MersenneDivisorCycles
PrimeOrderCalculator.PrimeOrderResultWide wideResult = PrimeOrderCalculator.Calculate(
divisor,
previousOrder: null,
PrimeOrderCalculator.PrimeOrderSearchConfig.HeuristicDefault);
PrimeOrderCalculator.PrimeOrderSearchConfig.HeuristicDefault,
PrimeOrderCalculator.PrimeOrderHeuristicDevice.Cpu);
if (wideResult.Order != UInt128.Zero)
{
return wideResult.Order;
@@ -192,7 +193,8 @@ public class MersenneDivisorCycles
PrimeOrderCalculator.PrimeOrderResult orderResult = PrimeOrderCalculator.Calculate(
divisor,
previousOrder: null,
PrimeOrderCalculator.PrimeOrderSearchConfig.HeuristicDefault);
PrimeOrderCalculator.PrimeOrderSearchConfig.HeuristicDefault,
PrimeOrderCalculator.PrimeOrderHeuristicDevice.Cpu);
if (orderResult.Order != 0UL)
{
cycleLength = orderResult.Order;
@@ -818,15 +820,24 @@ public class MersenneDivisorCycles
public static ulong CalculateCycleLength(ulong divisor)
{
// For divisor = 2^k, cycle is 1
if (TryCalculateCycleLengthHeuristic(divisor, out ulong cycleLength))
return cycleLength;
return CalculateCycleLengthFallback(divisor);
}
internal static bool TryCalculateCycleLengthHeuristic(ulong divisor, out ulong cycleLength)
{
if ((divisor & (divisor - 1UL)) == 0UL)
{
return 1UL;
cycleLength = 1UL;
return true;
}
if (divisor <= 3UL)
{
return CalculateCycleLengthFallback(divisor);
cycleLength = CalculateCycleLengthFallback(divisor);
return true;
}
if (PrimeTester.IsPrimeInternal(divisor, CancellationToken.None))
@@ -834,14 +845,17 @@ public class MersenneDivisorCycles
PrimeOrderCalculator.PrimeOrderResult orderResult = PrimeOrderCalculator.Calculate(
divisor,
previousOrder: null,
PrimeOrderCalculator.PrimeOrderSearchConfig.HeuristicDefault);
PrimeOrderCalculator.PrimeOrderSearchConfig.HeuristicDefault,
PrimeOrderCalculator.PrimeOrderHeuristicDevice.Cpu);
if (orderResult.Order != 0UL)
{
return orderResult.Order;
cycleLength = orderResult.Order;
return true;
}
}
return CalculateCycleLengthFallback(divisor);
cycleLength = 0UL;
return false;
}
private static ulong CalculateCycleLengthFallback(ulong divisor)