face_monochromatic_pairs: confirm C28 counterexample to 5.5 does not lift to 5.1

experiments/check_c28_no_chord_apex_kempe_constancy.py iterates all
3 triangulations on 16 vertices with min degree 5 (whose duals are
the 28-vertex cubic plane graphs with face length ≥ 5 -- including
the C28 fullerene that disproves Conjecture 5.5). For each:

  - applies every chord-apex reduction (every pentagonal face of the
    dual × every rotation index i ∈ {0,…,4}),
  - enumerates every proper 3-edge-colouring of each reduced dual,
  - filters to chord-apex+Kempe colourings (Lemmas 5.X chord-apex +
    Kempe-spike),
  - traces K_b, K_c through the merged edge,
  - computes h_φ via the CW rotation at each vertex,
  - reports any colouring where h_φ is constant on V(K_b), V(K_c), or
    both.

Result:
  reductions tried        : 60 + 60 + 70 = 190
  chord-apex+Kempe colourings: 432 + 432 +   0 = 864
  constant on V(K_b)      :   0 +   0 +   0 =   0
  constant on V(K_c)      :   0 +   0 +   0 =   0
  constant on both        :   0 +   0 +   0 =   0

So even though the C28 fullerene admits a proper 3-edge-colouring on
which two intersecting Kempe cycles are both constant h_φ (the
Conjecture 5.5 counterexample), none of its chord-apex reductions
admits a chord-apex+Kempe colouring with the same property -- the
extra constraints (merged + spike same colour; K_b ⊇ {spike, side_0,
merged}; K_c ⊇ {spike, side_1, merged}) genuinely rule it out.

This is consistent with the broader empirical near-proof
(check_constancy_obstruction.py: 0/142,812 colourings constant) and
shows that the C28 obstruction-killing is not a fluke specific to
some smaller class; it works for the full chord-apex+Kempe layer.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 03:53:13 -04:00
parent 1305006b50
commit 9103fa7068
@@ -0,0 +1,180 @@
"""Confirm that the C_{28} counterexample to Conjecture 5.5 (face-length-≥-5
form) does NOT yield a counterexample to Conjecture 5.1.
Concretely:
- The C_{28} fullerene is the dual of the 3rd 16-vertex triangulation
with minimum degree 5 (in Sage's enumeration order).
- Conjecture 5.1's hypothesis space is *reduced* duals of such
triangulations: each reduced dual is obtained from the dual G' by
deleting one pentagonal face's 5 boundary vertices and stitching in
a spike vertex v_n + a merged edge (see Definition~\\ref{def:reduced-dual}).
- For the conjecture-5.5 phenomenon to lift to a conjecture-5.1
counterexample, we'd need: a reduction of C_{28} (= some choice of
pentagonal face F_v and rotation index i ∈ {0,…,4}) such that the
resulting reduced dual admits a chord-apex+Kempe colouring whose
two distinguished Kempe cycles K_b, K_c both have constant h_φ.
This script enumerates every (F_v, i) reduction of C_{28} (and, for
completeness, every reduction of every other 16-vertex min-deg-5
triangulation's dual), enumerates every chord-apex+Kempe colouring of
each reduced dual, and reports any case where h_φ is constant on
either V(K_b) or V(K_c). The expected result (consistent with the
empirical near-proof in Remark~\\ref{rem:heawood-empirical}) is zero
such cases.
Run with: sage experiments/check_c28_no_chord_apex_kempe_constancy.py
"""
import os
import sys
import time
from sage.all import Graph
from sage.graphs.graph_generators import graphs
HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)
from check_conj_3_8_scaled import (
apply_reduction,
proper_3_edge_colorings,
matches_chord_apex_kempe,
kempe_cycle_set,
edge_idx,
)
from check_heawood_on_kempe import (
dual_of, heawood_numbers, vertices_of_kempe,
)
# Canonical graph6 of the C_{28} fullerene counterexample (from
# experiments/verify_28_vertex_counterexample.py).
C28_GRAPH6 = ('[kG[A?_A?_?_?K?D?@_CO?o?@_??A??@C??O??AG?C????`???a'
'???W???A_???F')
def is_c28(H):
return H.canonical_label().graph6_string() == C28_GRAPH6
def check_reduction(H, named, label_for_print):
"""For one reduced dual H + named edges, enumerate every proper
3-edge-colouring, filter to chord-apex+Kempe colourings, and check
Heawood constancy on V(K_b), V(K_c), and V(K_b) V(K_c)."""
H.is_planar(set_embedding=True)
edges, colourings = proper_3_edge_colorings(H)
cak = [c for c in colourings if matches_chord_apex_kempe(edges, c, named)]
n_total = 0
n_const_kb = 0
n_const_kc = 0
n_const_both = 0
first_const = None
merged_idx = edge_idx(edges, named['merged'])
for col in cak:
n_total += 1
try:
h = heawood_numbers(H, edges, col)
except RuntimeError:
continue
a = col[merged_idx]
bs = [c for c in range(3) if c != a]
kc_b = kempe_cycle_set(edges, col, merged_idx, (a, bs[0]))
kc_c = kempe_cycle_set(edges, col, merged_idx, (a, bs[1]))
V_b = vertices_of_kempe(edges, kc_b)
V_c = vertices_of_kempe(edges, kc_c)
h_b = {h[v] for v in V_b}
h_c = {h[v] for v in V_c}
if len(h_b) == 1:
n_const_kb += 1
if len(h_c) == 1:
n_const_kc += 1
if len(h_b) == 1 and len(h_c) == 1:
n_const_both += 1
if first_const is None:
first_const = (col, V_b, V_c, h)
return n_total, n_const_kb, n_const_kc, n_const_both, first_const
def iterate_reductions(G, label):
G.is_planar(set_embedding=True)
D = dual_of(G)
is_c = is_c28(D)
D.is_planar(set_embedding=True)
pent_faces = [f for f in D.faces() if len(f) == 5]
print(f"\n[{label}] triangulation order = {G.order()}, "
f"|V(D)|={D.order()}, |pent faces of D|={len(pent_faces)}"
f"{' (= C_{28})' if is_c else ''}")
n_red = 0
n_total_cak = 0
n_const_kb = 0
n_const_kc = 0
n_const_both = 0
first = None
for fi, face in enumerate(pent_faces):
for i in range(5):
res = apply_reduction(D, face, i, 9999)
if res is None:
continue
n_red += 1
t, ckb, ckc, both, fconst = check_reduction(
res['H'], res['named'], f"{label}/F{fi}/i={i}")
n_total_cak += t
n_const_kb += ckb
n_const_kc += ckc
n_const_both += both
if first is None and fconst is not None:
first = (fi, i, fconst)
print(f" reductions tried : {n_red}")
print(f" chord-apex+Kempe colours: {n_total_cak}")
print(f" constant on V(K_b) : {n_const_kb}")
print(f" constant on V(K_c) : {n_const_kc}")
print(f" constant on both : {n_const_both}")
if first is not None:
fi, i, (col, V_b, V_c, h) = first
print(f" *** COUNTEREXAMPLE *** in pent-face #{fi}, i={i}")
print(f" colouring = {col}")
print(f" V(K_b) = {V_b}, h on V(K_b) = {{h[v] for v}} = "
f"{{{', '.join(f'{v}:{h[v]:+d}' for v in V_b)}}}")
print(f" V(K_c) = {V_c}")
return is_c, n_total_cak, n_const_both
def main():
print("Checking reductions of all 16-vertex min-deg-5 triangulations.\n"
"The triangulation whose dual is the C_{28} counterexample (to "
"Conjecture 5.5)\nis the 3rd in Sage's enumeration order.\n")
start = time.time()
n_T = 16
total_T = 0
total_cak = 0
total_const = 0
saw_c28 = False
try:
gen = graphs.triangulations(n_T, minimum_degree=5)
except Exception as ex:
print(f"cannot enumerate triangulations({n_T}): {ex}")
return
for idx, T in enumerate(gen, start=1):
is_c, t, both = iterate_reductions(T, f"T#{idx}")
total_T += 1
total_cak += t
total_const += both
if is_c:
saw_c28 = True
elapsed = time.time() - start
print("\n" + "=" * 70)
print(f"Across {total_T} triangulations on {n_T} vertices "
f"(C_{{28}} {'YES seen' if saw_c28 else 'NOT seen'}):")
print(f" total chord-apex+Kempe colourings tried : {total_cak}")
print(f" total with h_φ constant on V(K_b)∧V(K_c): {total_const}")
print(f"[{elapsed:.1f}s]")
if total_const == 0:
print("\n✓ No chord-apex+Kempe colouring of any reduction of any "
"n_T = 16 triangulation\n (including the one whose dual is "
"the C_{28} counterexample) has h_φ\n simultaneously "
"constant on V(K_b) and V(K_c).")
else:
print(f"\n{total_const} colouring(s) with full constancy found.")
if __name__ == '__main__':
main()