coloring_nested_tire_graphs: investigate chord case in O for tire face connectors

Companion to tire_fiber_data.tex. The chord case forces a modelling
choice for the surrounding G: Steiner-rich (each B_in edge gets its
own sub-triangle, chords are invisible to T'_{f'}) vs Steiner-poor
(each O-face is one G-face, chord set determines feasibility).

Under SP, a tire with k > 3 is infeasible unless O already contains
enough chords to keep every O-face at most 3 B_in edges. With chords:
support is positive but much smaller than SR — π_D never reaches 3^k,
and π_D's shrinkage is m-independent. More chords = smaller faces =
MORE support (each chord splits a hard constraint into easier ones).

Side-by-side data table for (m, k) ∈ {3,4,5,6,...}² with various
chord sets, plus 3-page note documenting the modelling choice and
implications for chain pigeonhole.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 02:11:33 -04:00
parent de0bbe4300
commit 5d81c1ed44
6 changed files with 770 additions and 0 deletions
@@ -0,0 +1,191 @@
"""Investigate fiber distributions when the inner outerplanar graph O
has non-trivial chords.
A chord in O does NOT change the dual annular cycle T'_ann (which is
still C_{m+k}). What it changes is the inside-O face structure: with
j non-crossing chords, O has j+1 inside-O faces. Each face f dualizes
to a single vertex u_f in G', whose degree in T'_{f'} equals the
number of B_in edges on the boundary of f.
Concretely: if a face f contains B_in edges e_{a_1}, ..., e_{a_d},
then u_f is incident in T'_{f'} to the d D-triangle positions
p_{a_1}, ..., p_{a_d} on the dual cycle (one per B_in edge). Proper
edge 3-coloring at u_f requires those d spoke colors to be pairwise
distinct.
Feasibility constraint: at k=3 colors, a face with d > 3 incident
B_in edges has no proper edge 3-coloring of u_f, so the tire admits
no global coloring. All examples below satisfy d <= 3 per face.
"""
from collections import Counter
from itertools import product
COLORS = (1, 2, 3)
def d_positions_for(m: int, k: int) -> list[int]:
"""Return cycle positions of D-triangles on the dual cycle C_{m+k}
for a balanced (Bresenham-style) alternating triangulation, in
the cyclic order matching B_in edges e_0, e_1, ..., e_{k-1}."""
n = m + k
return [round(i * n / k) % n for i in range(k)]
def compute_faces_from_chords(k: int, chords: list[tuple[int, int]]) -> list[list[int]]:
"""Compute face partition of B_in = C_k cut by non-crossing chords.
Each face is returned as a list of B_in edge indices belonging to
it. For non-crossing chords: edge e_a belongs to the smallest
enclosing chord-arc, where chord (i, j) with i < j encloses e_a
iff i <= a < j. Edges not enclosed by any chord belong to the
'outermost' face."""
chords_norm = [tuple(sorted([a, b])) for (a, b) in chords]
def enclosing_chord(edge: int):
candidates = [(j - i, i, j) for (i, j) in chords_norm if i <= edge < j]
if not candidates:
return None
candidates.sort()
_, i, j = candidates[0]
return (i, j)
chord_to_face = {}
next_face = 0
edge_to_face = {}
for a in range(k):
ch = enclosing_chord(a)
if ch not in chord_to_face:
chord_to_face[ch] = next_face
next_face += 1
edge_to_face[a] = chord_to_face[ch]
faces = [[] for _ in range(next_face)]
for a in range(k):
faces[edge_to_face[a]].append(a)
return faces
def fiber_distribution(m: int, k: int, chords: list[tuple[int, int]]):
"""Compute fiber distribution N(T'_{f'}; σ) over σ{1,2,3}^n for
the tire with given m, k, and chord set in O.
Returns (fibers, d_positions, faces_as_cycle_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
]
fibers: Counter[tuple[int, ...]] = Counter()
for ce in product(COLORS, repeat=n):
if not all(ce[i] != ce[(i + 1) % n] for i in range(n)):
continue
sigma = tuple(
({1, 2, 3} - {ce[(i - 1) % n], ce[i]}).pop()
for i in range(n)
)
ok = True
for positions in d_positions_by_face:
colors = [sigma[p] for p in positions]
if len(set(colors)) != len(colors):
ok = False
break
if ok:
fibers[sigma] += 1
return fibers, d_positions, d_positions_by_face
def projection_support(fibers, positions: list[int]) -> set[tuple[int, ...]]:
return {tuple(sigma[p] for p in positions) for sigma in fibers}
CASES = [
# (m, k, chords, label)
(4, 4, [], "(4,4) no chord [baseline]"),
(4, 4, [(0, 2)], "(4,4) chord (0,2) faces 2+2"),
(5, 5, [], "(5,5) no chord [baseline]"),
(5, 5, [(0, 2)], "(5,5) chord (0,2) faces 2+3"),
(5, 5, [(0, 3)], "(5,5) chord (0,3) faces 3+2"),
(6, 6, [], "(6,6) no chord [baseline]"),
(6, 6, [(0, 3)], "(6,6) chord (0,3) antipodal faces 3+3"),
(6, 6, [(0, 2), (3, 5)], "(6,6) chords (0,2)(3,5) faces 2+2+2"),
# k=4 with smaller outer cycle:
(3, 4, [], "(3,4) no chord"),
(3, 4, [(0, 2)], "(3,4) chord (0,2)"),
# larger n for k=4:
(6, 4, [], "(6,4) no chord"),
(6, 4, [(0, 2)], "(6,4) chord (0,2)"),
]
def u_positions_for(m: int, k: int) -> list[int]:
"""U-positions (outer-spoke cycle positions) = complement of D-positions."""
n = m + k
d = set(d_positions_for(m, k))
return [p for p in range(n) if p not in d]
def spoke_only_fiber_distribution(n: int):
"""Step-1 baseline: G_n = C_n + n independent pendants (Steiner-rich,
each B_in edge gets its own inside-O sub-triangle). No chord
constraints; every σ that comes from a proper cycle 3-coloring is
realisable."""
fibers: Counter[tuple[int, ...]] = Counter()
for ce in product(COLORS, repeat=n):
if not all(ce[i] != ce[(i + 1) % n] for i in range(n)):
continue
sigma = tuple(
({1, 2, 3} - {ce[(i - 1) % n], ce[i]}).pop()
for i in range(n)
)
fibers[sigma] += 1
return dict(fibers)
def main():
print("Two models compared per (m, k, chord-set):")
print(" STEINER-RICH: G triangulates each O-face using internal Steiner vertices,")
print(" so each B_in edge dualizes to its own (degree-1) inside-O triangle.")
print(" Chord set has NO effect on T'_{f'}; equivalent to step-1 baseline.")
print(" STEINER-POOR: G does NOT further sub-triangulate O-faces beyond O itself.")
print(" Each O-face becomes one G-face with degree = (B_in-edge count).")
print(" Edge-3-colorable only if every O-face has ≤ 3 B_in edges.")
print()
print(f"{'case':<42s} {'n':>3s} "
f"{'P_e SR':>7s} {'D SR':>7s} {'U SR':>7s} | "
f"{'P_e SP':>7s} {'D SP':>7s} {'U SP':>7s} | "
f"faces (cycle-position groups)")
print("-" * 145)
for m, k, chords, label in CASES:
n = m + k
# Steiner-poor (with chord-induced constraints):
fibers_sp, d_pos, faces_cp = fiber_distribution(m, k, chords)
u_pos = u_positions_for(m, k)
pe_sp = sum(fibers_sp.values())
d_proj_sp = projection_support(fibers_sp, d_pos)
u_proj_sp = projection_support(fibers_sp, u_pos)
# Steiner-rich baseline (chord-set ignored):
fibers_sr = spoke_only_fiber_distribution(n)
pe_sr = sum(fibers_sr.values())
d_proj_sr = projection_support(fibers_sr, d_pos)
u_proj_sr = projection_support(fibers_sr, u_pos)
d_uni = 3 ** k
u_uni = 3 ** m
faces_str = " | ".join(
"{" + ",".join(map(str, sorted(f))) + "}" for f in faces_cp
)
print(
f"{label:<42s} {n:>3d} "
f"{pe_sr:>7d} {len(d_proj_sr):>3d}/{d_uni:<3d} {len(u_proj_sr):>3d}/{u_uni:<3d} | "
f"{pe_sp:>7d} {len(d_proj_sp):>3d}/{d_uni:<3d} {len(u_proj_sp):>3d}/{u_uni:<3d} | "
f"{faces_str}"
)
if __name__ == '__main__':
main()
@@ -0,0 +1,22 @@
Two models compared per (m, k, chord-set):
STEINER-RICH: G triangulates each O-face using internal Steiner vertices,
so each B_in edge dualizes to its own (degree-1) inside-O triangle.
Chord set has NO effect on T'_{f'}; equivalent to step-1 baseline.
STEINER-POOR: G does NOT further sub-triangulate O-faces beyond O itself.
Each O-face becomes one G-face with degree = (B_in-edge count).
Edge-3-colorable only if every O-face has ≤ 3 B_in edges.
case n P_e SR D SR U SR | P_e SP D SP U SP | faces (cycle-position groups)
-------------------------------------------------------------------------------------------------------------------------------------------------
(4,4) no chord [baseline] 8 258 81/81 81/81 | 0 0/81 0/81 | {0,2,4,6}
(4,4) chord (0,2) faces 2+2 8 258 81/81 81/81 | 144 36/81 54/81 | {0,2} | {4,6}
(5,5) no chord [baseline] 10 1026 243/243 243/243 | 0 0/243 0/243 | {0,2,4,6,8}
(5,5) chord (0,2) faces 2+3 10 1026 243/243 243/243 | 240 36/243 90/243 | {0,2} | {4,6,8}
(5,5) chord (0,3) faces 3+2 10 1026 243/243 243/243 | 240 36/243 90/243 | {0,2,4} | {6,8}
(6,6) no chord [baseline] 12 4098 729/729 729/729 | 0 0/729 0/729 | {0,2,4,6,8,10}
(6,6) chord (0,3) antipodal faces 3+3 12 4098 729/729 729/729 | 408 36/729 90/729 | {0,2,4} | {6,8,10}
(6,6) chords (0,2)(3,5) faces 2+2+2 12 4098 729/729 729/729 | 1536 216/729 456/729 | {0,2} | {4,10} | {6,8}
(3,4) no chord 7 126 78/81 27/27 | 0 0/81 0/27 | {0,2,4,5}
(3,4) chord (0,2) 7 126 78/81 27/27 | 48 36/81 24/27 | {0,2} | {4,5}
(6,4) no chord 10 1026 81/81 549/729 | 0 0/81 0/729 | {0,2,5,8}
(6,4) chord (0,2) 10 1026 81/81 549/729 | 480 36/81 342/729 | {0,2} | {5,8}
@@ -0,0 +1,7 @@
\relax
\newlabel{obs:sp-empty}{{}{2}}
\newlabel{obs:more-chords-more-support}{{}{2}}
\newlabel{obs:pi-D-m-independent}{{}{2}}
\newlabel{obs:u-shrinks}{{}{2}}
\newlabel{obs:sp-chord-rule}{{}{3}}
\gdef \@abspage@last{3}
@@ -0,0 +1,320 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 02:09
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**tire_fiber_chords.tex
(./tire_fiber_chords.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/booktabs/booktabs.sty
Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
\heavyrulewidth=\dimen158
\lightrulewidth=\dimen159
\cmidrulewidth=\dimen160
\belowrulesep=\dimen161
\belowbottomsep=\dimen162
\aboverulesep=\dimen163
\abovetopsep=\dimen164
\cmidrulesep=\dimen165
\cmidrulekern=\dimen166
\defaultaddspace=\dimen167
\@cmidla=\count274
\@cmidlb=\count275
\@aboverulesep=\dimen168
\@belowrulesep=\dimen169
\@thisruleclass=\count276
\@lastruleclass=\count277
\@thisrulewidth=\dimen170
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/caption.sty
Package: caption 2022/03/01 v3.6b Customizing captions (AR)
(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/caption3.sty
Package: caption3 2022/03/17 v2.3b caption3 kernel (AR)
\caption@tempdima=\dimen171
\captionmargin=\dimen172
\caption@leftmargin=\dimen173
\caption@rightmargin=\dimen174
\caption@width=\dimen175
\caption@indent=\dimen176
\caption@parindent=\dimen177
\caption@hangindent=\dimen178
Package caption Info: Standard document class detected.
)
\c@caption@flags=\count278
\c@continuedfloat=\count279
)
(/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=\count280
\l__pdf_internal_box=\box52
)
(./tire_fiber_chords.aux)
\openout1 = `tire_fiber_chords.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 15.
LaTeX Font Info: ... okay on input line 15.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 15.
LaTeX Font Info: ... okay on input line 15.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 15.
LaTeX Font Info: ... okay on input line 15.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 15.
LaTeX Font Info: ... okay on input line 15.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 15.
LaTeX Font Info: ... okay on input line 15.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 15.
LaTeX Font Info: ... okay on input line 15.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 15.
LaTeX Font Info: ... okay on input line 15.
(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count281
\scratchdimen=\dimen179
\scratchbox=\box53
\nofMPsegments=\count282
\nofMParguments=\count283
\everyMPshowfont=\toks29
\MPscratchCnt=\count284
\MPscratchDim=\dimen180
\MPnumerator=\count285
\makeMPintoPDFobject=\count286
\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)
Package caption Info: Begin \AtBeginDocument code.
Package caption Info: End \AtBeginDocument code.
LaTeX Font Info: Trying to load font information for U+msa on input line 16.
(/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 16.
(/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]
(./tire_fiber_chords.aux) )
Here is how much of TeX's memory you used:
4578 strings out of 478268
74199 string characters out of 5846347
381378 words of memory out of 5000000
22757 multiletter control sequences out of 15000+600000
480794 words of font info for 72 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
55i,8n,63p,251b,262s 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/publi
c/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/public/
amsfonts/cm/cmbx8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
sfonts/cm/cmbxti10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/a
msfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
sfonts/cm/cmmi12.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ams
fonts/cm/cmmi6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfo
nts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfont
s/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/
cm/cmr17.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/cm
sy10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cms
y6.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/cmti10.
pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.p
fb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/cm-super/sfrm1095.pfb
>
Output written on tire_fiber_chords.pdf (3 pages, 212866 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,230 @@
\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsthm}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{booktabs}
\usepackage{caption}
\geometry{margin=1in}
\title{Fiber distributions for tire face connectors with chords in $O$}
\author{}
\date{}
\newtheorem*{obs}{Observation}
\begin{document}
\maketitle
\section*{What this is}
A companion to \texttt{tire\_fiber\_data.tex}: that note enumerated
fiber distributions in the spoke-only setting (no chords in the inner
outerplanar graph $O$). This note investigates what happens when $O$
has chords --- specifically when the surrounding $G$ does \emph{not}
introduce Steiner vertices inside $B_{\mathrm{in}}$, so that each face
of $O$ in the tire's embedding remains a single face of $G$.
Script: \texttt{experiments/tire\_fiber\_chords.py}. Output:
\texttt{experiments/tire\_fiber\_chords\_data.txt}.
\section*{The modelling choice that chords force on us}
In the spoke-only enumeration (\texttt{tire\_fiber\_data.tex}) the
inner-spoke part of $T'_{f'}$ was simply $k$ pendant edges, one per
$B_{\mathrm{in}}$ edge. That picture corresponds to a surrounding
maximal planar graph $G$ that \emph{aggressively triangulates} the
disk inside $B_{\mathrm{in}}$ using interior (Steiner) vertices not in
$V(T)$, so each $B_{\mathrm{in}}$ edge gets its own dedicated inside-$O$
sub-triangle.
When we add chords to $O$, there is a second axis of choice: does $G$
sub-triangulate the resulting $O$-faces, or not? Two extreme models:
\begin{itemize}
\item \textbf{Steiner-rich (SR).} $G$ adds whatever vertices and
edges it needs inside each $O$-face so that every
$B_{\mathrm{in}}$ edge has its own sub-triangle. The
inner-spoke graph is $k$ pendants \emph{regardless of the
chord set} --- chords are invisible to $T'_{f'}$. This is the
step-1 baseline.
\item \textbf{Steiner-poor (SP).} $G$ does not further
sub-triangulate $O$-faces beyond what $O$ itself provides.
Each face of $O$ becomes a single face of $G$, whose dual
vertex has degree (in $G'$, and hence in $T'_{f'}$) equal to
the number of $B_{\mathrm{in}}$ edges on the face boundary.
Edge $3$-colourable only if \emph{every $O$-face has at most
$3$ $B_{\mathrm{in}}$ edges}.
\end{itemize}
Real surrounding triangulations $G$ live somewhere between these two,
and the choice is not part of the tire structure itself --- it is a
property of how $G$ embeds the tire. But the two extremes already
say something useful about chord effects.
\section*{Side-by-side data}
\begin{center}
\scriptsize
\begin{tabular}{l r | r r r | r r r}
\toprule
& & \multicolumn{3}{c|}{\textbf{Steiner-rich}}
& \multicolumn{3}{c}{\textbf{Steiner-poor}}\\
case & $n$ & $P_e$ & $|\pi_D(\mathcal{C})|/3^k$ & $|\pi_U(\mathcal{C})|/3^m$
& $P_e$ & $|\pi_D(\mathcal{C})|/3^k$ & $|\pi_U(\mathcal{C})|/3^m$ \\
\midrule
(4,4) no chord & 8 & 258 & 81/81 & 81/81 & 0 & 0/81 & 0/81 \\
(4,4) chord (0,2), faces 2+2 & 8 & 258 & 81/81 & 81/81 & 144 & 36/81 & 54/81 \\
(5,5) no chord & 10 & 1026 & 243/243 & 243/243 & 0 & 0/243 & 0/243 \\
(5,5) chord (0,2), faces 2+3 & 10 & 1026 & 243/243 & 243/243 & 240 & 36/243 & 90/243 \\
(5,5) chord (0,3), faces 3+2 & 10 & 1026 & 243/243 & 243/243 & 240 & 36/243 & 90/243 \\
(6,6) no chord & 12 & 4098 & 729/729 & 729/729 & 0 & 0/729 & 0/729 \\
(6,6) chord (0,3) antipodal, 3+3 & 12 & 4098 & 729/729 & 729/729 & 408 & 36/729 & 90/729 \\
(6,6) chords (0,2)(3,5), 2+2+2 & 12 & 4098 & 729/729 & 729/729 & 1536 & 216/729 & 456/729 \\
(3,4) no chord & 7 & 126 & 78/81 & 27/27 & 0 & 0/81 & 0/27 \\
(3,4) chord (0,2) & 7 & 126 & 78/81 & 27/27 & 48 & 36/81 & 24/27 \\
(6,4) no chord & 10 & 1026 & 81/81 & 549/729 & 0 & 0/81 & 0/729 \\
(6,4) chord (0,2) & 10 & 1026 & 81/81 & 549/729 & 480 & 36/81 & 342/729 \\
\bottomrule
\end{tabular}
\end{center}
\noindent
($\pi_D$ projects $\sigma$ onto the $k$ inner-direction spoke positions
on the dual cycle; $\pi_U$ onto the $m$ outer-direction positions.
``Chord (a,b)'' means $O = B_{\mathrm{in}} \cup \{v_a v_b\}$.)
\section*{Observations}
\begin{obs}[SP is empty without chords for $k > 3$]
\label{obs:sp-empty}
If $O$ has no chord and $k \geq 4$, then $O$ has a single inner face
with $k$ incident $B_{\mathrm{in}}$ edges. Under SP this is a single
$G'$-vertex of degree $k$, and proper edge $3$-colouring needs $k$
distinct colours at that vertex, which is impossible for $k \geq 4$.
\textbf{So the SP model forces chords once $k \geq 4$}: tires whose
inner boundary is longer than $3$ are only feasible if $O$ already
contains enough chords to break every face down to $\leq 3$
$B_{\mathrm{in}}$ edges.
\end{obs}
\noindent
This is the structural reason chord-aware modelling matters. Under
SR, you can pretend chord sets do not exist; under SP, you cannot.
\begin{obs}[Adding chords \emph{enlarges} the SP support]
\label{obs:more-chords-more-support}
Comparing the two $(6,6)$ chord rows:
\begin{itemize}
\item Antipodal $(0,3)$ chord: face sizes $3{+}3$, gives
$P_e = 408$, $\pi_D$ support $36/729 \approx 4.9\%$.
\item Two chords $(0,2),(3,5)$: face sizes $2{+}2{+}2$, gives
$P_e = 1536$, $\pi_D$ support $216/729 \approx 29.6\%$.
\end{itemize}
Smaller faces $=$ weaker constraints $=$ more realisable
configurations. This is the opposite of what one might expect at
first glance (``more chords $=$ more edges $=$ more constraints'') ---
each chord splits a hard constraint into easier ones.
\end{obs}
\begin{obs}[$\pi_D$ support depends only on chord structure, not on $m$]
\label{obs:pi-D-m-independent}
For chord set $\{(0,2)\}$ in $k = 4$, the $\pi_D$ support is
$36/81 = 4/9$ for every tested $m \in \{3, 4, 6\}$. This is structural:
the chord constraint pins down which spoke-quadruples are realisable
without involving the outer cycle at all. The $\pi_U$ support, by
contrast, varies with $m$.
\end{obs}
\begin{obs}[SP support shrinks the $\pi_U$ support too]
\label{obs:u-shrinks}
Even though chord constraints live on the inner side, they propagate
to the outer side via the cycle. For $(m, k) = (4, 4)$:
\begin{itemize}
\item SR: $\pi_U$ saturates $3^4$.
\item SP with chord $(0,2)$: $\pi_U = 54/81 = 2/3$.
\end{itemize}
The chord-induced constraints on D-position spokes propagate around
the cycle through the proper-edge-colouring constraint, reducing the
set of cycle colourings, hence reducing $\pi_U$ as well.
\end{obs}
\section*{Implications for the chain-pigeonhole step}
In the spoke-only / SR step-1 analysis we observed that whenever
$|B_{\mathrm{out}}| \geq |B_{\mathrm{in}}|$ the inner-side projection
saturates the full ring-coloring universe $3^k$, so chain
compatibility on a shared cycle was trivially nonempty whenever at
least one of the two adjacent tires had the longer non-shared
boundary.
Under SP this clean saturation breaks down on the chord side:
\begin{itemize}
\item For a chorded tire, $\pi_D$ never reaches $3^k$ --- the
chord constraints permanently rule out some inner-spoke
configurations. The realisable set is small but non-empty
(e.g., $36/81$ at $k = 4$).
\item The shrinkage is the same regardless of $m$ on the inner
(D) side, so making the outer boundary very long does
\emph{not} help recover saturation on the chord side.
\item Two adjacent SP tires sharing a cycle $\gamma$ both have
shrunk projections; whether they intersect is now a real
question. E.g., projecting $\pi_D$ down to a $4/9$-fraction
of $\{1,2,3\}^k$ from each side: do the two $4/9$-sets always
meet?
\end{itemize}
\noindent
That last question is the natural follow-up experiment (and is
step~2 of the action items).
\subsection*{The structural fact worth stating}
\begin{obs}[Steiner-poor chord-rule]
\label{obs:sp-chord-rule}
Under the SP model, a tire $T$ is edge-$3$-colourable on its face
connector $T'_{f'}$ iff its inner outerplanar graph $O$ \emph{already
triangulates the inside of $B_{\mathrm{in}}$ up to faces of $B_{\mathrm{in}}$-
size $\leq 3$}. Equivalently: $O$ must contain enough chords that
every $O$-face has at most $3$ $B_{\mathrm{in}}$ edges on its boundary.
\end{obs}
\noindent
For a level-source BFS decomposition with $O$ chosen minimally (just
$B_{\mathrm{in}}$ itself, no chords), every tire with $k \geq 4$ fails
the SP edge-$3$-colouring test \emph{locally}. Globally this is no
contradiction --- the surrounding maximal planar $G$ does add Steiner
vertices and edges inside $B_{\mathrm{in}}$, making us closer to SR
than to SP. But the SP model is a worst-case envelope on what
purely local data implies, and shows that any structural argument that
ignores the inside-$B_{\mathrm{in}}$ triangulation is incomplete.
\section*{Caveats / what we did not compute}
\begin{enumerate}
\item \textbf{Only the two extremes.} Real $G$ triangulations lie
between SR (every $B_{\mathrm{in}}$ edge gets its own
Steiner-sub-triangle) and SP (no further sub-triangulation
at all). Intermediate cases (e.g., fan-triangulating one
$O$-face from a $V(B_{\mathrm{in}})$ vertex without adding
Steiner points) are not enumerated here, though the data
suggests they sit between.
\item \textbf{Outer side always SR.} We have always treated the
outer side ($B_{\mathrm{out}}$) as having no chord-induced
structure --- $B_{\mathrm{out}}$ is just a cycle in the tire
definition, so this is correct, but the analogous question
``what if the region outside $B_{\mathrm{out}}$ is poorly
triangulated'' is not addressed.
\item \textbf{$\Delta \leq 3$ on $O$ ignored.} The chord
configurations tested above include cases where chord
endpoints have higher degree in $T$; the menagerie's
$\Delta \leq 3$ constraint is not enforced. This is fine
for the SP model in isolation but matters when composing
with the menagerie counting formulas.
\item \textbf{Adjacency intersection (step 2).} We have only
computed single-tire fiber distributions. The chain-
pigeonhole step itself --- intersecting $\pi_D$ of one tire
with $\pi_U$ of the adjacent tire on a shared cycle --- is
deferred.
\end{enumerate}
\end{document}