From 9ab87a8b9be2c3b2b6e20c5b015e646ac7636277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Wed, 15 Oct 2025 21:55:30 +0200 Subject: [PATCH] Streamline factor cache lease usage in CPU tester --- ...MersenneNumberDivisorByDivisorCpuTester.cs | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs index 776f536..66963c3 100644 --- a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs +++ b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs @@ -132,12 +132,6 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv FactorCacheLease factorCacheLease = new FactorCacheLease(); Dictionary? factorCache = null; - bool foundDivisor = false; - bool requireLargeCycleCache = allowedMax > PerfectNumberConstants.MaxQForDivisorCycles; - if (requireLargeCycleCache) - { - factorCacheLease.EnsureInitialized(ref factorCache); - } DivisorCycleCache cycleCache = DivisorCycleCache.Shared; @@ -178,12 +172,16 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv } else { - Dictionary? cacheForCycle = requireLargeCycleCache ? factorCache : null; + if (factorCache is null) + { + factorCacheLease.EnsureInitialized(ref factorCache); + } + if (!MersenneDivisorCycles.TryCalculateCycleLengthForExponent( candidate, prime, divisorData, - cacheForCycle, + factorCache, out ulong computedCycle) || computedCycle == 0UL) { divisorCycle = cycleCache.GetCycleLength(candidate); @@ -198,8 +196,10 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv { // A cycle equal to the tested exponent (which is prime in this path) guarantees that the candidate divides // the corresponding Mersenne number because the order of 2 modulo the divisor is exactly p. - foundDivisor = true; - break; + factorCacheLease.Dispose(); + factorCache = null; + processedAll = true; + return true; } if (divisorCycle == 0UL) @@ -220,12 +220,6 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv factorCacheLease.Dispose(); factorCache = null; // The pooled dictionary was returned to the thread-static slot. - if (foundDivisor) - { - processedAll = true; - return true; - } - processedAll = divisor > limit; return false; }