From 2801832af99720b014a89b0d15befd52688e3090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Sat, 11 Oct 2025 21:47:39 +0200 Subject: [PATCH] Short-circuit divisor order reduction once the exponent is reached --- PerfectNumbers.Core/MersenneDivisorCycles.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/PerfectNumbers.Core/MersenneDivisorCycles.cs b/PerfectNumbers.Core/MersenneDivisorCycles.cs index a6b7659..55d6e81 100644 --- a/PerfectNumbers.Core/MersenneDivisorCycles.cs +++ b/PerfectNumbers.Core/MersenneDivisorCycles.cs @@ -352,7 +352,7 @@ public class MersenneDivisorCycles return false; } - cycleLength = ReduceOrder(divisorData, phi, factorCounts); + cycleLength = ReduceOrder(divisorData, phi, factorCounts, exponent); return true; } finally @@ -559,9 +559,13 @@ public class MersenneDivisorCycles } } - private static ulong ReduceOrder(in MontgomeryDivisorData divisorData, ulong initialOrder, Dictionary factorCounts) + private static ulong ReduceOrder( + in MontgomeryDivisorData divisorData, + ulong initialOrder, + Dictionary factorCounts, + ulong targetOrder) { - if (factorCounts.Count == 0) + if (factorCounts.Count == 0 || initialOrder == targetOrder) { return initialOrder; } @@ -599,6 +603,13 @@ public class MersenneDivisorCycles if (candidate.Pow2MontgomeryModWindowedCpu(divisorData, keepMontgomery: false) == 1UL) { order = candidate; + if (order == targetOrder) + { + // Early-exit once the order matches the tested exponent; + // further factor processing would not change the outcome for the by-divisor scan. + return order; + } + continue; }