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