From 411310cf404ea123c0a7d2207c44c5db16f961ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Sun, 15 Feb 2026 16:12:57 +0100 Subject: [PATCH] BitContradiction filtering improvements. --- .../BitContradictionSolverWithAMultiplier.cs | 84 ++++++++++--------- .../PerfectNumbers.Core.csproj | 1 + 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/PerfectNumbers.Core/ByDivisor/BitContradictionSolverWithAMultiplier.cs b/PerfectNumbers.Core/ByDivisor/BitContradictionSolverWithAMultiplier.cs index c5f591e..3fe1dfb 100644 --- a/PerfectNumbers.Core/ByDivisor/BitContradictionSolverWithAMultiplier.cs +++ b/PerfectNumbers.Core/ByDivisor/BitContradictionSolverWithAMultiplier.cs @@ -144,8 +144,8 @@ internal sealed class PrivateWorkSet internal static class BitContradictionSolverWithAMultiplier { #if DETAILED_LOG || WITH_PRUNE_STATS - private const ulong DebugTargetP = 138000953UL; - private static readonly BigInteger DebugTargetK = new(((337429718205079UL - 1UL) >> 1) / DebugTargetP); + private const ulong DebugTargetP = 138001793UL; + private static readonly BigInteger DebugTargetK = new(((1976939441553367UL - 1UL) >> 1) / DebugTargetP); private static readonly BigInteger DebugTargetQ = ((DebugTargetK * DebugTargetP) << 1) + BigInteger.One; // private const ulong DebugTargetQ = 1209708008767UL; @@ -2613,7 +2613,7 @@ internal static class BitContradictionSolverWithAMultiplier { pruneReason = CarryDropPruneReason.ZeroDrop; #if WITH_PRUNE_STATS - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); + // TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); #endif return true; } @@ -2640,8 +2640,8 @@ internal static class BitContradictionSolverWithAMultiplier ) { pruneReason = CarryDropPruneReason.DominanceReached10AndStayedAbove5; - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); #if WITH_PRUNE_STATS + // TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); #endif return true; } @@ -2653,9 +2653,9 @@ internal static class BitContradictionSolverWithAMultiplier ) { pruneReason = CarryDropPruneReason.Dominance1011121314; -#if WITH_PRUNE_STATS - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); -#endif +// #if WITH_PRUNE_STATS +// TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); +// #endif return true; } @@ -2664,9 +2664,9 @@ internal static class BitContradictionSolverWithAMultiplier (totalCarry67Count > totalCarry8Count && zeroCount < first10 && lowestCarryAfter10 >= 3 && (totalCarry7Count > totalCarry8Count || (totalCarry7Count & 1) == 1))) { pruneReason = CarryDropPruneReason.Dominance67ThenZeroDrop; -#if WITH_PRUNE_STATS - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); -#endif +// #if WITH_PRUNE_STATS +// TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); +// #endif return true; } @@ -2677,9 +2677,9 @@ internal static class BitContradictionSolverWithAMultiplier ) { pruneReason = CarryDropPruneReason.Dominance15161718Drop; -#if WITH_PRUNE_STATS - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); -#endif +// #if WITH_PRUNE_STATS +// TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); +// #endif return true; } @@ -2688,9 +2688,9 @@ internal static class BitContradictionSolverWithAMultiplier (totalCarry10Count >= totalCarry9Count || totalCarry8Count >= totalCarry9Count || totalCarry10Count < 190)) { pruneReason = CarryDropPruneReason.Dominance10AndMoreDrop; -#if WITH_PRUNE_STATS - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); -#endif +// #if WITH_PRUNE_STATS +// TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); +// #endif return true; } @@ -2714,9 +2714,9 @@ internal static class BitContradictionSolverWithAMultiplier ) { pruneReason = CarryDropPruneReason.Dominance10AndMoreDrop; -#if WITH_PRUNE_STATS - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); -#endif +// #if WITH_PRUNE_STATS +// TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); +// #endif return true; } @@ -2756,18 +2756,18 @@ internal static class BitContradictionSolverWithAMultiplier ) { pruneReason = CarryDropPruneReason.Dominance10AndMoreDrop; -#if WITH_PRUNE_STATS - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); -#endif +// #if WITH_PRUNE_STATS +// TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); +// #endif return true; } if (totalCarry7Count + totalCarry8Count > totalCarry9Count + totalCarry10Count && totalCarry11Count > 100) { pruneReason = CarryDropPruneReason.Dominance10AndMoreDrop; -#if WITH_PRUNE_STATS - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); -#endif +// #if WITH_PRUNE_STATS +// TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); +// #endif return true; } @@ -2790,7 +2790,7 @@ internal static class BitContradictionSolverWithAMultiplier AnsiConsole.MarkupLine($"[MediumOrchid1_1]{nameof(CarryDropPruneReason.HighDensityWithShortLowStreaks)}[/] prune reason for [DodgerBlue1]p[/]=[Gray100 Bold]{pLong}[/], [DodgerBlue1]q[/]=[Gray100 Bold]{qExact}[/]: [DarkOrange]totalCarryAbove10[/]=[Yellow]{totalCarryAbove10}[/], [DarkOrange]shortestStreakBelow10[/]=[Yellow]{shortestStreakBelow10}[/], [DarkOrange]lastStreakBelow10[/]=[Yellow]{lastStreakBelow10}[/], [DarkOrange]first10[/]=[Yellow]{first10}[/], [DarkOrange]totalCarryBelow10[/]=[Yellow]{totalCarryBelow10}[/], [DarkOrange]longestStreakBelow10[/]=[Yellow]{longestStreakBelow10}[/], [DarkOrange]totalCarry11Count[/]=[Yellow]{totalCarry11Count}[/]"); } - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); + // TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); #endif return true; } @@ -2825,7 +2825,7 @@ internal static class BitContradictionSolverWithAMultiplier ( lastStreakBelow10 >= 5 || lastStreakBelow10 == 0 || - (lastStreakBelow10 < 5 && totalTransitionsOver10 > 100) || + (lastStreakBelow10 < 5 && totalTransitionsOver10 > 90) || (lastStreakBelow10 < 5 && totalCarryBelow10 < 186) || (totalTransitionsOver10 < 100) ) @@ -2842,20 +2842,23 @@ internal static class BitContradictionSolverWithAMultiplier (lastStreakBelow10 <= 28 && lastStreakBelow10 > 0) || (longestStreakBelow10 < 49 && first10 < 32) || (totalTransitionsOver10 > 63 && longestStreakBelow10 > 40) || - (totalCarryBelow10 < 300 && totalCarry2Count < 8 && lastStreakBelow10 > 0) || - (totalTransitionsOver10 > 63 && first10 < 32) || - (totalTransitionsOver10 > 80 && totalCarryBelow10 > totalCarry10Count) || - (totalTransitionsOver10 > 100 && totalCarry10Count > totalCarryBelow10) || + (totalCarryBelow10 < 300 && totalCarry2Count < 8 && (lastStreakBelow10 > 0 || totalCarryBelow10 > totalCarry11Count)) || + (totalTransitionsOver10 > 44 && first10 < 32) || + (totalTransitionsOver10 > 44 && totalCarryBelow10 > totalCarry10Count) || + (totalTransitionsOver10 > 44 && totalCarry10Count >= totalCarryBelow10) || (totalCarry10Count > totalCarryBelow10 && totalCarry11Count > 200) ) ) || ( totalTransitionsOver10 <= 35 && ( - longestStreakBelow10 < 31 || + (longestStreakBelow10 < 31 && totalCarryBelow10 > 62) || + longestStreakBelow10 > 40 || + (longestStreakBelow10 > 0 && longestStreakBelow10 < 20) || + (longestStreakBelow10 > 30 && first10 < 32) || zeroCount > 10 ) && - zeroCount > 4 + (zeroCount > 4 || first10 < 32) ) ) ) || @@ -2885,7 +2888,7 @@ internal static class BitContradictionSolverWithAMultiplier AnsiConsole.MarkupLine($"[MediumOrchid1_1]{nameof(CarryDropPruneReason.DominanceReached10AndStayedAbove5)}[/] prune reason for [DodgerBlue1]p[/]=[Gray100 Bold]{pLong}[/], [DodgerBlue1]q[/]=[Gray100 Bold]{qExact}[/]: [DarkOrange]reached5[/]=[Yellow]{reached5}[/], [DarkOrange]totalTransitionsOver10[/]=[Yellow]{totalTransitionsOver10}[/], [DarkOrange]lastStreakBelow10[/]=[Yellow]{lastStreakBelow10}[/], [DarkOrange]longestStreakBelow10[/]=[Yellow]{longestStreakBelow10}[/], [DarkOrange]zeroCount[/]=[Yellow]{zeroCount}[/], [DarkOrange]first10[/]=[Yellow]{first10}[/], [DarkOrange]totalCarryBelow10[/]=[Yellow]{totalCarryBelow10}[/], [DarkOrange]totalCarry2[/]=[Yellow]{totalCarry2Count}[/], [DarkOrange]totalCarry10[/]=[Yellow]{totalCarry10Count}[/], [DarkOrange]totalCarry11[/]=[Yellow]{totalCarry11Count}[/]{Environment.NewLine}"); } - TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); + // TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount); #endif return true; } @@ -3128,13 +3131,15 @@ internal static class BitContradictionSolverWithAMultiplier reason = ContradictionReason.ParityUnreachable; #endif #if WITH_PRUNE_STATS - if (pLong == 138000953 && qExact.Equals(_testCase)) - { - AnsiConsole.MarkupLine($"Validating heuristic prune: p={pLong}, q={qExact}, reason={carryDropPruneReason}"); - } + // if (pLong == 138000953 && qExact.Equals(_testCase)) + // { + // AnsiConsole.MarkupLine($"Validating heuristic prune: p={pLong}, q={qExact}, reason={carryDropPruneReason}"); + // } #endif +#if WITH_PRUNE_VALIDATION ValidateHeuristicPruneAgainstPowmod2OrThrow(qExact, pLong, $"CarryDropHeuristic:{carryDropPruneReason}"); +#endif return true; } #if false @@ -3426,8 +3431,9 @@ internal static class BitContradictionSolverWithAMultiplier #if WITH_PRUNE_STATS IncrementPruneCounter(ref _prunedWithTryPropagateCarry1); #endif +#if WITH_PRUNE_VALIDATION ValidateHeuristicPruneAgainstPowmod2OrThrow(qExact, pLong, "TryPropagateCarry1"); - +#endif return true; } } diff --git a/PerfectNumbers.Core/PerfectNumbers.Core.csproj b/PerfectNumbers.Core/PerfectNumbers.Core.csproj index 0628fff..1f8797e 100644 --- a/PerfectNumbers.Core/PerfectNumbers.Core.csproj +++ b/PerfectNumbers.Core/PerfectNumbers.Core.csproj @@ -14,6 +14,7 @@ $(DefineConstants);WITH_PRUNE_STATS + $(DefineConstants);WITH_PRUNE_VALIDATION