coloring_nested_tire_graphs: A-irreducibility analysis of smallest strict-Latin SP failure

Joint-support analysis on (γ=6, T_1=(m_1=3, antipodal, SP), T_2=(k_2=3, no chord, SP)):

T_1's σ_D space = 18 elements (half of Latin set's 36; saturation-
threshold violated by m_1=3 < γ=6). T_2's σ_U space = 84 elements.
The two are intrinsically disjoint on γ, AND S_3-closure of T_1's
outer-ring colorings is already saturated (all 6 permutations
realised) — so abstract Kempe modification on the outside cannot
enlarge T_1's γ-support. The failure is A-IRREDUCIBLE in the
strict Birkhoff sense.

Significance: the SP failure cases aren't 4CT-relevant obstructions
but modeling artifacts. SP treats non-triangular O-faces as single
G-faces, which is incompatible with maximal-planar G. A faithful
maximal-planar G further triangulates these faces, changing the
face-connector and enlarging σ-supports.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 11:58:41 -04:00
parent 3c1a548a01
commit 570de6a171
@@ -0,0 +1,165 @@
"""For a tire T with boundaries (B_out, B_in), compute the two-sided
joint support Π_T ⊆ {1,2,3}^|B_out| × {1,2,3}^|B_in| — all (σ_out, σ_in)
pairs realised by some valid edge 3-coloring of T'_{f'}.
Use this to analyse the "smallest failure case" γ=6 with
T_1 = (m_1=3, antipodal-chord, SP), T_2 = (γ=6, k_2=3, no chord, SP).
If the failure is A-irreducible (no Kempe modification of σ_out can
rescue it), this means: no matter what the OUTSIDE of T_1 T_2
forces on its boundary, no joint coloring of T_1 T_2 exists.
"""
from __future__ import annotations
import numpy as np
from collections import defaultdict
from itertools import product
from tire_fiber_chords import (
d_positions_for, u_positions_for, compute_faces_from_chords,
)
from tire_fiber_chords_fast import (
OTHER_NP, induced_sigma_vec, proper_cycle_colorings,
)
COLORS = (1, 2, 3)
def joint_support(m: int, k: int, chords):
"""Returns Π_T ⊆ {1,2,3}^m × {1,2,3}^k: set of (σ_U, σ_D) pairs.
σ_U is σ projected to U-positions (B_out side);
σ_D is σ projected to D-positions (B_in side).
"""
n = m + k
d_pos = d_positions_for(m, k)
u_pos = u_positions_for(m, k)
o_faces = compute_faces_from_chords(k, chords)
d_positions_by_face = [
[d_pos[a] for a in face_edges] for face_edges in o_faces
]
c = proper_cycle_colorings(n)
if c.size == 0:
return set()
sigma = induced_sigma_vec(c)
mask = np.ones(sigma.shape[0], dtype=bool)
for face in d_positions_by_face:
if len(face) <= 1:
continue
for i in range(len(face)):
for j in range(i + 1, len(face)):
mask &= (sigma[:, face[i]] != sigma[:, face[j]])
sigma_ok = sigma[mask]
sigma_u = sigma_ok[:, u_pos]
sigma_d = sigma_ok[:, d_pos]
pairs = set(zip(map(tuple, sigma_u.tolist()),
map(tuple, sigma_d.tolist())))
return pairs
def report_2sided(label, m, k, chords):
pairs = joint_support(m, k, chords)
n = m + k
print(f"{label}: m={m}, k={k}, chord={chords}")
print(f" Π_T = {len(pairs)} pairs in {{1,2,3}}^{m} × {{1,2,3}}^{k}")
# Distinct σ_U and σ_D values
sus = {p[0] for p in pairs}
sds = {p[1] for p in pairs}
print(f" distinct σ_U (U-projection): {len(sus)} (universe 3^{m} = {3**m})")
print(f" distinct σ_D (D-projection): {len(sds)} (universe 3^{k} = {3**k})")
return pairs, sus, sds
def main():
print("=" * 70)
print("Joint-support analysis of γ=6 strict-Latin failure case")
print("=" * 70)
print()
# T_1: outer tire with B_out=C_3, B_in=γ=C_6, chord (0,3) (antipodal)
# In T_1's frame, "U-positions" = B_out spokes (length m_1=3)
# "D-positions" = γ-side spokes (length 6).
pi_T1, su_T1, sd_T1 = report_2sided(
"T_1 (outer tire, γ=6 strict-Latin)",
m=3, k=6, chords=[(0, 3)]
)
print()
# T_2: inner tire with B_out=γ=C_6, B_in=C_3, no chord
# In T_2's frame, "U-positions" = γ-side spokes (length 6)
# "D-positions" = B_in spokes (length 3).
pi_T2, su_T2, sd_T2 = report_2sided(
"T_2 (inner tire, k_2=3, no chord)",
m=6, k=3, chords=[]
)
print()
# Compatibility: ∃ σ_γ such that
# (σ_out_T1, σ_γ) ∈ Π_T1 (σ_γ is T_1's σ_D, length 6)
# (σ_γ, σ_in_T2) ∈ Π_T2 (σ_γ is T_2's σ_U, length 6)
print("Compatibility check:")
print(f" T_1's σ_D space (= γ from T_1's side): {len(sd_T1)} elements")
print(f" T_2's σ_U space (= γ from T_2's side): {len(su_T2)} elements")
# Forward and reverse intersection
fwd = sd_T1 & su_T2
su_T2_rev = {s[::-1] for s in su_T2}
rev = sd_T1 & su_T2_rev
print(f" Forward γ-overlap: {len(fwd)} elements")
print(f" Reverse γ-overlap: {len(rev)} elements")
if not fwd and not rev:
print()
print(" → NO σ_γ is shared. No (σ_out, σ_in) pair admits a joint coloring.")
print(" → A-IRREDUCIBLE: this holds for ANY outer/inner ring colouring.")
print()
# For Kempe analysis: list outer-ring colorings σ_out arising from T_1
print(" Distinct σ_out arising from T_1 (m_1-ring colorings):", len(su_T1))
print(" Distinct σ_in arising from T_2 (k_2-ring colorings):", len(sd_T2))
print()
print(f" {len(su_T1) * len(sd_T2)} possible (σ_out, σ_in) pairs from the outsides.")
print()
# Examine the Kempe orbits of σ_out's (on the m_1=3 ring) under abstract
# Kempe moves. For a length-3 cycle with 6 proper edge 3-colorings,
# Kempe orbits depend on the structure of the outside graph (unknown).
# But the ABSTRACT closure includes all colorings reachable by swapping
# any two colors on any subset that's "valid" in some outside graph.
# In the maximally permissive case, this is the full S_3-orbit.
print("Note on Kempe closure (abstract):")
print(f" σ_out values realised by T_1: {sorted(su_T1)}")
su_T1_relabel_closure = set()
from itertools import permutations
for s in su_T1:
for perm in permutations([1, 2, 3]):
mapping = {1: perm[0], 2: perm[1], 3: perm[2]}
su_T1_relabel_closure.add(tuple(mapping[x] for x in s))
print(f" S_3-closure of T_1's σ_out: {len(su_T1_relabel_closure)} elements "
f"({sorted(su_T1_relabel_closure)})")
# Even if we close under S_3 (color relabel), the image through T_1 is
# still the SAME γ-projection π_D(T_1) = sd_T1 (up to S_3 acting on
# colors). So Kempe-by-color-permutation cannot enlarge the γ-side
# support beyond sd_T1.
print()
print("CONCLUSION:")
print(" Since sd_T1 ∩ su_T2 = ∅ (in both forward and reverse), the failure")
print(" is A-irreducible: NO Kempe modification of the outer or inner ring")
print(" colouring can produce a compatible γ-pattern, because the supports")
print(" on γ from the two sides are intrinsically disjoint.")
print()
print(" Implication: any maximal planar G containing this exact SP-modeled")
print(" tire-pair (T_1, T_2) as described has no 4-colouring under SP.")
print()
print(" This is NOT a 4CT counterexample because:")
print(" - SP isn't a maximal-planar-G model when O has non-triangular faces.")
print(" - A real G triangulates O's quadrilateral face further, changing")
print(" the local face-connector structure and admitting more colourings.")
print(" - The right next question is whether the configuration even ARISES")
print(" in any maximal planar G with the SP-faithful triangulation.")
if __name__ == '__main__':
main()