BitContradiction improvements to be aware of the highest "a" bit being 1 and of the minimum and maximum "a" bit length.
This commit is contained in:
1 parent
d0dbb8f92a
commit
12c477b1a2
1 file changed
+76
-2
@@ -325,6 +325,13 @@ internal static class BitContradictionSolverWithAMultiplier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long topIndex0 = maxAllowedA;
|
||||||
|
long topIndex1 = maxAllowedA - 1L;
|
||||||
|
bool top0KnownOne = topIndex0 == 0L;
|
||||||
|
bool top1KnownOne = topIndex1 == 0L;
|
||||||
|
bool top0KnownZero = false;
|
||||||
|
bool top1KnownZero = false;
|
||||||
|
|
||||||
if (!TryModularPrefilter(qOneOffsets, p, maxAllowedA))
|
if (!TryModularPrefilter(qOneOffsets, p, maxAllowedA))
|
||||||
{
|
{
|
||||||
reason = ContradictionReason.ParityUnreachable;
|
reason = ContradictionReason.ParityUnreachable;
|
||||||
@@ -382,7 +389,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!TryProcessBottomUpBlock(qOneOffsets, maxAllowedA, lowColumn, blockSize, ref carryLow, ref maxKnownA, ref segmentBase, ref bottomWindowStart, ref bottomWindowEnd, segmentState0, segmentState1, out reason))
|
if (!TryProcessBottomUpBlock(qOneOffsets, maxAllowedA, lowColumn, blockSize, ref carryLow, ref maxKnownA, ref segmentBase, ref bottomWindowStart, ref bottomWindowEnd, segmentState0, segmentState1, topIndex0, topIndex1, ref top0KnownOne, ref top1KnownOne, ref top0KnownZero, ref top1KnownZero, out reason))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -449,6 +456,12 @@ internal static class BitContradictionSolverWithAMultiplier
|
|||||||
ref int windowEndIdx,
|
ref int windowEndIdx,
|
||||||
sbyte[] segmentState0,
|
sbyte[] segmentState0,
|
||||||
sbyte[] segmentState1,
|
sbyte[] segmentState1,
|
||||||
|
long topIndex0,
|
||||||
|
long topIndex1,
|
||||||
|
ref bool top0KnownOne,
|
||||||
|
ref bool top1KnownOne,
|
||||||
|
ref bool top0KnownZero,
|
||||||
|
ref bool top1KnownZero,
|
||||||
out ContradictionReason reason)
|
out ContradictionReason reason)
|
||||||
{
|
{
|
||||||
long endColumn = startColumn + columnCount;
|
long endColumn = startColumn + columnCount;
|
||||||
@@ -615,6 +628,26 @@ internal static class BitContradictionSolverWithAMultiplier
|
|||||||
{
|
{
|
||||||
maxKnownA = chosenIndex;
|
maxKnownA = chosenIndex;
|
||||||
}
|
}
|
||||||
|
if (chosenIndex == topIndex0)
|
||||||
|
{
|
||||||
|
if (top0KnownZero)
|
||||||
|
{
|
||||||
|
reason = ContradictionReason.ParityUnreachable;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
top0KnownOne = true;
|
||||||
|
}
|
||||||
|
else if (chosenIndex == topIndex1)
|
||||||
|
{
|
||||||
|
if (top1KnownZero)
|
||||||
|
{
|
||||||
|
reason = ContradictionReason.ParityUnreachable;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
top1KnownOne = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -625,11 +658,52 @@ internal static class BitContradictionSolverWithAMultiplier
|
|||||||
// Console.WriteLine($"[bit-contradiction] unknown==1 parity forces zero at column={column} carry=[{minSum},{maxSum}] forced={forced} chosenIndex={chosenIndex}");
|
// Console.WriteLine($"[bit-contradiction] unknown==1 parity forces zero at column={column} carry=[{minSum},{maxSum}] forced={forced} chosenIndex={chosenIndex}");
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// Treat the single unknown as 0 for parity, but do not record it as fixed.
|
// Treat the single unknown as 0 for parity.
|
||||||
unknown = 0;
|
unknown = 0;
|
||||||
|
|
||||||
|
if (chosenIndex == topIndex0)
|
||||||
|
{
|
||||||
|
if (top0KnownOne)
|
||||||
|
{
|
||||||
|
reason = ContradictionReason.ParityUnreachable;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
top0KnownZero = true;
|
||||||
|
}
|
||||||
|
else if (chosenIndex == topIndex1)
|
||||||
|
{
|
||||||
|
if (top1KnownOne)
|
||||||
|
{
|
||||||
|
reason = ContradictionReason.ParityUnreachable;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
top1KnownZero = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((top0KnownZero && top0KnownOne) || (top1KnownZero && top1KnownOne))
|
||||||
|
{
|
||||||
|
reason = ContradictionReason.ParityUnreachable;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (topIndex1 < 0)
|
||||||
|
{
|
||||||
|
if (top0KnownZero)
|
||||||
|
{
|
||||||
|
reason = ContradictionReason.ParityUnreachable;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (top0KnownZero && top1KnownZero)
|
||||||
|
{
|
||||||
|
reason = ContradictionReason.ParityUnreachable;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (unknown == 0)
|
if (unknown == 0)
|
||||||
{
|
{
|
||||||
int requiredCarryParity = 1 ^ ((int)forced & 1);
|
int requiredCarryParity = 1 ^ ((int)forced & 1);
|
||||||
|
|||||||
Reference in new issue
Block a user