From 570de6a17182b38845d0a94bc704cad828ea6e6e Mon Sep 17 00:00:00 2001 From: didericis Date: Tue, 26 May 2026 11:58:41 -0400 Subject: [PATCH] coloring_nested_tire_graphs: A-irreducibility analysis of smallest strict-Latin SP failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../experiments/joint_support.py | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 papers/coloring_nested_tire_graphs/experiments/joint_support.py diff --git a/papers/coloring_nested_tire_graphs/experiments/joint_support.py b/papers/coloring_nested_tire_graphs/experiments/joint_support.py new file mode 100644 index 0000000..57c6541 --- /dev/null +++ b/papers/coloring_nested_tire_graphs/experiments/joint_support.py @@ -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()