Merge pull request #179 from mlemanczyk/codex/optimize-partialfactor-method-in-primeordercalculator

Hoist Pollard Rho deadline checks outside factoring loop
This commit is contained in:
Marek Lemańczyk authored and GitHub committed 2025-10-17 01:15:04 +02:00
commit 26894db181
1 file changed
+37 -31
+37 -31
View File
@@ -852,44 +852,50 @@ internal static partial class PrimeOrderCalculator
compositeStack.Push(remaining); compositeStack.Push(remaining);
pending.Clear(); pending.Clear();
long timestamp = 0L; bool pollardRhoDeadlineReached = Stopwatch.GetTimestamp() > deadlineTimestamp;
while (compositeStack.Count > 0) if (!pollardRhoDeadlineReached)
{ {
ulong composite = compositeStack.Pop(); while (compositeStack.Count > 0)
// composite will never be smaller than 1 on the execution path
// if (composite <= 1UL)
// {
// continue;
// }
if (!cache.TryGetValue(composite, out bool isPrime))
{ {
isPrime = Open.Numeric.Primes.Prime.Numbers.IsPrime(composite); ulong composite = compositeStack.Pop();
cache.Add(composite, isPrime); // composite will never be smaller than 1 on the execution path
// if (composite <= 1UL)
// {
// continue;
// }
if (!cache.TryGetValue(composite, out bool isPrime))
{
isPrime = Open.Numeric.Primes.Prime.Numbers.IsPrime(composite);
cache.Add(composite, isPrime);
}
if (isPrime)
{
AddFactorToCollector(ref useDictionary, ref counts, primeSlots, exponentSlots, ref factorCount, composite, 1);
continue;
}
if (!TryPollardRho(composite, deadlineTimestamp, out ulong factor))
{
pending.Add(composite);
continue;
}
ulong quotient = composite / factor;
compositeStack.Push(factor);
compositeStack.Push(quotient);
} }
if (isPrime) pollardRhoDeadlineReached = Stopwatch.GetTimestamp() > deadlineTimestamp;
{ }
AddFactorToCollector(ref useDictionary, ref counts, primeSlots, exponentSlots, ref factorCount, composite, 1);
continue;
}
timestamp = Stopwatch.GetTimestamp(); if (pollardRhoDeadlineReached)
if (timestamp > deadlineTimestamp) {
while (compositeStack.Count > 0)
{ {
pending.Add(composite); pending.Add(compositeStack.Pop());
continue;
} }
if (!TryPollardRho(composite, deadlineTimestamp, out ulong factor))
{
pending.Add(composite);
continue;
}
ulong quotient = composite / factor;
compositeStack.Push(factor);
compositeStack.Push(quotient);
} }
} }