From ee4787d2447f1f910f7744b44ee3c6cc0f1432fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Fri, 17 Oct 2025 06:02:54 +0200 Subject: [PATCH] Use GPU helper for partial factor small primes --- .../PrimeOrderCalculator.Cpu.cs | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs index 3e4d7db..d5d9699 100644 --- a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs +++ b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs @@ -729,14 +729,40 @@ internal static partial class PrimeOrderCalculator // We don't need to worry about leftovers, because we always use indexes within the calculated counts // primeSlots.Clear(); // exponentSlots.Clear(); - if (!TryPopulateSmallPrimeFactorsCpu(value, limit, primeSlots, exponentSlots, out factorCount, out remaining)) + + counts = ThreadStaticPools.RentUlongIntDictionary(Math.Max(FactorSlotCount, 8)); + counts.Clear(); + + bool gpuPopulated = TryPopulateSmallPrimeFactorsGpu(value, limit, counts, out remaining); + if (!gpuPopulated) { - useDictionary = true; - counts = ThreadStaticPools.RentUlongIntDictionary(Math.Max(factorCount, 8)); + counts.Clear(); remaining = PopulateSmallPrimeFactorsCpu(value, limit, counts); } + + int dictionaryCount = counts.Count; + if (dictionaryCount <= FactorSlotCount) + { + int copyIndex = 0; + foreach (KeyValuePair entry in counts) + { + primeSlots[copyIndex] = entry.Key; + exponentSlots[copyIndex] = entry.Value; + copyIndex++; + } + + factorCount = copyIndex; + ThreadStaticPools.ReturnUlongIntDictionary(counts); + counts = null; + } + else + { + useDictionary = true; + factorCount = dictionaryCount; + } } + if (remaining > 1UL) { pending.Add(remaining);