BitContradictionSolverWithQMultiplier improvements. BitContradictionSolverWithAMultiplier added.

This commit is contained in:
mlemanczyk committed 2026-01-12 20:50:54 +01:00
1 parent dc7a499f82
commit bf93bcff1a
5 files changed
+883 -88

No files matched your search

@@ -749,6 +749,7 @@ public struct MersenneNumberDivisorByDivisorCpuTesterWithTemplate() : IMersenneN
// Default: frontier/windowed scan over (q,a) space.
MersenneCombinedDivisorScannerFullStreamExtended.QNibbleGenerator16.SelfTest(138000001);
// MersenneBitTreeDivisorScannerWithAMultiplier.ScanResult scanResult = MersenneBitTreeDivisorScannerWithAMultiplier.TryFindDivisorByStreamingScan(prime, 128, false, out BigInteger branchDivisor);
MersenneCombinedDivisorScannerFullStreamExtended.ScanResult scanResult = MersenneCombinedDivisorScannerFullStreamExtended.TryFindDivisorByStreamingScan(prime, 128, false, out BigInteger branchDivisor);
// if (TryExactBitTreeCheck(prime, allowedMax, minK, step, out BigInteger branchDivisor))
if (scanResult == MersenneCombinedDivisorScannerFullStreamExtended.ScanResult.FoundDivisor)
@@ -4498,14 +4499,17 @@ public struct MersenneNumberDivisorByDivisorCpuTesterWithTemplate() : IMersenneN
{
Stopwatch sw = Stopwatch.StartNew();
divides = false;
const ulong DebugTopDownDivisor = 1209708008767UL;
// const ulong DebugTopDownDivisor = 1209708008767UL;
// const ulong DebugTopDownDivisor = 1007991562955719UL;
if (prime == 0 || divisor <= BigInteger.One)
{
Console.WriteLine($"[bitcontradiction] invalid inputs {prime} / {divisor}");
return false;
}
// Divisors generated by EvenPerfectBitScanner are of the form 2kp+1 and are never even. No need to check these.
// if (prime == 0 || divisor <= BigInteger.One)
// {
// Console.WriteLine($"[bitcontradiction] invalid inputs {prime} / {divisor}");
// return false;
// }
// divisor = DebugTopDownDivisor;
int qBitLength = GetBitLengthPortable(divisor);
if (qBitLength > (int)prime)
{
@@ -4513,12 +4517,13 @@ public struct MersenneNumberDivisorByDivisorCpuTesterWithTemplate() : IMersenneN
return true;
}
// Divisors generated by EvenPerfectBitScanner are of the form 2kp+1 and are never even. No need to check it.
// Fast structural contradictions only: q must be odd and the implied maximum length of a must be positive.
if ((divisor & BigInteger.One) == BigInteger.Zero)
{
divides = false;
return true;
}
// if ((divisor & BigInteger.One) == BigInteger.Zero)
// {
// divides = false;
// return true;
// }
if (prime <= (ulong)qBitLength)
{
@@ -4545,7 +4550,10 @@ public struct MersenneNumberDivisorByDivisorCpuTesterWithTemplate() : IMersenneN
ReadOnlySpan<int> oneOffsetsSlice = oneOffsets[..oneCount];
ulong exponent = effectiveExponent > 0UL ? effectiveExponent : prime;
bool decided = BitContradictionSolver.TryCheckDivisibilityFromOneOffsets(oneOffsetsSlice, exponent, out divides, out var reason);
// BitContradictionSolverWithQMultiplier.SetDebugEnabled(true);
bool decided = BitContradictionSolverWithQMultiplier.TryCheckDivisibilityFromOneOffsets(oneOffsetsSlice, exponent, out divides, out var reason);
// BitContradictionSolverWithQMultiplier.SetDebugEnabled(false);
// bool decided = BitContradictionSolverBaseline.TryCheckDivisibilityFromOneOffsets(oneOffsetsSlice, exponent, out divides, out var reason);
if (decided && divides)
{
// Verify to avoid false positives on structurally admissible but non-dividing q.
@@ -4554,26 +4562,31 @@ public struct MersenneNumberDivisorByDivisorCpuTesterWithTemplate() : IMersenneN
if (!dividesExact)
{
divides = false;
reason = BitContradictionSolver.ContradictionReason.ParityUnreachable;
reason = ContradictionReason.ParityUnreachable;
}
}
sw.Stop();
if (decided && !divides)
{
if (reason == BitContradictionSolver.ContradictionReason.ParityUnreachable &&
divisor <= ulong.MaxValue &&
(ulong)divisor == DebugTopDownDivisor)
if (reason == ContradictionReason.ParityUnreachable)
{
var failure = BitContradictionSolver.LastTopDownFailure;
var failure = BitContradictionSolverWithQMultiplier.LastTopDownFailure;
if (failure.HasValue)
{
var info = failure.Value;
Console.WriteLine($"[bit-contradiction] top-down prune failed at column={info.Column} carry=[{info.CarryMin},{info.CarryMax}] unknown={info.Unknown}");
}
var bottomUp = BitContradictionSolverWithQMultiplier.LastBottomUpFailure;
if (bottomUp.HasValue)
{
var info = bottomUp.Value;
Console.WriteLine($"[bit-contradiction] bottom-up failed at column={info.Column} carry=[{info.CarryMin},{info.CarryMax}] forced={info.Forced} unknown={info.Unknown}");
}
}
string message = $"[bit-contradiction] p={prime} ruled out divisor={divisor} ({reason})";
string mesfsage = $"[bit-contradiction] p={prime} ruled out divisor={divisor} ({reason})";
// Console.WriteLine(message);
_bitContradictionStateRepository?.Upsert(prime, message);
}