FAILURE MAP
← Case archive

FA-14941 / Numerics / Open access

Primitive pythagorean triples: coprimality of parameters · case 01

The exact primitive pythagorean triples result violates the stated contract at coprimality of parameters.

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

ROOT CAUSE

The coprimality of parameters step uses math.gcd(m,n)==1 instead of math.gcd(m,n)!=1.

VERIFIED REPAIR

Use math.gcd(m,n)!=1 at the coprimality of parameters step.

Unsuccessful approach: The partial repair m%n==0 still violates the coprimality of parameters 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,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]]), (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, []), (3, []), (4, []), (6, [[3, 4, 5]]), (7, [[3, 4, 5]])], [(6, [[3, 4, 5]]), (8, [[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]])], [(7, [[3, 4, 5]]), (11, [[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]]), (14, [[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]]), (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]]), (17, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (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]]Failed
explicit oracle 1[][]Passed
explicit oracle 2[[27, 36, 45], [45, 108, 117], [72, 135, 153], [75, 100, 125]][[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 3[][]Passed
explicit oracle 4[][]Passed
explicit oracle 5[][]Passed
explicit oracle 6[][[3, 4, 5]]Failed
explicit oracle 7[][[3, 4, 5]]Failed

SHA-256 / b8f30b282e3c9c7f548aaba80b5da6cb30e327586c7093e0f67d7f0c28c694b8

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 m%n==0: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]]), (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, []), (3, []), (4, []), (6, [[3, 4, 5]]), (7, [[3, 4, 5]])], [(6, [[3, 4, 5]]), (8, [[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]])], [(7, [[3, 4, 5]]), (11, [[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]]), (14, [[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]]), (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]]), (17, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (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]]Failed
explicit oracle 1[][]Passed
explicit oracle 2[[5, 12, 13], [7, 24, 25], [9, 40, 41], [11, 60, 61], [13, 84, 85], [15, 112, 113], [17, 144, 145], [20, 21, 29], [28, 45, 53], [33, 56, 65], [36, 77, 85], [39, 80, 89], [44, 117, 125], [45, 108, 117], [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]]Failed
explicit oracle 3[][]Passed
explicit oracle 4[][]Passed
explicit oracle 5[][]Passed
explicit oracle 6[][[3, 4, 5]]Failed
explicit oracle 7[][[3, 4, 5]]Failed

SHA-256 / 2b4999d93d512ee20feaa74ba8c32db6590492db15cae6bc977b9d098a4476a7

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]]), (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, []), (3, []), (4, []), (6, [[3, 4, 5]]), (7, [[3, 4, 5]])], [(6, [[3, 4, 5]]), (8, [[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]])], [(7, [[3, 4, 5]]), (11, [[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]]), (14, [[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]]), (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]]), (17, [[3, 4, 5], [5, 12, 13], [8, 15, 17]]), (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[[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 3[][]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 / c542251db9cdbbe033d2c6f1ca2642e1097013b59e80c00484517ba7aba565e5

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

Case digest / 10263cb8ef82a235b12056766dfdb23cc29c5846f6df207614d1527e9ff316e2