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:
1 file changed
+37
-31
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user