FAILURE MAP
← Case archive

FA-15426 / Numerics / Open access

Exact tridiagonal solve: schur diagonal update · case 01

The exact exact tridiagonal solve result violates the stated contract at schur diagonal update.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The schur diagonal update step uses d[i]+low[i-1]*c[i-1] instead of d[i]-low[i-1]*c[i-1].

VERIFIED REPAIR

Use d[i]-low[i-1]*c[i-1] at the schur diagonal update step.

Unsuccessful approach: The partial repair d[i]-c[i-1] still violates the schur diagonal update invariant.

Case contract

Input [lower,diag,upper,rhs] integer tridiagonal system with nonzero Thomas pivots; return rational solution [p,q] per coordinate.

Why this case matters

Exact discrete arithmetic with observable algorithmic state; no floating point approximation is used.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import itertools
from fractions import Fraction
N = 1
observations = []
def solve(x):
    low,d,up,b=x;n=len(d)
    c=list(map(Fraction,up));r=list(map(Fraction,b));den=Fraction(d[0])
    if not den:return None
    if c:c[0]=c[0]/den
    r[0]=r[0]/den
    for i in range(1,n):
     den=d[i]+low[i-1]*c[i-1]
     if not den:return None
     if i<n-1:c[i]/=den
     r[i]=(r[i]-low[i-1]*r[i-1])/den
    for i in range(n-2,-1,-1):r[i]=r[i]-c[i]*r[i+1]
    return [[v.numerator,v.denominator] for v in r]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [2], [2, 2]], [[1, 4], [1, 4]]), ([[2], [6, 6], [-1], [-5, 3]], [[-27, 38], [14, 19]]), ([[1], [6, 6], [-1], [-5, -5]], [[-35, 37], [-25, 37]]), ([[1], [6, 6], [0], [-2, 4]], [[-1, 3], [13, 18]]), ([[1], [6, 6], [2], [-1, 4]], [[-7, 17], [25, 34]]), ([[-1], [6, 6], [-1], [4, 5]], [[29, 35], [34, 35]])], [([[2], [6, 6], [2], [2, 2]], [[1, 4], [1, 4]]), ([[-1], [6, 6], [-1], [4, 5]], [[29, 35], [34, 35]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [2], [2, 3]], [[3, 16], [7, 16]]), ([[-2], [6, 6], [2], [1, 1]], [[1, 10], [1, 5]]), ([[0], [6, 6], [1], [0, -1]], [[1, 36], [-1, 6]]), ([[-1], [6, 6], [1], [5, 1]], [[29, 37], [11, 37]])], [([[2], [6, 6], [-1], [-5, 3]], [[-27, 38], [14, 19]]), ([[-1], [6, 6], [-1], [1, 2]], [[8, 35], [13, 35]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [0], [0, 4]], [[0, 1], [2, 3]]), ([[-2], [6, 6], [0], [3, -4]], [[1, 2], [-1, 2]]), ([[0], [6, 6], [0], [1, -2]], [[1, 6], [-1, 3]]), ([[-2], [6, 6], [1], [5, 2]], [[14, 19], [11, 19]])], [([[1], [6, 6], [-1], [-5, -5]], [[-35, 37], [-25, 37]]), ([[0], [6, 6], [-1], [4, 3]], [[3, 4], [1, 2]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[0, -1], [6, 6, 6], [2, 1], [5, -2, 4]], [[217, 222], [-16, 37], [22, 37]]), ([[-1, -1], [6, 6, 6], [0, -1], [0, -3, -1]], [[0, 1], [-19, 35], [-9, 35]]), ([[-2, 0], [6, 6, 6], [0, -1], [-3, -5, 3]], [[-1, 2], [-11, 12], [1, 2]]), ([[1, 0], [6, 6, 6], [-1, 0], [-3, -3, 5]], [[-21, 37], [-15, 37], [5, 6]])], [([[1], [6, 6], [2], [-1, 4]], [[-7, 17], [25, 34]]), ([[-2], [6, 6], [2], [1, 1]], [[1, 10], [1, 5]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[-1, 2], [6, 6, 6], [-2, 1], [5, 3, -4]], [[107, 96], [27, 32], [-91, 96]]), ([[-2, 2], [6, 6, 6], [-2, 2], [2, -2, 0]], [[5, 21], [-2, 7], [2, 21]]), ([[-2, 1], [6, 6, 6], [0, 2], [4, 4, 2]], [[2, 3], [14, 17], [10, 51]]), ([[1, -1], [6, 6, 6], [-2, 0], [-5, -4, 0]], [[-1, 1], [-1, 2], [-1, 12]])]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("explicit oracle %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
explicit oracle 0[[-3, 17], [-33, 34]][[-4, 19], [-33, 38]]Failed
explicit oracle 1[[1, 2], [-1, 6], [143453, 164619], [-30832, 54873], [-12410, 23517], [-154, 201]][[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]Failed
explicit oracle 2[[4, 15], [1, 5]][[1, 4], [1, 4]]Failed
explicit oracle 3[[-71, 102], [14, 17]][[-27, 38], [14, 19]]Failed
explicit oracle 4[[-20, 21], [-5, 7]][[-35, 37], [-25, 37]]Failed
explicit oracle 5[[-1, 3], [13, 18]][[-1, 3], [13, 18]]Passed
explicit oracle 6[[-22, 57], [25, 38]][[-7, 17], [25, 34]]Failed
explicit oracle 7[[91, 111], [34, 37]][[29, 35], [34, 35]]Failed

SHA-256 / d720fb0b05d5366f91baf28863d6aefa9f4dae84bc899cfc4389ed8e74431a8b

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import itertools
from fractions import Fraction
N = 1
observations = []
def solve(x):
    low,d,up,b=x;n=len(d)
    c=list(map(Fraction,up));r=list(map(Fraction,b));den=Fraction(d[0])
    if not den:return None
    if c:c[0]=c[0]/den
    r[0]=r[0]/den
    for i in range(1,n):
     den=d[i]-c[i-1]
     if not den:return None
     if i<n-1:c[i]/=den
     r[i]=(r[i]-low[i-1]*r[i-1])/den
    for i in range(n-2,-1,-1):r[i]=r[i]-c[i]*r[i+1]
    return [[v.numerator,v.denominator] for v in r]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [2], [2, 2]], [[1, 4], [1, 4]]), ([[2], [6, 6], [-1], [-5, 3]], [[-27, 38], [14, 19]]), ([[1], [6, 6], [-1], [-5, -5]], [[-35, 37], [-25, 37]]), ([[1], [6, 6], [0], [-2, 4]], [[-1, 3], [13, 18]]), ([[1], [6, 6], [2], [-1, 4]], [[-7, 17], [25, 34]]), ([[-1], [6, 6], [-1], [4, 5]], [[29, 35], [34, 35]])], [([[2], [6, 6], [2], [2, 2]], [[1, 4], [1, 4]]), ([[-1], [6, 6], [-1], [4, 5]], [[29, 35], [34, 35]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [2], [2, 3]], [[3, 16], [7, 16]]), ([[-2], [6, 6], [2], [1, 1]], [[1, 10], [1, 5]]), ([[0], [6, 6], [1], [0, -1]], [[1, 36], [-1, 6]]), ([[-1], [6, 6], [1], [5, 1]], [[29, 37], [11, 37]])], [([[2], [6, 6], [-1], [-5, 3]], [[-27, 38], [14, 19]]), ([[-1], [6, 6], [-1], [1, 2]], [[8, 35], [13, 35]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [0], [0, 4]], [[0, 1], [2, 3]]), ([[-2], [6, 6], [0], [3, -4]], [[1, 2], [-1, 2]]), ([[0], [6, 6], [0], [1, -2]], [[1, 6], [-1, 3]]), ([[-2], [6, 6], [1], [5, 2]], [[14, 19], [11, 19]])], [([[1], [6, 6], [-1], [-5, -5]], [[-35, 37], [-25, 37]]), ([[0], [6, 6], [-1], [4, 3]], [[3, 4], [1, 2]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[0, -1], [6, 6, 6], [2, 1], [5, -2, 4]], [[217, 222], [-16, 37], [22, 37]]), ([[-1, -1], [6, 6, 6], [0, -1], [0, -3, -1]], [[0, 1], [-19, 35], [-9, 35]]), ([[-2, 0], [6, 6, 6], [0, -1], [-3, -5, 3]], [[-1, 2], [-11, 12], [1, 2]]), ([[1, 0], [6, 6, 6], [-1, 0], [-3, -3, 5]], [[-21, 37], [-15, 37], [5, 6]])], [([[1], [6, 6], [2], [-1, 4]], [[-7, 17], [25, 34]]), ([[-2], [6, 6], [2], [1, 1]], [[1, 10], [1, 5]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[-1, 2], [6, 6, 6], [-2, 1], [5, 3, -4]], [[107, 96], [27, 32], [-91, 96]]), ([[-2, 2], [6, 6, 6], [-2, 2], [2, -2, 0]], [[5, 21], [-2, 7], [2, 21]]), ([[-2, 1], [6, 6, 6], [0, 2], [4, 4, 2]], [[2, 3], [14, 17], [10, 51]]), ([[1, -1], [6, 6, 6], [-2, 0], [-5, -4, 0]], [[-1, 1], [-1, 2], [-1, 12]])]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("explicit oracle %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
explicit oracle 0[[-3, 17], [-33, 34]][[-4, 19], [-33, 38]]Failed
explicit oracle 1[[1, 2], [-1, 6], [2782681, 3186477], [-608620, 1062159], [-84995, 151737], [-3244, 4101]][[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]Failed
explicit oracle 2[[13, 51], [4, 17]][[1, 4], [1, 4]]Failed
explicit oracle 3[[-157, 222], [28, 37]][[-27, 38], [14, 19]]Failed
explicit oracle 4[[-35, 37], [-25, 37]][[-35, 37], [-25, 37]]Passed
explicit oracle 5[[-1, 3], [13, 18]][[-1, 3], [13, 18]]Passed
explicit oracle 6[[-7, 17], [25, 34]][[-7, 17], [25, 34]]Passed
explicit oracle 7[[91, 111], [34, 37]][[29, 35], [34, 35]]Failed

SHA-256 / 261997b7e6116cc3eb3da7b46332ace1b2eff45fa6c846f75b0fa41e7a092e41

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import itertools
from fractions import Fraction
N = 1
observations = []
def solve(x):
    low,d,up,b=x;n=len(d)
    c=list(map(Fraction,up));r=list(map(Fraction,b));den=Fraction(d[0])
    if not den:return None
    if c:c[0]=c[0]/den
    r[0]=r[0]/den
    for i in range(1,n):
     den=d[i]-low[i-1]*c[i-1]
     if not den:return None
     if i<n-1:c[i]/=den
     r[i]=(r[i]-low[i-1]*r[i-1])/den
    for i in range(n-2,-1,-1):r[i]=r[i]-c[i]*r[i+1]
    return [[v.numerator,v.denominator] for v in r]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [2], [2, 2]], [[1, 4], [1, 4]]), ([[2], [6, 6], [-1], [-5, 3]], [[-27, 38], [14, 19]]), ([[1], [6, 6], [-1], [-5, -5]], [[-35, 37], [-25, 37]]), ([[1], [6, 6], [0], [-2, 4]], [[-1, 3], [13, 18]]), ([[1], [6, 6], [2], [-1, 4]], [[-7, 17], [25, 34]]), ([[-1], [6, 6], [-1], [4, 5]], [[29, 35], [34, 35]])], [([[2], [6, 6], [2], [2, 2]], [[1, 4], [1, 4]]), ([[-1], [6, 6], [-1], [4, 5]], [[29, 35], [34, 35]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [2], [2, 3]], [[3, 16], [7, 16]]), ([[-2], [6, 6], [2], [1, 1]], [[1, 10], [1, 5]]), ([[0], [6, 6], [1], [0, -1]], [[1, 36], [-1, 6]]), ([[-1], [6, 6], [1], [5, 1]], [[29, 37], [11, 37]])], [([[2], [6, 6], [-1], [-5, 3]], [[-27, 38], [14, 19]]), ([[-1], [6, 6], [-1], [1, 2]], [[8, 35], [13, 35]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[2], [6, 6], [0], [0, 4]], [[0, 1], [2, 3]]), ([[-2], [6, 6], [0], [3, -4]], [[1, 2], [-1, 2]]), ([[0], [6, 6], [0], [1, -2]], [[1, 6], [-1, 3]]), ([[-2], [6, 6], [1], [5, 2]], [[14, 19], [11, 19]])], [([[1], [6, 6], [-1], [-5, -5]], [[-35, 37], [-25, 37]]), ([[0], [6, 6], [-1], [4, 3]], [[3, 4], [1, 2]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[0, -1], [6, 6, 6], [2, 1], [5, -2, 4]], [[217, 222], [-16, 37], [22, 37]]), ([[-1, -1], [6, 6, 6], [0, -1], [0, -3, -1]], [[0, 1], [-19, 35], [-9, 35]]), ([[-2, 0], [6, 6, 6], [0, -1], [-3, -5, 3]], [[-1, 2], [-11, 12], [1, 2]]), ([[1, 0], [6, 6, 6], [-1, 0], [-3, -3, 5]], [[-21, 37], [-15, 37], [5, 6]])], [([[1], [6, 6], [2], [-1, 4]], [[-7, 17], [25, 34]]), ([[-2], [6, 6], [2], [1, 1]], [[1, 10], [1, 5]]), ([[-1], [6, 6], [2], [-3, -5]], [[-4, 19], [-33, 38]]), ([[-2, -2, -1, -2, -2], [6, 6, 6, 6, 6, 6], [0, 0, 1, -2, -1], [3, -2, 5, -3, -2, -4]], [[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]), ([[-1, 2], [6, 6, 6], [-2, 1], [5, 3, -4]], [[107, 96], [27, 32], [-91, 96]]), ([[-2, 2], [6, 6, 6], [-2, 2], [2, -2, 0]], [[5, 21], [-2, 7], [2, 21]]), ([[-2, 1], [6, 6, 6], [0, 2], [4, 4, 2]], [[2, 3], [14, 17], [10, 51]]), ([[1, -1], [6, 6, 6], [-2, 0], [-5, -4, 0]], [[-1, 1], [-1, 2], [-1, 12]])]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("explicit oracle %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
explicit oracle 0[[-4, 19], [-33, 38]][[-4, 19], [-33, 38]]Passed
explicit oracle 1[[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]][[1, 2], [-1, 6], [487, 557], [-968, 1671], [-376, 557], [-1490, 1671]]Passed
explicit oracle 2[[1, 4], [1, 4]][[1, 4], [1, 4]]Passed
explicit oracle 3[[-27, 38], [14, 19]][[-27, 38], [14, 19]]Passed
explicit oracle 4[[-35, 37], [-25, 37]][[-35, 37], [-25, 37]]Passed
explicit oracle 5[[-1, 3], [13, 18]][[-1, 3], [13, 18]]Passed
explicit oracle 6[[-7, 17], [25, 34]][[-7, 17], [25, 34]]Passed
explicit oracle 7[[29, 35], [34, 35]][[29, 35], [34, 35]]Passed

SHA-256 / ddd5d0d7bd0a6eba66186b96c46c6b9f519aed9df9da4520a54fd71b8516acbe

Verification & scope

A deterministic bounded teaching model. Inputs are restricted to the explicit contract; this is not a production algebra library. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:39:26.715142+00:00.

Case digest / ddb24dd110847a7f4ac655b3eafbea491ea4160e0a45fde46418ee4af3bd1b10