FAILURE MAP
← Case archive

FA-14951 / Numerics / Open access

Primitive pythagorean triples: Euclid hypotenuse construction · case 01

The exact primitive pythagorean triples result violates the stated contract at Euclid hypotenuse construction.

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

ROOT CAUSE

The Euclid hypotenuse construction step uses m*m-n*n,m*n,m*m+n*n instead of m*m-n*n,2*m*n,m*m+n*n.

VERIFIED REPAIR

Use m*m-n*n,2*m*n,m*m+n*n at the Euclid hypotenuse construction step.

Unsuccessful approach: The partial repair m*m-n*n,2*m*n,m*m-n*n still violates the Euclid hypotenuse construction invariant.

Case contract

Input bound L>=1; return lexicographically sorted [a,b,c] with 0<a<b<c<=L, coprime a,b,c and a^2+b^2=c^2.

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):
    L=x;out=[]
    for m in range(2,math.isqrt(L)+2):
     for n in range(1,m):
      if math.gcd(m,n)!=1:continue
      if (m-n)%2==0:continue
      a,b,c=m*m-n*n,m*n,m*m+n*n
      a,b=sorted((a,b))
      if c<=L:out.append([a,b,c])
    return sorted(out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[(5, [[3, 4, 5]]), (3, []), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (2, []), (4, []), (6, [[3, 4, 5]]), (7, [[3, 4, 5]])], [(6, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (18, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (19, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (20, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (21, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (22, [[3, 4, 5], [5, 12, 13], [8, 15, 17]])], [(7, [[3, 4, 5]]), (9, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (35, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [20, 21, 29]]), (36, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [20, 21, 29]]), (37, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [12, 35, 37], [20, 21, 29]]), (38, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [12, 35, 37], [20, 21, 29]])], [(8, [[3, 4, 5]]), (12, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (52, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29]]), (53, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]]), (54, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]]), (55, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]])], [(9, [[3, 4, 5]]), (15, [[3, 4, 5], [5, 12, 13]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (69, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (70, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (71, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (72, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]])]]
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[[2, 3, 5]][[3, 4, 5]]Failed
explicit oracle 1[][]Passed
explicit oracle 2[][]Passed
explicit oracle 3[[2, 3, 5], [4, 15, 17], [5, 6, 13], [6, 35, 37], [7, 12, 25], [8, 63, 65], [9, 20, 41], [10, 21, 29], [10, 99, 101], [11, 30, 61], [12, 143, 145], [13, 42, 85], [14, 45, 53], [15, 56, 113], [17, 72, 145], [18, 77, 85], [22, 117, 125], [24, 55, 73], [26, 165, 173], [28, 33, 65], [30, 91, 109], [36, 65, 97], [39, 40, 89], [44, 105, 137], [51, 70, 149], [60, 119, 169], [66, 85, 157]][[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]Failed
explicit oracle 4[][]Passed
explicit oracle 5[][]Passed
explicit oracle 6[[2, 3, 5]][[3, 4, 5]]Failed
explicit oracle 7[[2, 3, 5]][[3, 4, 5]]Failed

SHA-256 / 1ffbbff2a847e670cac30583c62d83a70d99e051662f0af140d402f0ee39ee37

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):
    L=x;out=[]
    for m in range(2,math.isqrt(L)+2):
     for n in range(1,m):
      if math.gcd(m,n)!=1:continue
      if (m-n)%2==0:continue
      a,b,c=m*m-n*n,2*m*n,m*m-n*n
      a,b=sorted((a,b))
      if c<=L:out.append([a,b,c])
    return sorted(out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[(5, [[3, 4, 5]]), (3, []), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (2, []), (4, []), (6, [[3, 4, 5]]), (7, [[3, 4, 5]])], [(6, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (18, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (19, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (20, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (21, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (22, [[3, 4, 5], [5, 12, 13], [8, 15, 17]])], [(7, [[3, 4, 5]]), (9, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (35, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [20, 21, 29]]), (36, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [20, 21, 29]]), (37, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [12, 35, 37], [20, 21, 29]]), (38, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [12, 35, 37], [20, 21, 29]])], [(8, [[3, 4, 5]]), (12, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (52, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29]]), (53, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]]), (54, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]]), (55, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]])], [(9, [[3, 4, 5]]), (15, [[3, 4, 5], [5, 12, 13]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (69, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (70, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (71, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (72, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]])]]
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, 4, 3], [5, 12, 5]][[3, 4, 5]]Failed
explicit oracle 1[[3, 4, 3]][]Failed
explicit oracle 2[][]Passed
explicit oracle 3[[3, 4, 3], [5, 12, 5], [7, 24, 7], [8, 15, 15], [9, 40, 9], [11, 60, 11], [12, 35, 35], [13, 84, 13], [15, 112, 15], [16, 63, 63], [17, 144, 17], [19, 180, 19], [20, 21, 21], [20, 99, 99], [21, 220, 21], [23, 264, 23], [24, 143, 143], [25, 312, 25], [27, 364, 27], [28, 45, 45], [33, 56, 33], [36, 77, 77], [39, 80, 39], [44, 117, 117], [48, 55, 55], [51, 140, 51], [52, 165, 165], [57, 176, 57], [60, 91, 91], [65, 72, 65], [69, 260, 69], [75, 308, 75], [85, 132, 85], [88, 105, 105], [95, 168, 95], [104, 153, 153], [105, 208, 105], [115, 252, 115], [119, 120, 119], [133, 156, 133], [140, 171, 171]][[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]Failed
explicit oracle 4[][]Passed
explicit oracle 5[[3, 4, 3]][]Failed
explicit oracle 6[[3, 4, 3], [5, 12, 5]][[3, 4, 5]]Failed
explicit oracle 7[[3, 4, 3], [5, 12, 5]][[3, 4, 5]]Failed

SHA-256 / 7a04db94149650c4c694018ac45e5a95af679745bd5a6814b3d312888447e05f

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):
    L=x;out=[]
    for m in range(2,math.isqrt(L)+2):
     for n in range(1,m):
      if math.gcd(m,n)!=1:continue
      if (m-n)%2==0:continue
      a,b,c=m*m-n*n,2*m*n,m*m+n*n
      a,b=sorted((a,b))
      if c<=L:out.append([a,b,c])
    return sorted(out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[(5, [[3, 4, 5]]), (3, []), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (2, []), (4, []), (6, [[3, 4, 5]]), (7, [[3, 4, 5]])], [(6, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (18, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (19, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (20, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (21, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (22, [[3, 4, 5], [5, 12, 13], [8, 15, 17]])], [(7, [[3, 4, 5]]), (9, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (35, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [20, 21, 29]]), (36, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [20, 21, 29]]), (37, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [12, 35, 37], [20, 21, 29]]), (38, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [12, 35, 37], [20, 21, 29]])], [(8, [[3, 4, 5]]), (12, [[3, 4, 5]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (52, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29]]), (53, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]]), (54, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]]), (55, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [12, 35, 37], [20, 21, 29], [28, 45, 53]])], [(9, [[3, 4, 5]]), (15, [[3, 4, 5], [5, 12, 13]]), (1, []), (180, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]), (69, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (70, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (71, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]]), (72, [[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65]])]]
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, 4, 5]][[3, 4, 5]]Passed
explicit oracle 1[][]Passed
explicit oracle 2[][]Passed
explicit oracle 3[[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]][[3, 4, 5], [5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [11, 60, 61], [12, 35, 37], [13, 84, 85], [15, 112, 113], [16, 63, 65], [17, 144, 145], [20, 21, 29], [20, 99, 101], [24, 143, 145], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [48, 55, 73], [51, 140, 149], [52, 165, 173], [60, 91, 109], [65, 72, 97], [85, 132, 157], [88, 105, 137], [119, 120, 169]]Passed
explicit oracle 4[][]Passed
explicit oracle 5[][]Passed
explicit oracle 6[[3, 4, 5]][[3, 4, 5]]Passed
explicit oracle 7[[3, 4, 5]][[3, 4, 5]]Passed

SHA-256 / 45bfb977c177f98ee52da8cd60c483fadb2137b069ce57896c0725a412062d1a

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:21.937385+00:00.

Case digest / da0730a6cf90684f027ba83b2249231ca79f4c47977d088377e4509b1c6204fe