FAILURE MAP
← Case archive

FA-15796 / Numerics / Open access

Singular hensel root tree: root tree target modulus · case 01

The exact singular hensel root tree result violates the stated contract at root tree target modulus.

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

ROOT CAUSE

The root tree target modulus step uses mod+p instead of mod*p.

VERIFIED REPAIR

Use mod*p at the root tree target modulus step.

Unsuccessful approach: The partial repair mod*p*p still violates the root tree target modulus invariant.

Case contract

Input [polynomial coefficients,p,k], p prime and k>=1; enumerate all roots modulo p^k, including singular roots.

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):
    coeff,p,k=x
    roots=[r for r in range(p) if sum(c*r**i for i,c in enumerate(coeff))%p==0];mod=p
    for _ in range(1,k):
     nextmod=mod+p
     out=[]
     for r in roots:
      for digit in range(p):
       s=r+digit*mod
       if sum(c*s**i for i,c in enumerate(coeff))%nextmod==0:out.append(s)
     roots=sorted(set(out));mod=nextmod
    return [roots,mod]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[0, 0, 1], 2, 3], [[0, 4], 8]), ([[0, 0, 1], 2, 2], [[0, 2], 4]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 0, 1], 2, 4], [[0, 4, 8, 12], 16]), ([[0, 0, 1], 3, 1], [[0], 3]), ([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 3, 3], [[0, 9, 18], 27])], [([[0, 0, 1], 2, 4], [[0, 4, 8, 12], 16]), ([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[-1, 0, 1], 2, 2], [[1, 3], 4]), ([[-1, 0, 1], 2, 3], [[1, 3, 5, 7], 8]), ([[-1, 0, 1], 2, 4], [[1, 7, 9, 15], 16]), ([[-1, 0, 1], 3, 1], [[1, 2], 3])], [([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 5, 2], [[0, 5, 10, 15, 20], 25]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 2, 1], 2, 3], [[0, 2, 4, 6], 8]), ([[0, 2, 1], 2, 4], [[0, 6, 8, 14], 16]), ([[0, 2, 1], 3, 1], [[0, 1], 3]), ([[0, 2, 1], 3, 2], [[0, 7], 9])], [([[0, 0, 1], 3, 3], [[0, 9, 18], 27]), ([[0, 0, 1], 7, 2], [[0, 7, 14, 21, 28, 35, 42], 49]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[-4, 0, 1], 2, 4], [[2, 6, 10, 14], 16]), ([[-4, 0, 1], 3, 1], [[1, 2], 3]), ([[-4, 0, 1], 3, 2], [[2, 7], 9]), ([[-4, 0, 1], 3, 3], [[2, 25], 27])], [([[0, 0, 1], 3, 4], [[0, 9, 18, 27, 36, 45, 54, 63, 72], 81]), ([[-1, 0, 1], 2, 2], [[1, 3], 4]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 0, 0, 1], 3, 1], [[0], 3]), ([[0, 0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 0, 1], 3, 3], [[0, 3, 6, 9, 12, 15, 18, 21, 24], 27]), ([[0, 0, 0, 1], 3, 4], [[0, 9, 18, 27, 36, 45, 54, 63, 72], 81])]]
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[[0, 6], 6][[0, 4], 8]Failed
explicit oracle 1[[0, 2], 4][[0, 2], 4]Passed
explicit oracle 2[[0], 2][[0], 2]Passed
explicit oracle 3[[1, 22, 61, 82, 85, 106, 145, 166, 169, 190, 229, 250, 253], 28][[1, 2399], 2401]Failed
explicit oracle 4[[0, 12], 8][[0, 4, 8, 12], 16]Failed
explicit oracle 5[[0], 3][[0], 3]Passed
explicit oracle 6[[0, 6], 6][[0, 3, 6], 9]Failed
explicit oracle 7[[0, 6, 12, 18], 9][[0, 9, 18], 27]Failed

SHA-256 / 0ea2847ae0752d52c4f053ec041a85fceab0733c623ba71d748a451e0264c557

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):
    coeff,p,k=x
    roots=[r for r in range(p) if sum(c*r**i for i,c in enumerate(coeff))%p==0];mod=p
    for _ in range(1,k):
     nextmod=mod*p*p
     out=[]
     for r in roots:
      for digit in range(p):
       s=r+digit*mod
       if sum(c*s**i for i,c in enumerate(coeff))%nextmod==0:out.append(s)
     roots=sorted(set(out));mod=nextmod
    return [roots,mod]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[0, 0, 1], 2, 3], [[0, 4], 8]), ([[0, 0, 1], 2, 2], [[0, 2], 4]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 0, 1], 2, 4], [[0, 4, 8, 12], 16]), ([[0, 0, 1], 3, 1], [[0], 3]), ([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 3, 3], [[0, 9, 18], 27])], [([[0, 0, 1], 2, 4], [[0, 4, 8, 12], 16]), ([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[-1, 0, 1], 2, 2], [[1, 3], 4]), ([[-1, 0, 1], 2, 3], [[1, 3, 5, 7], 8]), ([[-1, 0, 1], 2, 4], [[1, 7, 9, 15], 16]), ([[-1, 0, 1], 3, 1], [[1, 2], 3])], [([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 5, 2], [[0, 5, 10, 15, 20], 25]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 2, 1], 2, 3], [[0, 2, 4, 6], 8]), ([[0, 2, 1], 2, 4], [[0, 6, 8, 14], 16]), ([[0, 2, 1], 3, 1], [[0, 1], 3]), ([[0, 2, 1], 3, 2], [[0, 7], 9])], [([[0, 0, 1], 3, 3], [[0, 9, 18], 27]), ([[0, 0, 1], 7, 2], [[0, 7, 14, 21, 28, 35, 42], 49]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[-4, 0, 1], 2, 4], [[2, 6, 10, 14], 16]), ([[-4, 0, 1], 3, 1], [[1, 2], 3]), ([[-4, 0, 1], 3, 2], [[2, 7], 9]), ([[-4, 0, 1], 3, 3], [[2, 25], 27])], [([[0, 0, 1], 3, 4], [[0, 9, 18, 27, 36, 45, 54, 63, 72], 81]), ([[-1, 0, 1], 2, 2], [[1, 3], 4]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 0, 0, 1], 3, 1], [[0], 3]), ([[0, 0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 0, 1], 3, 3], [[0, 3, 6, 9, 12, 15, 18, 21, 24], 27]), ([[0, 0, 0, 1], 3, 4], [[0, 9, 18, 27, 36, 45, 54, 63, 72], 81])]]
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[[0, 8], 32][[0, 4], 8]Failed
explicit oracle 1[[0], 8][[0, 2], 4]Failed
explicit oracle 2[[0], 2][[0], 2]Passed
explicit oracle 3[[1], 823543][[1, 2399], 2401]Failed
explicit oracle 4[[0, 32], 128][[0, 4, 8, 12], 16]Failed
explicit oracle 5[[0], 3][[0], 3]Passed
explicit oracle 6[[0], 27][[0, 3, 6], 9]Failed
explicit oracle 7[[0, 27, 54], 243][[0, 9, 18], 27]Failed

SHA-256 / 8ed8b2fceac62c3f743d07052d8a419d845e7b15e622478a5afa6e9af92b76c0

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):
    coeff,p,k=x
    roots=[r for r in range(p) if sum(c*r**i for i,c in enumerate(coeff))%p==0];mod=p
    for _ in range(1,k):
     nextmod=mod*p
     out=[]
     for r in roots:
      for digit in range(p):
       s=r+digit*mod
       if sum(c*s**i for i,c in enumerate(coeff))%nextmod==0:out.append(s)
     roots=sorted(set(out));mod=nextmod
    return [roots,mod]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[0, 0, 1], 2, 3], [[0, 4], 8]), ([[0, 0, 1], 2, 2], [[0, 2], 4]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 0, 1], 2, 4], [[0, 4, 8, 12], 16]), ([[0, 0, 1], 3, 1], [[0], 3]), ([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 3, 3], [[0, 9, 18], 27])], [([[0, 0, 1], 2, 4], [[0, 4, 8, 12], 16]), ([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[-1, 0, 1], 2, 2], [[1, 3], 4]), ([[-1, 0, 1], 2, 3], [[1, 3, 5, 7], 8]), ([[-1, 0, 1], 2, 4], [[1, 7, 9, 15], 16]), ([[-1, 0, 1], 3, 1], [[1, 2], 3])], [([[0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 1], 5, 2], [[0, 5, 10, 15, 20], 25]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 2, 1], 2, 3], [[0, 2, 4, 6], 8]), ([[0, 2, 1], 2, 4], [[0, 6, 8, 14], 16]), ([[0, 2, 1], 3, 1], [[0, 1], 3]), ([[0, 2, 1], 3, 2], [[0, 7], 9])], [([[0, 0, 1], 3, 3], [[0, 9, 18], 27]), ([[0, 0, 1], 7, 2], [[0, 7, 14, 21, 28, 35, 42], 49]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[-4, 0, 1], 2, 4], [[2, 6, 10, 14], 16]), ([[-4, 0, 1], 3, 1], [[1, 2], 3]), ([[-4, 0, 1], 3, 2], [[2, 7], 9]), ([[-4, 0, 1], 3, 3], [[2, 25], 27])], [([[0, 0, 1], 3, 4], [[0, 9, 18, 27, 36, 45, 54, 63, 72], 81]), ([[-1, 0, 1], 2, 2], [[1, 3], 4]), ([[0, 0, 1], 2, 1], [[0], 2]), ([[-2, 1, 1], 7, 4], [[1, 2399], 2401]), ([[0, 0, 0, 1], 3, 1], [[0], 3]), ([[0, 0, 0, 1], 3, 2], [[0, 3, 6], 9]), ([[0, 0, 0, 1], 3, 3], [[0, 3, 6, 9, 12, 15, 18, 21, 24], 27]), ([[0, 0, 0, 1], 3, 4], [[0, 9, 18, 27, 36, 45, 54, 63, 72], 81])]]
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[[0, 4], 8][[0, 4], 8]Passed
explicit oracle 1[[0, 2], 4][[0, 2], 4]Passed
explicit oracle 2[[0], 2][[0], 2]Passed
explicit oracle 3[[1, 2399], 2401][[1, 2399], 2401]Passed
explicit oracle 4[[0, 4, 8, 12], 16][[0, 4, 8, 12], 16]Passed
explicit oracle 5[[0], 3][[0], 3]Passed
explicit oracle 6[[0, 3, 6], 9][[0, 3, 6], 9]Passed
explicit oracle 7[[0, 9, 18], 27][[0, 9, 18], 27]Passed

SHA-256 / 5424249fe7f19db7bf52588142876de306a071ac7202481e2748c948b105ae3b

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

Case digest / cb04957d5205aea65c5e1b8c9d1e369f86459c6bf54bfd9b1ded60082421769d