coloring_nested_tire_graphs: worst-case proof sketch via König 3-edge-coloring; chunked enumeration + threshold search infrastructure

Proves the clean piece: when both T1 and T2 give direct all-3 γ-face
partitions of E(γ), the worst-case overlap is ≥ 6, witnessed by
König's edge-coloring theorem on the 3-regular bipartite "face-
incidence graph" G. A proper 3-edge-coloring of G lifts to a Latin
σ on γ satisfying both face partitions, and S_3 symmetry gives 6
distinct such σ.

Identifies the gap: T2's chord is on B_in_2, not on γ, so T2 doesn't
directly give a γ-partition. The proof closes if we exhibit an
"induced γ-partition" determined by T2's annular triangulation —
conjectured but not constructed here.

Also commits chunked enumeration code and threshold-search script
launched separately.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 11:12:15 -04:00
parent d893860166
commit 659068fca7
6 changed files with 884 additions and 0 deletions
@@ -0,0 +1,153 @@
"""Streaming/chunked variant of tire_fiber_chords_fast.py for n > 27.
The in-memory version materializes an (N, n) int8 array with N = 3·2^(n-1),
which at n = 30 is ~30 GB. This chunked version processes paths in
chunks of ~2^20 rows, never holding the full array in memory.
For projection support: we only need the set of σ-projected rows,
which is typically much smaller than 3^k. We accumulate into a Python
set.
For γ up to ~18 with m ≥ γ this brings n up to ~36, with one tire
taking minutes (versus impossible).
"""
from __future__ import annotations
import numpy as np
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
def proper_cycle_colorings_chunked(n: int, chunk_size: int = 1 << 20):
"""Yield (rows, n) int8 chunks of proper edge 3-colorings of C_n.
Each chunk is a numpy array; chunks together cover every proper
edge 3-coloring exactly once. After filtering for the cycle closure
constraint, a chunk may be smaller than chunk_size."""
if n < 2:
return
block_size = 1 << (n - 1)
eff_chunk = min(chunk_size, block_size)
for c0 in (1, 2, 3):
for start in range(0, block_size, eff_chunk):
end = min(start + eff_chunk, block_size)
n_rows = end - start
arr = np.empty((n_rows, n), dtype=np.int8)
arr[:, 0] = c0
row_idx = np.arange(start, end, dtype=np.int64)
for i in range(1, n):
bits = ((row_idx >> (i - 1)) & 1).astype(np.int8)
prev = arr[:, i - 1]
arr[:, i] = OTHER_NP[prev, bits]
mask = arr[:, -1] != arr[:, 0]
if mask.any():
yield arr[mask]
def projection_support_streaming(
m: int,
k: int,
chords,
positions: list[int],
chunk_size: int = 1 << 20,
) -> set:
"""Compute the projected support {σ[positions] : σ realisable}
without materializing the full σ array.
Returns: set of tuples in {1,2,3}^len(positions).
"""
n = m + k
d_positions = d_positions_for(m, k)
o_faces = compute_faces_from_chords(k, chords)
d_positions_by_face = [
[d_positions[a] for a in face_edges]
for face_edges in o_faces
]
support: set[tuple[int, ...]] = set()
for c_chunk in proper_cycle_colorings_chunked(n, chunk_size):
sigma = induced_sigma_vec(c_chunk)
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]])
if not mask.any():
continue
sigma_ok = sigma[mask]
projected = sigma_ok[:, positions]
support.update(map(tuple, projected.tolist()))
return support
def spoke_only_projection_support_streaming(
n: int, positions: list[int], chunk_size: int = 1 << 20
) -> set:
"""Steiner-rich baseline (no chord constraints)."""
support: set[tuple[int, ...]] = set()
for c_chunk in proper_cycle_colorings_chunked(n, chunk_size):
sigma = induced_sigma_vec(c_chunk)
projected = sigma[:, positions]
support.update(map(tuple, projected.tolist()))
return support
if __name__ == '__main__':
import time
from tire_fiber_chords_fast import fiber_distribution_fast, projection_support_fast
print("Validation: chunked vs in-memory")
print("-" * 60)
cases = [
(4, 4, [(0, 2)]),
(6, 6, [(0, 3)]),
(6, 9, [(0, 2), (3, 5), (6, 8)]),
(9, 9, [(0, 3), (4, 7)]),
(12, 12, [(0, 3), (4, 7), (8, 11)]),
]
for m, k, ch in cases:
n = m + k
d_pos = d_positions_for(m, k)
t0 = time.time()
fibers_mem, _, _ = fiber_distribution_fast(m, k, ch)
S_mem = projection_support_fast(fibers_mem, d_pos)
dt_mem = time.time() - t0
t0 = time.time()
S_chunked = projection_support_streaming(m, k, ch, d_pos)
dt_chunked = time.time() - t0
ok = S_mem == S_chunked
status = "OK" if ok else "MISMATCH"
print(f"(m={m}, k={k}, n={n}): mem {dt_mem:.2f}s, chunked {dt_chunked:.2f}s, "
f"|S|={len(S_chunked)}, {status}")
print()
print("Stress test (n > 24):")
print("-" * 60)
cases_big = [
(12, 13, [(0, 3), (4, 7), (8, 11), (12, 1)]), # n=25
(15, 15, [(0, 3), (4, 7), (8, 11), (12, 14), (12, 0)]), # n=30
]
for m, k, ch in cases_big:
n = m + k
d_pos = d_positions_for(m, k)
t0 = time.time()
S = projection_support_streaming(m, k, ch, d_pos)
dt = time.time() - t0
print(f"(m={m}, k={k}, n={n}): {dt:.1f}s, |S|={len(S)}")
@@ -0,0 +1,236 @@
"""Counterexample search at γ{13, 14, 15}, threshold m ≥ γ.
The earlier search (tire_fiber_counterexample_search.py) capped n ≤ 27
to fit fiber arrays in memory, which forced m_1 < γ at γ ≥ 13 — so it
never tested the threshold-satisfying regime above γ = 12. This
script uses tire_fiber_chunked.projection_support_streaming to push
n up to 30+ (at γ = 15, m = 15, the bottleneck is ~7 min per tire).
Configs include all-3-faces chord matchings (where they exist —
γ{15} via the multi-chord 'ring' (0,3),(3,6),...,(γ-3,γ),(0,γ-3))
plus mixed-face chord matchings (γ{13, 14}).
Shares the same counterexample_search.log with the earlier sweep;
deduplication via pair-keys lets this be resumed mid-flight.
"""
from __future__ import annotations
import json
import time
from pathlib import Path
from tire_fiber_chords import (
compute_faces_from_chords,
d_positions_for,
u_positions_for,
)
from tire_fiber_chunked import projection_support_streaming
HERE = Path(__file__).resolve().parent
LOG_PATH = HERE / "counterexample_search.log"
def log_event(event: dict) -> None:
event.setdefault('wall_time', time.time())
with open(LOG_PATH, 'a') as f:
f.write(json.dumps(event, default=str) + "\n")
f.flush()
def has_all_three_faces(k: int, chords) -> bool:
if not chords:
return k == 3
faces = compute_faces_from_chords(k, chords)
return all(len(f) == 3 for f in faces)
def make_key(gamma, m_1, ch1, model1, k_2, ch2, model2) -> str:
ch1_str = json.dumps(sorted([sorted(c) for c in ch1])) if ch1 else "[]"
ch2_str = json.dumps(sorted([sorted(c) for c in ch2])) if ch2 else "[]"
return f"gamma={gamma}|t1=({m_1},{ch1_str},{model1})|t2=({k_2},{ch2_str},{model2})"
def read_existing_keys() -> set[str]:
keys = set()
if not LOG_PATH.exists():
return keys
with open(LOG_PATH) as f:
for line in f:
try:
ev = json.loads(line)
except json.JSONDecodeError:
continue
if ev.get('type') == 'pair' and 'key' in ev:
keys.add(ev['key'])
return keys
# T1 chord configurations at the higher γ.
T1_CONFIGS = {
13: [
# Mixed-face (no all-3 possible at γ=13, since 13 not divisible by 3)
[(0, 3), (4, 7), (8, 11), (12, 1)],
[(0, 3), (3, 6), (6, 9), (9, 12), (12, 0)],
],
14: [
# Mixed-face
[(0, 3), (3, 6), (6, 9), (9, 12), (12, 0)],
[(0, 3), (4, 7), (8, 11), (12, 0)],
],
15: [
# all-3 "ring" config: 5 chords, all faces size 3
[(0, 3), (3, 6), (6, 9), (9, 12), (0, 12)],
# mixed-face alternative
[(0, 3), (4, 7), (8, 11), (12, 14), (12, 0)],
],
}
# T2 chord configurations (only k_2 ≥ γ to satisfy threshold).
T2_CONFIGS = {
13: [
[(0, 3), (4, 7), (8, 11), (12, 1)],
],
14: [
[(0, 3), (3, 6), (6, 9), (9, 12), (12, 0)],
],
15: [
[(0, 3), (3, 6), (6, 9), (9, 12), (0, 12)],
[(0, 3), (4, 7), (8, 11), (12, 14), (12, 0)],
],
}
# In-memory caches so that a fixed (m_1, gamma, ch1) doesn't get
# re-streamed across multiple T2 variants.
_pi_d_cache: dict = {}
_pi_u_cache: dict = {}
def _cache_key(args):
return tuple(args[:-1]) + (tuple(tuple(sorted(c)) for c in args[-1]),)
def pi_D_cached(m_1: int, gamma: int, ch1: list) -> set:
key = (m_1, gamma, tuple(tuple(sorted(c)) for c in ch1))
if key not in _pi_d_cache:
d_pos = d_positions_for(m_1, gamma)
_pi_d_cache[key] = projection_support_streaming(m_1, gamma, ch1, d_pos)
return _pi_d_cache[key]
def pi_U_cached(gamma: int, k_2: int, ch2: list) -> set:
key = (gamma, k_2, tuple(tuple(sorted(c)) for c in ch2))
if key not in _pi_u_cache:
u_pos = u_positions_for(gamma, k_2)
_pi_u_cache[key] = projection_support_streaming(gamma, k_2, ch2, u_pos)
return _pi_u_cache[key]
def test_pair(gamma: int, m_1: int, ch1, k_2: int, ch2) -> dict:
t0 = time.time()
S1 = pi_D_cached(m_1, gamma, ch1)
S2 = pi_U_cached(gamma, k_2, ch2)
fwd = S1 & S2
S2_rev = {s[::-1] for s in S2}
rev = S1 & S2_rev
dt = time.time() - t0
return {
'type': 'pair',
'key': make_key(gamma, m_1, ch1, 'SP', k_2, ch2, 'SP'),
'gamma': gamma,
't1': {'m_1': m_1, 'chords': ch1, 'model': 'SP'},
't2': {'k_2': k_2, 'chords': ch2, 'model': 'SP'},
's1_size': len(S1),
's2_size': len(S2),
'fwd_size': len(fwd),
'rev_size': len(rev),
'compatible': bool(fwd or rev),
'time_seconds': round(dt, 3),
't1_all_three': has_all_three_faces(gamma, ch1),
't2_all_three': has_all_three_faces(k_2, ch2),
}
def main():
already = read_existing_keys()
log_event({'type': 'session_start', 'session_kind': 'threshold-search-streaming'})
print(f"[start] {len(already)} pairs already tested", flush=True)
n_tested = 0
n_ce = 0
n_ce_all3 = 0
t_start = time.time()
for gamma in [13, 14, 15]:
cs1_list = T1_CONFIGS.get(gamma, [])
if not cs1_list:
continue
log_event({'type': 'k_start', 'gamma': gamma,
'session_kind': 'threshold-search-streaming',
'n_t1_configs': len(cs1_list)})
# We only test the threshold m_1 = γ here (n_1 = 2γ). Larger m_1
# would saturate even more easily.
m_1 = gamma
for ch1 in cs1_list:
for k_2 in sorted(T2_CONFIGS.keys()):
if k_2 < gamma:
continue # threshold: k_2 ≥ γ
for ch2 in T2_CONFIGS[k_2]:
key = make_key(gamma, m_1, ch1, 'SP', k_2, ch2, 'SP')
if key in already:
continue
t0 = time.time()
print(f"[{(time.time()-t_start)/60:.1f}m] testing γ={gamma} "
f"T1=(m={m_1}, ch={ch1}), T2=(k={k_2}, ch={ch2})",
flush=True)
try:
result = test_pair(gamma, m_1, ch1, k_2, ch2)
except Exception as e:
log_event({'type': 'exception', 'key': key,
'error': type(e).__name__ + ": " + str(e)})
print(f" exception: {e}", flush=True)
continue
log_event(result)
already.add(key)
n_tested += 1
if not result['compatible']:
n_ce += 1
if result.get('t1_all_three') and result.get('t2_all_three'):
n_ce_all3 += 1
log_event({'type': 'COUNTEREXAMPLE',
'strict_latin': True,
'threshold': True,
'pair': result})
print(f" *** THRESHOLD STRICT-LATIN COUNTEREXAMPLE ***",
flush=True)
else:
log_event({'type': 'COUNTEREXAMPLE',
'pair': result})
print(f" *** counterexample (not strict-Latin) ***",
flush=True)
print(f" -> |S1|={result['s1_size']}, |S2|={result['s2_size']}, "
f"fwd={result['fwd_size']}, rev={result['rev_size']}, "
f"compat={result['compatible']} ({result['time_seconds']:.1f}s)",
flush=True)
# Free the γ-specific caches before moving to the next γ
_pi_d_cache.clear()
_pi_u_cache.clear()
elapsed_h = (time.time() - t_start) / 3600
log_event({'type': 'session_end',
'session_kind': 'threshold-search-streaming',
'n_tested': n_tested,
'n_ce': n_ce,
'n_ce_strict_latin_threshold': n_ce_all3,
'elapsed_hours': elapsed_h})
print(f"\n[done] tested {n_tested}, CE {n_ce}, "
f"strict-Latin threshold CE {n_ce_all3}, "
f"elapsed {elapsed_h:.2f} hours", flush=True)
if __name__ == '__main__':
main()
@@ -0,0 +1,5 @@
\relax
\newlabel{prop:konig-overlap}{{}{1}}
\newlabel{prop:lower-bound-tight}{{}{1}}
\newlabel{conj:t2-induces-partition}{{}{2}}
\gdef \@abspage@last{3}
@@ -0,0 +1,280 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 11:12
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**worst_case_proof_sketch.tex
(./worst_case_proof_sketch.tex
LaTeX2e <2021-11-15> patch level 1
L3 programming layer <2022-02-24>
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/article.cls
Document Class: article 2021/10/04 v1.4n Standard LaTeX document class
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/size11.clo
File: size11.clo 2021/10/04 v1.4n Standard LaTeX file (size option)
)
\c@part=\count185
\c@section=\count186
\c@subsection=\count187
\c@subsubsection=\count188
\c@paragraph=\count189
\c@subparagraph=\count190
\c@figure=\count191
\c@table=\count192
\abovecaptionskip=\skip47
\belowcaptionskip=\skip48
\bibindent=\dimen138
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsmath.sty
Package: amsmath 2021/10/15 v2.17l AMS math features
\@mathmargin=\skip49
For additional information on amsmath, use the `?' option.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amstext.sty
Package: amstext 2021/08/26 v2.01 AMS text
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsgen.sty
File: amsgen.sty 1999/11/30 v2.0 generic functions
\@emptytoks=\toks16
\ex@=\dimen139
))
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsbsy.sty
Package: amsbsy 1999/11/29 v1.2d Bold Symbols
\pmbraise@=\dimen140
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsopn.sty
Package: amsopn 2021/08/26 v2.02 operator names
)
\inf@bad=\count193
LaTeX Info: Redefining \frac on input line 234.
\uproot@=\count194
\leftroot@=\count195
LaTeX Info: Redefining \overline on input line 399.
\classnum@=\count196
\DOTSCASE@=\count197
LaTeX Info: Redefining \ldots on input line 496.
LaTeX Info: Redefining \dots on input line 499.
LaTeX Info: Redefining \cdots on input line 620.
\Mathstrutbox@=\box50
\strutbox@=\box51
\big@size=\dimen141
LaTeX Font Info: Redeclaring font encoding OML on input line 743.
LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
\macc@depth=\count198
\c@MaxMatrixCols=\count199
\dotsspace@=\muskip16
\c@parentequation=\count266
\dspbrk@lvl=\count267
\tag@help=\toks17
\row@=\count268
\column@=\count269
\maxfields@=\count270
\andhelp@=\toks18
\eqnshift@=\dimen142
\alignsep@=\dimen143
\tagshift@=\dimen144
\tagwidth@=\dimen145
\totwidth@=\dimen146
\lineht@=\dimen147
\@envbody=\toks19
\multlinegap=\skip50
\multlinetaggap=\skip51
\mathdisplay@stack=\toks20
LaTeX Info: Redefining \[ on input line 2938.
LaTeX Info: Redefining \] on input line 2939.
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amssymb.sty
Package: amssymb 2013/01/14 v3.01 AMS font symbols
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amsfonts.sty
Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
\symAMSa=\mathgroup4
\symAMSb=\mathgroup5
LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
(Font) U/euf/m/n --> U/euf/b/n on input line 106.
))
(/usr/local/texlive/2022/texmf-dist/tex/latex/amscls/amsthm.sty
Package: amsthm 2020/05/29 v2.20.6
\thm@style=\toks21
\thm@bodyfont=\toks22
\thm@headfont=\toks23
\thm@notefont=\toks24
\thm@headpunct=\toks25
\thm@preskip=\skip52
\thm@postskip=\skip53
\thm@headsep=\skip54
\dth@everypar=\toks26
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphicx.sty
Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/keyval.sty
Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
\KV@toks@=\toks27
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphics.sty
Package: graphics 2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/trig.sty
Package: trig 2021/08/11 v1.11 sin cos tan (DPC)
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
)
Package graphics Info: Driver file: pdftex.def on input line 107.
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-def/pdftex.def
File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
))
\Gin@req@height=\dimen148
\Gin@req@width=\dimen149
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/geometry/geometry.sty
Package: geometry 2020/01/02 v5.9 Page Geometry
(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/ifvtex.sty
Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/iftex.sty
Package: iftex 2022/02/03 v1.0f TeX engine tests
))
\Gm@cnth=\count271
\Gm@cntv=\count272
\c@Gm@tempcnt=\count273
\Gm@bindingoffset=\dimen150
\Gm@wd@mp=\dimen151
\Gm@odd@mp=\dimen152
\Gm@even@mp=\dimen153
\Gm@layoutwidth=\dimen154
\Gm@layoutheight=\dimen155
\Gm@layouthoffset=\dimen156
\Gm@layoutvoffset=\dimen157
\Gm@dimlist=\toks28
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
File: l3backend-pdftex.def 2022-02-07 L3 backend support: PDF output (pdfTeX)
\l__color_backend_stack_int=\count274
\l__pdf_internal_box=\box52
)
(./worst_case_proof_sketch.aux)
\openout1 = `worst_case_proof_sketch.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count275
\scratchdimen=\dimen158
\scratchbox=\box53
\nofMPsegments=\count276
\nofMParguments=\count277
\everyMPshowfont=\toks29
\MPscratchCnt=\count278
\MPscratchDim=\dimen159
\MPnumerator=\count279
\makeMPintoPDFobject=\count280
\everyMPtoPDFconversion=\toks30
) (/usr/local/texlive/2022/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
85.
(/usr/local/texlive/2022/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
e
))
*geometry* driver: auto-detecting
*geometry* detected driver: pdftex
*geometry* verbose mode - [ preamble ] result:
* driver: pdftex
* paper: <default>
* layout: <same size as paper>
* layoutoffset:(h,v)=(0.0pt,0.0pt)
* modes:
* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
* \paperwidth=614.295pt
* \paperheight=794.96999pt
* \textwidth=469.75502pt
* \textheight=650.43001pt
* \oddsidemargin=0.0pt
* \evensidemargin=0.0pt
* \topmargin=-37.0pt
* \headheight=12.0pt
* \headsep=25.0pt
* \topskip=11.0pt
* \footskip=30.0pt
* \marginparwidth=59.0pt
* \marginparsep=10.0pt
* \columnsep=10.0pt
* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
* \hoffset=0.0pt
* \voffset=0.0pt
* \mag=1000
* \@twocolumnfalse
* \@twosidefalse
* \@mparswitchfalse
* \@reversemarginfalse
* (1in=72.27pt=25.4mm, 1cm=28.453pt)
LaTeX Font Info: Trying to load font information for U+msa on input line 17.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsa.fd
File: umsa.fd 2013/01/14 v3.01 AMS symbols A
)
LaTeX Font Info: Trying to load font information for U+msb on input line 17.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
) [1
{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2] [3]
(./worst_case_proof_sketch.aux) )
Here is how much of TeX's memory you used:
3188 strings out of 478268
47308 string characters out of 5846347
350893 words of memory out of 5000000
21380 multiletter control sequences out of 15000+600000
480772 words of font info for 73 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
55i,8n,62p,240b,218s stack positions out of 10000i,1000n,20000p,200000b,200000s
{/usr/local/texlive/2022/texmf-dist/fonts/enc/
dvips/cm-super/cm-super-ts1.enc}</usr/local/texlive/2022/texmf-dist/fonts/type1
/public/amsfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/
public/amsfonts/cm/cmbx12.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/p
ublic/amsfonts/cm/cmex10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/pu
blic/amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/pub
lic/amsfonts/cm/cmmi12.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publ
ic/amsfonts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public
/amsfonts/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/a
msfonts/cm/cmr12.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ams
fonts/cm/cmr17.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfo
nts/cm/cmr6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts
/cm/cmr8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm
/cmsy10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/
cmsy8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cm
ti10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmt
t10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols
/msam10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/cm-super/sfr
m1095.pfb>
Output written on worst_case_proof_sketch.pdf (3 pages, 202583 bytes).
PDF statistics:
100 PDF objects out of 1000 (max. 8388607)
60 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000)
1 words of extra memory for PDF output out of 10000 (max. 10000000)
@@ -0,0 +1,210 @@
\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsthm}
\usepackage{graphicx}
\usepackage{geometry}
\geometry{margin=1in}
\title{A proof attempt at the worst-case overlap}
\author{}
\date{}
\newtheorem*{thm}{Theorem}
\newtheorem*{prop}{Proposition}
\newtheorem*{lem}{Lemma}
\newtheorem*{conj}{Conjecture}
\begin{document}
\maketitle
\section*{Setup}
Let $\gamma$ be a cycle of length $k$ (divisible by $3$ for the
``all-3'' case), and let $T_1, T_2$ be two adjacent SP tires sharing
$\gamma$ with the threshold condition
$|B_{\mathrm{out}}^{(1)}| \geq k$ and $|B_{\mathrm{in}}^{(2)}| \geq k$.
Assume both tires' inner outerplanar graphs are configured so that
every $O$-face has exactly $3$ $B_{\mathrm{in}}$ edges (strict Latin
case).
The empirical worst-case overlap is exactly $|S_3| = 6$ elements,
forming a single $S_3$-orbit (see
\texttt{tire\_fiber\_step2\_large.tex}, Obs. on the $S_3$-orbit
structure). This note sketches a proof.
\section*{What I can prove cleanly: both sides give $\gamma$-face partitions}
\begin{prop}[König $\Rightarrow$ overlap $\geq 6$]
\label{prop:konig-overlap}
Suppose both $T_1$ and $T_2$ induce \emph{direct} all-$3$ face
partitions $\mathcal{F}_1, \mathcal{F}_2$ of $E(\gamma)$. Then
\[
|\mathcal{L}(\gamma, \mathcal{F}_1) \cap \mathcal{L}(\gamma,
\mathcal{F}_2)| \;\geq\; 6.
\]
\end{prop}
\begin{proof}[Proof sketch]
Define a bipartite graph $G$:
\begin{itemize}
\item Left vertices: $\mathcal{F}_1$-faces (there are $k/3$ of
them).
\item Right vertices: $\mathcal{F}_2$-faces (also $k/3$).
\item One edge from $F \in \mathcal{F}_1$ to $F' \in \mathcal{F}_2$
for each $\gamma$-edge $e \in F \cap F'$.
\end{itemize}
Since each $\gamma$-edge belongs to exactly one face of each
partition, $\gamma$-edges biject with edges of $G$, and $|E(G)| = k$.
Each face has $3$ $\gamma$-edges, so every vertex of $G$ has degree
exactly $3$. Thus $G$ is $3$-regular bipartite.
By König's edge-coloring theorem, every bipartite graph admits a
proper $\Delta$-edge-coloring; here $\Delta = 3$. So $G$ has a
proper $3$-edge-coloring $\chi : E(G) \to \{1,2,3\}$. Transport
$\chi$ back to $\gamma$-edges via the bijection: define
$\sigma(e) := \chi(e)$. Then for any face $F \in \mathcal{F}_1$,
the three $\gamma$-edges in $F$ are the three $G$-edges incident
to the $F$-vertex (degree $3$), and $\chi$ being proper forces these
to use all three colors --- so $\sigma|_F$ is a permutation of
$\{1,2,3\}$. Same for $\mathcal{F}_2$.
Hence $\sigma \in \mathcal{L}(\gamma, \mathcal{F}_1) \cap
\mathcal{L}(\gamma, \mathcal{F}_2)$. The $S_3$ action on colours
sends this $\sigma$ to $|S_3| = 6$ distinct elements of the
intersection (they're distinct because $\sigma$ uses all three
colours).
\end{proof}
\begin{prop}[Lower bound is achieved]
\label{prop:lower-bound-tight}
The lower bound $|{\cdots}| \geq 6$ in
Prop.~\ref{prop:konig-overlap} is achieved exactly when $G$ has a
\emph{unique} proper $3$-edge-coloring up to $S_3$-relabelling ---
equivalently, when $G$ is a single closed $C_{2k/3}$-cycle (with
two alternating perfect matchings, plus a third perfect matching
forced by the remaining edges). In particular, the worst case is
$G \cong K_{3,3}$ (when $k = 9$) or $G$ a single cycle, both of
which arise empirically.
\end{prop}
(Sketch: a $3$-regular bipartite graph has $\geq 6$ proper $3$-edge-
colourings, with equality iff the colouring is essentially unique.
The unique-up-to-$S_3$ case is exactly when $G$ is highly symmetric.
This matches the empirical observation that worst-case intersections
are single $S_3$-orbits.)
\section*{What remains: the gap in the actual setting}
In the real chain-pigeonhole setup, $T_1$'s chord is on $B_{\mathrm{in}}^{(1)}
= \gamma$ (so $T_1$ \emph{does} give a direct $\gamma$-face partition
$\mathcal{F}_1$), but $T_2$'s chord is on $B_{\mathrm{in}}^{(2)}$,
\emph{not} on $\gamma$. So $T_2$ does not directly give a
$\gamma$-face partition.
\subsection*{Conjectural extension to the real case}
\begin{conj}[Induced $\gamma$-partition from $T_2$]
\label{conj:t2-induces-partition}
For any SP tire $T_2$ with $B_{\mathrm{in}}^{(2)}$-side chord
structure $O^{(2)}$ such that every $O^{(2)}$-face has exactly $3$
$B_{\mathrm{in}}^{(2)}$-edges, the outer-spoke support
$\pi_U(\mathcal{C}(T_2)) \subseteq \{1,2,3\}^\gamma$ contains a
Latin subset $\mathcal{L}(\gamma, \widetilde{\mathcal{F}_2})$ for
some induced face partition $\widetilde{\mathcal{F}_2}$ of $\gamma$
into triples, where $\widetilde{\mathcal{F}_2}$ is determined by how
$T_2$'s annular triangulation distributes $B_{\mathrm{in}}^{(2)}$ faces
across $\gamma$-edges.
\end{conj}
If Conjecture~\ref{conj:t2-induces-partition} holds, then
Prop.~\ref{prop:konig-overlap} immediately gives the worst-case
overlap $\geq 6$ for general adjacent tire pairs.
\subsection*{Why this is plausible}
At $\gamma = 6$, $T_1 = (m_1, (0,3), \mathrm{SP})$ vs $T_2 = (m_2,
B_{\mathrm{in}}^{(2)} = C_3, \mathrm{SP})$, the empirical $6$-element
intersection consists of patterns $(a, b, c, b, c, a)$ which:
\begin{itemize}
\item $T_1$'s $\gamma$-face partition $\{0,1,2\} \mid \{3,4,5\}$:
$\sigma|_{0,1,2} = (a, b, c)$ is a permutation,
$\sigma|_{3,4,5} = (b, c, a)$ is a permutation. $\checkmark$
\item The pattern uses each colour exactly twice (positions $\{0,5\},
\{1,3\}, \{2,4\}$). These pair into $3$ groups of $2$ --- but
not in a way that's directly a Latin $\gamma$-partition of
size $3$.
\end{itemize}
The $T_2$-side constraint forces a structural pattern (equal pairs at
specific positions); the empirical fact is that $T_2$'s induced
constraint on $\gamma$ \emph{is} ``something like a Latin partition,''
but I haven't yet found the precise statement.
\subsection*{One concrete attempt at the induced partition}
For $T_2$ with $B_{\mathrm{in}}^{(2)} = C_{k_2}$ and balanced
annular triangulation, the dual cycle of $T_2$ alternates between
D-triangles (one $B_{\mathrm{in}}^{(2)}$-edge each) and U-triangles
(one $\gamma$-edge each). Each $B_{\mathrm{in}}^{(2)}$-edge has, in
some sense, two ``adjacent'' $\gamma$-edges via the two annular edges
of its D-triangle.
\emph{Candidate induced partition.} Group the $\gamma$-edges by
``which $B_{\mathrm{in}}^{(2)}$-face's pair of $\gamma$-neighbours
they share an annular edge with.'' When $k_2 = k/3$ (so there are
$k/3$ D-triangles, each accounting for $3$ $\gamma$-edges via its $2$
annular edges), this gives a partition of $E(\gamma)$ into $k/3$
triples --- the right shape.
Verifying that this candidate partition gives the correct Latin
subset of $\pi_U$ is an open computation.
\section*{Where the lower bound of $|S_3| = 6$ comes from independently}
Setting aside the construction, the lower bound of $6$ has a clean
abstract origin:
\begin{lem}[Lower bound from $S_3$-invariance]
Both $S_1$ and $S_2$ are $S_3$-invariant (the $S_3$ action on
colours acts on edge $3$-colourings of $G'$). Hence $S_1 \cap S_2$
is $S_3$-invariant, so it decomposes into $S_3$-orbits. Any
non-trivial $S_3$-orbit on $\{1,2,3\}^k$ where $\sigma$ uses all
three colours has size exactly $|S_3| = 6$. Constant $\sigma$
(single colour) orbits have size $3$, but constants are typically
not in the support under SP chord constraints with $\geq 2$ faces
of size $\geq 2$ (which forces $\sigma$ to use both ``other'' colours
on each face).
\end{lem}
So the absolute floor is $6$ once we rule out emptiness. The
$\gamma$-partition / König argument is the cleanest way I know to
rule out emptiness.
\section*{Summary of what's proven, conjectured, and open}
\begin{itemize}
\item \textbf{Proven (Prop.~\ref{prop:konig-overlap}):}
When both $T_1$ and $T_2$ give direct all-$3$ $\gamma$-face
partitions, $|S_1 \cap S_2| \geq 6$, witnessed by lifting
a König $3$-edge-colouring of the $3$-regular bipartite
``face-incidence'' graph.
\item \textbf{Lower-bound origin:}
Both $S_1$ and $S_2$ are $S_3$-invariant, so any non-empty
intersection has size at least $6$ (the size of a
non-constant $S_3$-orbit).
\item \textbf{Conjectured (Conj.~\ref{conj:t2-induces-partition}):}
The real chain-pigeonhole setup, where $T_2$'s chord is on
$B_{\mathrm{in}}^{(2)}$ rather than on $\gamma$, also reduces
to Prop.~\ref{prop:konig-overlap} via an induced
$\gamma$-partition $\widetilde{\mathcal{F}_2}$. Empirical
data is consistent with this conjecture but I haven't
constructed $\widetilde{\mathcal{F}_2}$ explicitly.
\item \textbf{Open:}
Find the explicit map $T_2 \mapsto \widetilde{\mathcal{F}_2}$,
prove the support inclusion, and combine with
Prop.~\ref{prop:konig-overlap} to close the worst-case
lower bound.
\end{itemize}
\end{document}