Refute the regular uniform seam family at n=15

Add kempe_regular_family_test.py (fixed family, per-tile early-exit, --branch-only).
Threads 614/614 at n=12 but FAILS at n=15 on two classes of no-separating-triangle
tiles: non-branching large-even-outer + odd inner (UUUUUUDUDUDUDUD, p=10, face 5) and
branching odd-outer + two even inner faces (UDUDUDDUDUDDDDD bite=(5,12), p=5, [4,4];
11/1022 branching fail). This is the R_T coupling (not a product) biting at scale: the
uniform family sets outer/inner states independently per size. The shortcut was
stronger than the chain-pigeonhole conjecture (which allows per-interface freedom), so
its failure costs a constructive route, not the conjecture; pairwise overlap still
holds. Next line: per-interface R_T composition respecting coupling.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 01:57:13 -04:00
parent 8b47af6036
commit 28d3d55b92
2 changed files with 141 additions and 7 deletions
@@ -192,12 +192,41 @@ first branching nodes) by one explicit regular seam family: paint every even lev
cycle one colour, and every odd level cycle as a single monochromatic block plus the
two parity-forced off-colour vertices.
## Finding 8 — the regular family is REFUTED at n=15
`kempe_regular_family_test.py` (tests the fixed regular family with per-tile
early-exit). At n=12 it threads 614/614 (matches the CSP). **At n=15 it FAILS**, on two
distinct classes of no-separating-triangle tiles:
- **non-branching, large even outer + odd inner:** e.g. `UUUUUUDUDUDUDUD` (no bite),
p=10, inner face size 5. Monochromatic `σ10 = 0^10` on the 10-up rim cannot coexist
with `σ5 = 00012` on the inner face.
- **branching, odd outer + two even inner faces:** e.g. `UDUDUDDUDUDDDDD` bite=(5,12),
p=5, faces `[4,4]`. `σ5` outer with monochromatic `σ4` on *both* inner faces is not
jointly realisable. Branching tiles: **1011/1022 threaded, 11 fail.**
So the clean regular conjecture is **false**. Crucially this refutation is exactly the
`R_T` **coupling** (Finding 1) asserting itself at scale: the regular family sets outer
and inner states *independently per size*, but `R_T` is not a product, so a large
monochromatic rim over-constrains the annular cycle and forbids the paired inner
necklace. The failure is not about branching per se — it hits large even rims (non-
branching) and small odd rims with two even children (branching) alike.
### What it means for strategy
The uniform "one state per size, everywhere" family was a **too-strong shortcut** —
much stronger than the chain-pigeonhole conjecture, which only needs *some* compatible
selection per chain with freedom to choose a *different* state at each interface. Its
failure costs a cheap constructive route, **not** the conjecture: pairwise overlap
still always holds. The load transfers to the genuine object — **per-interface
selection respecting `R_T` coupling**, i.e. composing `R_T` along chains/trees with
per-seam freedom rather than a global family.
## Open threads
- **Conjecture the regular family always works.** Does `σ_m = 0^m` (even) /
`0^{m-2}12` (odd) thread *every* no-separating-triangle tile for all `n`? Push to
n=15, 16 (branching grows: 1022 branching tiles at n=15) and look for any failure.
- **Why does the restriction make monochromatic-even universal?** Separating-triangle
tiles are exactly what blocked an all-one-colour rim; removing them frees it.
- **`R_T` composition along real trees** rather than per-size uniformity — the fully
general conjecture.
- **Per-interface `R_T` composition** along real chains/trees (per-seam freedom,
respecting coupling) — the paper's §6 conjecture proper, now the main line.
- **Structural lemma for the over-constraint.** Why does a monochromatic large rim
forbid the paired odd-inner necklace? A parity/structure argument on the annular
cycle for these specific failing tiles is small and concrete.
- (Set aside) whether *some* irregular uniform family still works at n=15 (full CSP)
— reframed away from; expensive (~hours) and not the conjecture.
@@ -0,0 +1,105 @@
"""Stress-test the regular uniform seam family on no-separating-triangle tiles.
Regular family (parity-admissible):
sigma_m = 0^m (monochromatic) if m even
sigma_m = 0^(m-2) 1 2 (one block + 1 + 2) if m odd
Conjecture: sigma threads every tile with no length-3 boundary -- i.e. some
Kempe-balanced colouring shows sigma on the outer rim AND sigma on every inner
face simultaneously. This tests it at a given n, streaming progress and printing
any failure immediately (a failure would be a counterexample).
Run: python3 kempe_regular_family_test.py --n 15
"""
from __future__ import annotations
import argparse
import sys
import time
from collections import defaultdict
from full_medial_tire_generator import generate, innermost_bite
from kempe_valid_colorings import classify_colorings
from kempe_transfer_relation_probe import necklace
from kempe_universal_trend_probe import has_length3_boundary
from kempe_up_tooth_sequences import seq_str
def sigma(m: int) -> tuple[int, ...]:
pat = tuple([0] * m) if m % 2 == 0 else tuple([0] * (m - 2) + [1, 2])
return necklace(pat)
def inner_faces(g):
faces = defaultdict(list)
for e in g.singleton_down_edges:
faces[innermost_bite(e, g.bites)].append(e)
return [sorted(es) for es in faces.values() if len(es) >= 3]
def threads(g, faces) -> bool:
want_o = sigma(len(g.up_edges))
want_i = [sigma(len(f)) for f in faces]
for c, v in classify_colorings(g, dedup_colors=True):
if not v.valid:
continue
if necklace(tuple(c[f"u{e}"] for e in g.up_edges)) != want_o:
continue
if all(necklace(tuple(c[f"d{e}"] for e in f)) == w
for f, w in zip(faces, want_i)):
return True
return False
def run(args):
n = args.n
print(f"n={n}: regular family sigma_m = 0^m (even) / 0^(m-2)12 (odd) "
f"vs no-separating-triangle tiles\n")
t0 = time.time()
tested = passed = branch_tested = branch_passed = 0
failures = []
for g in generate(n, min_up_teeth=3, dedup=True):
faces = inner_faces(g)
if not faces or has_length3_boundary(g):
continue
is_branch = len(faces) >= 2
if args.branch_only and not is_branch:
continue
ok = threads(g, faces)
tested += 1
passed += ok
if is_branch:
branch_tested += 1
branch_passed += ok
if not ok:
b = ",".join(f"({i},{j})" for i, j in sorted(g.bites)) or "-"
rec = (f"word={g.tooth_word} bites={b} p={len(g.up_edges)} "
f"faces={[len(f) for f in faces]}")
failures.append(rec)
print(f" !! FAILURE: {rec}")
sys.stdout.flush()
if tested % 1000 == 0:
print(f" ... {tested} tiles, {passed} ok, {len(failures)} fail "
f"[{time.time() - t0:.0f}s]")
sys.stdout.flush()
print(f"\nn={n}: {passed}/{tested} tiles threaded "
f"(branching {branch_passed}/{branch_tested}) [{time.time() - t0:.0f}s]")
if failures:
print(f"{len(failures)} FAILURE(S) -- regular family is NOT universal:")
for r in failures[:30]:
print(" ", r)
else:
print("=> regular family threads EVERY no-separating-triangle tile at this n.")
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--n", type=int, default=15)
parser.add_argument("--branch-only", action="store_true",
help="test only branching tiles (>=2 inner faces)")
run(parser.parse_args())
if __name__ == "__main__":
main()