From f196f1fb9605dc2572d74097f88cbe35337493bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Thu, 9 Oct 2025 23:13:37 +0200 Subject: [PATCH] Assume heuristic order when divisors are unresolved --- PerfectNumbers.Core/PrimeOrderCalculator.Wide.cs | 5 +++-- PerfectNumbers.Core/PrimeOrderCalculator.cs | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/PerfectNumbers.Core/PrimeOrderCalculator.Wide.cs b/PerfectNumbers.Core/PrimeOrderCalculator.Wide.cs index 53b13c8..6c3e885 100644 --- a/PerfectNumbers.Core/PrimeOrderCalculator.Wide.cs +++ b/PerfectNumbers.Core/PrimeOrderCalculator.Wide.cs @@ -118,8 +118,9 @@ internal static partial class PrimeOrderCalculator return new PrimeOrderResultWide(PrimeOrderStatus.Found, order); } - HeuristicFailureLog.Record(prime, candidateOrder, HeuristicFailureReason.HeuristicPipelineUnresolved); - return FinishStrictlyWide(prime, divisorData, config.Mode); + HeuristicFailureLog.Record(prime, candidateOrder, HeuristicFailureReason.HeuristicPipelineAssumedFullOrder); + // The heuristic pipeline could not narrow the order any further; assume the current order is final. + return new PrimeOrderResultWide(PrimeOrderStatus.Found, candidateOrder); } private static PrimeOrderResultWide FinishStrictlyWide(UInt128 prime, in MontgomeryDivisorData divisorData, PrimeOrderMode mode) diff --git a/PerfectNumbers.Core/PrimeOrderCalculator.cs b/PerfectNumbers.Core/PrimeOrderCalculator.cs index d54b88e..b256906 100644 --- a/PerfectNumbers.Core/PrimeOrderCalculator.cs +++ b/PerfectNumbers.Core/PrimeOrderCalculator.cs @@ -48,6 +48,7 @@ internal static partial class PrimeOrderCalculator PhiPartialFactorizationFailed, StrictModeRequested, HeuristicPipelineUnresolved, + HeuristicPipelineAssumedFullOrder, } internal readonly struct PrimeOrderSearchConfig @@ -235,9 +236,10 @@ internal static partial class PrimeOrderCalculator return new PrimeOrderResult(PrimeOrderStatus.Found, order); } - // DebugLog("Heuristic unresolved, finishing strictly"); - HeuristicFailureLog.Record(prime, candidateOrder, HeuristicFailureReason.HeuristicPipelineUnresolved); - return FinishStrictly(prime, divisorData, config.Mode); + // DebugLog("Heuristic unresolved, assuming current order"); + HeuristicFailureLog.Record(prime, candidateOrder, HeuristicFailureReason.HeuristicPipelineAssumedFullOrder); + // The heuristic pipeline could not rule out additional divisors; assume the current order is final. + return new PrimeOrderResult(PrimeOrderStatus.Found, candidateOrder); } private static PrimeOrderResult FinishStrictly(ulong prime, in MontgomeryDivisorData divisorData, PrimeOrderMode mode)