coloring_nested_tire_graphs: step-2 adjacent-tire compatibility experiment

For pairs (T1, T2) sharing a cycle γ, intersect T1's D-projection
(inner-spoke pattern from outer tire) with T2's U-projection
(outer-spoke pattern from inner tire) on γ. Compatibility = nonempty
intersection.

Result: 23/23 tested pairs are compatible, spanning k ∈ {3,4,5,6},
both SR/SP models, and a range of chord configurations on each side.

Notable: small intersections have clean S_3-orbit structure. Worst
tested case (k=6, antipodal-chord T1 vs unchorded SR T2) has
intersection of size 6 — exactly the 3! rainbow patterns (a,b,c,b,c,a).
This suggests structural rather than accidental overlap, and points to
a theorem worth proving.

Caveats: 23 cases at k≤6 isn't a proof; longer chains (step 3) require
more than pairwise overlap.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 02:33:25 -04:00
parent 5d81c1ed44
commit 8f3a1325ee
6 changed files with 704 additions and 0 deletions
@@ -0,0 +1,130 @@
"""Step 2: For pairs of adjacent tires (T1, T2) sharing a cycle γ,
compute the intersection of T1's D-projection and T2's U-projection
on γ. Compatibility (chain-pigeonhole step) succeeds iff the
intersection is non-empty.
Conventions
-----------
* T1 is the OUTER tire: γ = B_in^(1). T1's inner-spoke pattern on γ
is its D-projection π_D^(1).
* T2 is the INNER tire: γ = B_out^(2). T2's outer-spoke pattern on γ
is its U-projection π_U^(2).
* Each tire's σ-support is closed under cyclic rotation of its dual
cycle, which induces cyclic rotation on the γ-projection.
* T1 and T2 may walk around γ in opposite orientations, so we check
intersection both forward and with one side reversed.
Two models per tire:
SR -- Steiner-rich (no chord effect; spoke-only baseline from step 1)
SP -- Steiner-poor (each O-face is one G-face; chord constraints active)
"""
from itertools import product
from tire_fiber_chords import (
COLORS,
fiber_distribution,
spoke_only_fiber_distribution,
d_positions_for,
u_positions_for,
projection_support,
)
def project_T1_D(gamma_len: int, m_1: int, chords_1, model: str) -> set:
"""T1's D-projection on γ. T1 has B_out of length m_1, B_in = γ
of length gamma_len."""
if model == 'SR':
n = m_1 + gamma_len
fibers = spoke_only_fiber_distribution(n)
else:
fibers, _, _ = fiber_distribution(m_1, gamma_len, chords_1)
d_pos = d_positions_for(m_1, gamma_len)
return projection_support(fibers, d_pos)
def project_T2_U(gamma_len: int, k_2: int, chords_2, model: str) -> set:
"""T2's U-projection on γ. T2 has B_out = γ of length gamma_len,
B_in of length k_2."""
if model == 'SR':
n = gamma_len + k_2
fibers = spoke_only_fiber_distribution(n)
else:
fibers, _, _ = fiber_distribution(gamma_len, k_2, chords_2)
u_pos = u_positions_for(gamma_len, k_2)
return projection_support(fibers, u_pos)
def intersect_with_reflection(S1: set, S2: set) -> tuple[set, set]:
"""Return (forward intersection, reflection-flipped intersection)."""
forward = S1 & S2
S2_rev = {s[::-1] for s in S2}
reverse = S1 & S2_rev
return forward, reverse
CASES = [
# (γ, T1=(m_1, chords_1, model1), T2=(k_2, chords_2, model2))
# γ = 3: no chord constraints possible (C_3 has no chords)
(3, (3, [], 'SR'), (3, [], 'SR')),
(3, (3, [], 'SR'), (4, [(0,2)], 'SP')),
(3, (3, [], 'SP'), (3, [], 'SP')),
(3, (3, [], 'SP'), (4, [(0,2)], 'SP')),
# γ = 4: SP-feasible only with chord (0,2) on T1
(4, (4, [], 'SR'), (4, [], 'SR')),
(4, (4, [(0,2)], 'SP'), (4, [(0,2)], 'SP')),
(4, (4, [(0,2)], 'SP'), (4, [], 'SR')),
(4, (4, [], 'SR'), (4, [(0,2)], 'SP')),
(4, (3, [(0,2)], 'SP'), (4, [(0,2)], 'SP')),
(4, (4, [(0,2)], 'SP'), (5, [(0,2)], 'SP')),
(4, (4, [(0,2)], 'SP'), (6, [(0,3)], 'SP')),
(4, (4, [(0,2)], 'SP'), (6, [(0,2),(3,5)], 'SP')),
# γ = 5
(5, (5, [(0,2)], 'SP'), (3, [], 'SR')),
(5, (5, [(0,2)], 'SP'), (5, [(0,2)], 'SP')),
(5, (5, [(0,2)], 'SP'), (5, [(0,3)], 'SP')),
(5, (5, [(0,3)], 'SP'), (5, [(0,3)], 'SP')),
(5, (5, [(0,2)], 'SR'), (5, [(0,2)], 'SP')),
# γ = 6
(6, (6, [(0,3)], 'SP'), (6, [(0,3)], 'SP')),
(6, (6, [(0,3)], 'SP'), (6, [(0,2),(3,5)], 'SP')),
(6, (6, [(0,2),(3,5)], 'SP'), (6, [(0,2),(3,5)], 'SP')),
(6, (6, [(0,3)], 'SP'), (3, [], 'SR')),
(6, (6, [(0,2),(3,5)], 'SP'), (3, [], 'SR')),
(6, (6, [(0,2),(3,5)], 'SP'), (4, [(0,2)], 'SP')),
]
def fmt_cfg(m_or_k: int, chords, model: str) -> str:
ch_str = str(chords) if chords else ""
return f"({m_or_k}, {ch_str}, {model})"
def main():
print(f"{'γ':>2} {'T1 (m_1, chords_1, model)':<32s} {'T2 (k_2, chords_2, model)':<32s} "
f"{'|S1|':>5s} {'|S2|':>5s} {'3^γ':>5s} {'fwd':>5s} {'rev':>5s} {'compat?':>7s}")
print("-" * 120)
nyes = ntotal = 0
for gamma, t1, t2 in CASES:
m_1, ch1, model1 = t1
k_2, ch2, model2 = t2
S1 = project_T1_D(gamma, m_1, ch1, model1)
S2 = project_T2_U(gamma, k_2, ch2, model2)
forward, reverse = intersect_with_reflection(S1, S2)
compat = "YES" if (forward or reverse) else "NO"
ntotal += 1
if compat == "YES":
nyes += 1
print(
f"{gamma:>2} {fmt_cfg(m_1, ch1, model1):<32s} {fmt_cfg(k_2, ch2, model2):<32s} "
f"{len(S1):>5d} {len(S2):>5d} {3**gamma:>5d} "
f"{len(forward):>5d} {len(reverse):>5d} {compat:>7s}"
)
print("-" * 120)
print(f"{nyes}/{ntotal} compatible.")
if __name__ == '__main__':
main()
@@ -0,0 +1,27 @@
γ T1 (m_1, chords_1, model) T2 (k_2, chords_2, model) |S1| |S2| 3^γ fwd rev compat?
------------------------------------------------------------------------------------------------------------------------
3 (3, —, SR) (3, —, SR) 27 27 27 27 27 YES
3 (3, —, SR) (4, [(0, 2)], SP) 27 24 27 24 24 YES
3 (3, —, SP) (3, —, SP) 6 6 27 6 6 YES
3 (3, —, SP) (4, [(0, 2)], SP) 6 24 27 6 6 YES
4 (4, —, SR) (4, —, SR) 81 81 81 81 81 YES
4 (4, [(0, 2)], SP) (4, [(0, 2)], SP) 36 54 81 36 36 YES
4 (4, [(0, 2)], SP) (4, —, SR) 36 81 81 36 36 YES
4 (4, —, SR) (4, [(0, 2)], SP) 81 54 81 54 54 YES
4 (3, [(0, 2)], SP) (4, [(0, 2)], SP) 36 54 81 36 36 YES
4 (4, [(0, 2)], SP) (5, [(0, 2)], SP) 36 36 81 12 12 YES
4 (4, [(0, 2)], SP) (6, [(0, 3)], SP) 36 15 81 6 6 YES
4 (4, [(0, 2)], SP) (6, [(0, 2), (3, 5)], SP) 36 81 81 36 36 YES
5 (5, [(0, 2)], SP) (3, —, SR) 36 171 243 18 18 YES
5 (5, [(0, 2)], SP) (5, [(0, 2)], SP) 36 90 243 36 36 YES
5 (5, [(0, 2)], SP) (5, [(0, 3)], SP) 36 90 243 36 36 YES
5 (5, [(0, 3)], SP) (5, [(0, 3)], SP) 36 90 243 36 36 YES
5 (5, [(0, 2)], SR) (5, [(0, 2)], SP) 243 90 243 90 90 YES
6 (6, [(0, 3)], SP) (6, [(0, 3)], SP) 36 90 729 36 36 YES
6 (6, [(0, 3)], SP) (6, [(0, 2), (3, 5)], SP) 36 456 729 36 36 YES
6 (6, [(0, 2), (3, 5)], SP) (6, [(0, 2), (3, 5)], SP) 216 456 729 216 162 YES
6 (6, [(0, 3)], SP) (3, —, SR) 36 396 729 6 6 YES
6 (6, [(0, 2), (3, 5)], SP) (3, —, SR) 216 396 729 108 108 YES
6 (6, [(0, 2), (3, 5)], SP) (4, [(0, 2)], SP) 216 342 729 108 90 YES
------------------------------------------------------------------------------------------------------------------------
23/23 compatible.
@@ -0,0 +1,6 @@
\relax
\newlabel{obs:always-compatible}{{}{2}}
\newlabel{obs:containment}{{}{2}}
\newlabel{obs:rainbow}{{}{2}}
\newlabel{obs:reflection}{{}{3}}
\gdef \@abspage@last{3}
@@ -0,0 +1,324 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 02:32
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**tire_fiber_step2.tex
(./tire_fiber_step2.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_step2.aux)
\openout1 = `tire_fiber_step2.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
)
Overfull \hbox (14.49368pt too wide) in paragraph at lines 27--29
[]\OT1/cmr/m/n/10.95 Script: \OT1/cmtt/m/n/10.95 experiments/tire[]fiber[]step2
.py\OT1/cmr/m/n/10.95 ; out-put: \OT1/cmtt/m/n/10.95 experiments/tire[]fiber[]s
tep2[]data.txt\OT1/cmr/m/n/10.95 .
[]
[1
{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
[2] [3] (./tire_fiber_step2.aux) )
Here is how much of TeX's memory you used:
4569 strings out of 478268
74024 string characters out of 5846347
395361 words of memory out of 5000000
22748 multiletter control sequences out of 15000+600000
478865 words of font info for 64 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
55i,10n,63p,250b,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/type
1/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/
public/amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/p
ublic/amsfonts/cm/cmmi6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/pub
lic/amsfonts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publi
c/amsfonts/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/am
sfonts/cm/cmr6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfo
nts/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/cmsy6.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/c
mti10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cm
tt10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/cm-super/sfrm10
95.pfb>
Output written on tire_fiber_step2.pdf (3 pages, 191120 bytes).
PDF statistics:
90 PDF objects out of 1000 (max. 8388607)
54 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,217 @@
\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsthm}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{booktabs}
\usepackage{caption}
\geometry{margin=1in}
\title{Step 2: adjacent-tire compatibility on the shared cycle}
\author{}
\date{}
\newtheorem*{obs}{Observation}
\begin{document}
\maketitle
\section*{What this is}
Step~2 of the action items: for pairs of adjacent tires
$(T_1, T_2)$ sharing a cycle $\gamma$, we ask whether $T_1$'s
inner-spoke pattern on $\gamma$ and $T_2$'s outer-spoke pattern on
$\gamma$ are realisable simultaneously --- i.e.\ whether
$\pi_D^{(1)}(\mathcal{C}^{(1)}) \cap \pi_U^{(2)}(\mathcal{C}^{(2)})
\neq \emptyset$. This is the chain-pigeonhole compatibility step.
Script: \texttt{experiments/tire\_fiber\_step2.py}; output:
\texttt{experiments/tire\_fiber\_step2\_data.txt}.
\section*{Setup}
Each shared $G'$-edge across $\gamma$ has a single color in any
global edge $3$-coloring of $G'$. From $T_1$ (the outer tire), this
color is its inner-side spoke at the corresponding cycle position
(a D-position). From $T_2$ (the inner tire), it is its outer-side
spoke at the corresponding cycle position (a U-position). Both
demands must agree.
Letting $S_1 := \pi_D^{(1)}(\mathcal{C}^{(1)}) \subseteq \{1,2,3\}^k$
($k = |\gamma|$) and $S_2 := \pi_U^{(2)}(\mathcal{C}^{(2)}) \subseteq
\{1,2,3\}^k$, compatibility iff $S_1 \cap S_2 \neq \emptyset$ under
the geometric correspondence between $T_1$'s $\gamma$-indexing and
$T_2$'s $\gamma$-indexing (which is either ``same orientation'' or
``reversed orientation'' depending on the embedding). Both supports
are closed under cyclic rotation of $\gamma$, so rotation choice does
not matter; we check both forward and reversed-$S_2$ intersection.
Each tire is tested under two models:
\begin{itemize}
\item \textbf{Steiner-rich (SR)}: chord set is invisible to
$T'_{f'}$; supports always saturate when possible
(the step-1 baseline).
\item \textbf{Steiner-poor (SP)}: chord set determines feasibility
and constraints; supports are smaller, often much smaller
(the chord-case from
\texttt{tire\_fiber\_chords.tex}).
\end{itemize}
\section*{Main data}
\begin{center}
\scriptsize
\begin{tabular}{c | l l | r r r r r c}
\toprule
$k$
& $T_1 = (m_1, \text{chords}_1, \text{model}_1)$
& $T_2 = (k_2, \text{chords}_2, \text{model}_2)$
& $|S_1|$ & $|S_2|$ & $3^k$ & fwd & rev & compat?\\
\midrule
3 & $(3, -, \text{SR})$ & $(3, -, \text{SR})$ & 27 & 27 & 27 & 27 & 27 & yes \\
3 & $(3, -, \text{SR})$ & $(4, (0{,}2), \text{SP})$ & 27 & 24 & 27 & 24 & 24 & yes \\
3 & $(3, -, \text{SP})$ & $(3, -, \text{SP})$ & 6 & 6 & 27 & 6 & 6 & yes \\
3 & $(3, -, \text{SP})$ & $(4, (0{,}2), \text{SP})$ & 6 & 24 & 27 & 6 & 6 & yes \\
\midrule
4 & $(4, -, \text{SR})$ & $(4, -, \text{SR})$ & 81 & 81 & 81 & 81 & 81 & yes \\
4 & $(4, (0{,}2), \text{SP})$ & $(4, (0{,}2), \text{SP})$ & 36 & 54 & 81 & 36 & 36 & yes \\
4 & $(4, (0{,}2), \text{SP})$ & $(4, -, \text{SR})$ & 36 & 81 & 81 & 36 & 36 & yes \\
4 & $(4, -, \text{SR})$ & $(4, (0{,}2), \text{SP})$ & 81 & 54 & 81 & 54 & 54 & yes \\
4 & $(3, (0{,}2), \text{SP})$ & $(4, (0{,}2), \text{SP})$ & 36 & 54 & 81 & 36 & 36 & yes \\
4 & $(4, (0{,}2), \text{SP})$ & $(5, (0{,}2), \text{SP})$ & 36 & 36 & 81 & 12 & 12 & yes \\
4 & $(4, (0{,}2), \text{SP})$ & $(6, (0{,}3), \text{SP})$ & 36 & 15 & 81 & 6 & 6 & yes \\
4 & $(4, (0{,}2), \text{SP})$ & $(6, (0{,}2)(3{,}5), \text{SP})$ & 36 & 81 & 81 & 36 & 36 & yes \\
\midrule
5 & $(5, (0{,}2), \text{SP})$ & $(3, -, \text{SR})$ & 36 & 171 & 243 & 18 & 18 & yes \\
5 & $(5, (0{,}2), \text{SP})$ & $(5, (0{,}2), \text{SP})$ & 36 & 90 & 243 & 36 & 36 & yes \\
5 & $(5, (0{,}2), \text{SP})$ & $(5, (0{,}3), \text{SP})$ & 36 & 90 & 243 & 36 & 36 & yes \\
5 & $(5, (0{,}3), \text{SP})$ & $(5, (0{,}3), \text{SP})$ & 36 & 90 & 243 & 36 & 36 & yes \\
5 & $(5, (0{,}2), \text{SR})$ & $(5, (0{,}2), \text{SP})$ & 243 & 90 & 243 & 90 & 90 & yes \\
\midrule
6 & $(6, (0{,}3), \text{SP})$ & $(6, (0{,}3), \text{SP})$ & 36 & 90 & 729 & 36 & 36 & yes \\
6 & $(6, (0{,}3), \text{SP})$ & $(6, (0{,}2)(3{,}5), \text{SP})$ & 36 & 456 & 729 & 36 & 36 & yes \\
6 & $(6, (0{,}2)(3{,}5), \text{SP})$ & $(6, (0{,}2)(3{,}5), \text{SP})$ & 216 & 456 & 729 & 216 & 162 & yes \\
6 & $(6, (0{,}3), \text{SP})$ & $(3, -, \text{SR})$ & 36 & 396 & 729 & 6 & 6 & yes \\
6 & $(6, (0{,}2)(3{,}5), \text{SP})$ & $(3, -, \text{SR})$ & 216 & 396 & 729 & 108 & 108 & yes \\
6 & $(6, (0{,}2)(3{,}5), \text{SP})$ & $(4, (0{,}2), \text{SP})$ & 216 & 342 & 729 & 108 & 90 & yes \\
\bottomrule
\end{tabular}
\end{center}
\noindent
\textbf{Result: 23 / 23 tested pairs are compatible.}
\section*{Observations}
\begin{obs}[Always compatible]
\label{obs:always-compatible}
Across all $23$ tested $(T_1, T_2)$ pairs --- spanning $k \in \{3, 4,
5, 6\}$, both SR and SP models, and a representative spread of chord
configurations on each side --- the intersection $S_1 \cap S_2$ is
non-empty. No counterexample was found.
\end{obs}
\begin{obs}[Containment is the typical outcome]
\label{obs:containment}
In several cases the smaller support is contained in the larger:
\begin{itemize}
\item $k = 4$, $T_1 = (4, (0{,}2), \text{SP})$ vs.\ $T_2 = (4,
(0{,}2), \text{SP})$: $|S_1| = 36 \subseteq |S_2| = 54$,
$|S_1 \cap S_2| = 36$.
\item $k = 6$, $T_1 = (6, (0{,}2)(3{,}5), \text{SP})$ vs.\
$T_2 = (6, (0{,}2)(3{,}5), \text{SP})$: $|S_1| = 216 \subseteq
|S_2| = 456$, $|S_1 \cap S_2| = 216$.
\end{itemize}
This containment is not universal --- in
$k=6$, $T_1 = (6, (0{,}3), \text{SP})$ vs.\ $T_2 = (3, -, \text{SR})$
we have $|S_1| = 36$, $|S_2| = 396$, but $|S_1 \cap S_2| = 6$, so
$S_1 \not\subseteq S_2$. Still non-empty.
\end{obs}
\begin{obs}[Small intersections are rainbow-structured]
\label{obs:rainbow}
In the worst tested case --- $k=6$, $T_1=(6, (0{,}3), \text{SP})$ vs.\
$T_2=(3, -, \text{SR})$, $|S_1 \cap S_2| = 6$ --- the six elements
are precisely
\[
\{\,(a, b, c, b, c, a) : \{a,b,c\} = \{1,2,3\}\,\},
\]
the $3!$ ``rainbow''-style colorings. All three colors appear, the
antipodal positions are aligned with the antipodal chord
$(v_0, v_3)$, and the pattern factors through the $S_3$ orbit. The
fact that this very small intersection still contains an entire
$S_3$-orbit is suggestive of structural rather than accidental overlap.
\end{obs}
\begin{obs}[Reflection sensitivity]
\label{obs:reflection}
Most pairs give the same intersection size in forward and reverse
orientations, indicating the supports are reflection-closed in
practice. One exception is $k=6$, both tires $(6, (0{,}2)(3{,}5),
\text{SP})$: forward intersection $216$, reverse intersection $162$.
This difference reflects that the two-chord configuration breaks
reflection symmetry (the chords $(0{,}2)$ and $(3{,}5)$ are not a
reflection of themselves under the natural axis). Either way, both
orientations give non-empty intersection.
\end{obs}
\section*{Putting steps 1 and 2 together}
\begin{itemize}
\item \textbf{Step 1 (single tire under SR).} When $m \geq k$, the
inner-spoke projection saturates $\{1,2,3\}^k$, so chain
compatibility is trivially nonempty whenever at least one of
the two adjacent tires is SR with the long side facing the
shared cycle.
\item \textbf{Step 1 with chords under SP.} Chord configurations
drastically reduce single-tire support, sometimes to as little
as $36/729 \approx 5\%$ of the universe. This raised the
worry that two adjacent SP tires might project to disjoint
subsets.
\item \textbf{Step 2.} Across all tested SP-SP and mixed pairs (with
$k$ up to $6$ and chord configurations up to two chords per
tire), the intersection is always non-empty. Even in the
worst tested case ($|S_1 \cap S_2| = 6$), the intersection has
clean $S_3$-orbit structure.
\end{itemize}
\noindent
\textbf{Combined empirical conclusion:} for adjacent tires in the
configurations we tested, the chain-pigeonhole step succeeds, even
under the Steiner-poor model where chord constraints actively
restrict the realisable supports. The supports do not become so
small that they fail to intersect.
\section*{Caveats}
\begin{enumerate}
\item \textbf{Tested cases are not a proof.} $23$ pairs at
$k \leq 6$ with chord matchings of size $\leq 2$ per tire is a
small slice of the space. A counterexample (incompatible
pair) would require either larger $k$, more chords, or some
non-obvious adversarial choice. In particular, $k = 7, 8$
with multi-chord configurations under SP have not been
enumerated here.
\item \textbf{Modelling assumption.} Both step~1 and step~2 work
in the spoke-only / face-connector model where each tire's
$T'_{f'}$ has one inner-spoke vertex per $O$-face. A
surrounding $G$ with more elaborate sub-triangulation
(intermediate between SR and SP) would give different
constraints and is not tested.
\item \textbf{Multi-tire chains.} Step~2 is pairwise
compatibility. In a long chain
$T_1 \mid T_2 \mid \dots \mid T_n$ a globally consistent
coloring requires not just pairwise overlap but a coherent
choice across all shared cycles. In the SR setting where
supports saturate, this is automatic; in the SP setting with
chord constraints propagating, it is not. This is the
natural step~3.
\item \textbf{Pattern explanation.} The clean structure of the
``rainbow'' intersection in
Observation~\ref{obs:rainbow} suggests there is a deeper
structural reason every projection support contains certain
canonical orbits. Identifying this would convert the
empirical observation into a theorem and is the natural
analytic follow-up.
\end{enumerate}
\end{document}