coloring_nested_tire_graphs: enumerate spoke-only tire fiber distributions for n ≤ 12

Step 1 of birkhoff_heesch_reducibility action items. Brute-force
enumerates N(T'_{f'}; σ) for G_n = C_n + n pendants at 3 colors,
n=3..12. Two empirical findings: (1) fiber sizes are always 1 or 2
(constant σ on even n gives size 2; everything else gives size 1);
(2) projecting C onto k evenly-spread positions covers {1,2,3}^k iff
n ≥ 2k. The second implies that for a tire with |B_out| ≥ |B_in|,
every ring coloring on the inner boundary is realisable — so the
chain-pigeonhole intersection step is trivially nonempty whenever the
shared cycle is not locally the longest. Includes script, raw JSON,
text dump, and 4-page data note.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 01:28:37 -04:00
parent c5544497bd
commit de0bbe4300
7 changed files with 9877 additions and 0 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,53 @@
=== FIBER DISTRIBUTION SUMMARY (G_n = C_n + n pendants, k=3 colors) ===
n | P_e | |C| | 3^n | |C|/3^n | A-red? | max | min | mean | fiber sizes
----+-------+-------+--------+---------+--------+-----+-----+-------+-------------
3 | 6 | 6 | 27 | 0.222 | no | 1 | 1 | 1.00 | 1×6
4 | 18 | 15 | 81 | 0.185 | no | 2 | 1 | 1.20 | 1×12, 2×3
5 | 30 | 30 | 243 | 0.123 | no | 1 | 1 | 1.00 | 1×30
6 | 66 | 63 | 729 | 0.086 | no | 2 | 1 | 1.05 | 1×60, 2×3
7 | 126 | 126 | 2187 | 0.058 | no | 1 | 1 | 1.00 | 1×126
8 | 258 | 255 | 6561 | 0.039 | no | 2 | 1 | 1.01 | 1×252, 2×3
9 | 510 | 510 | 19683 | 0.026 | no | 1 | 1 | 1.00 | 1×510
10 | 1026 | 1023 | 59049 | 0.017 | no | 2 | 1 | 1.00 | 1×1020, 2×3
11 | 2046 | 2046 | 177147 | 0.012 | no | 1 | 1 | 1.00 | 1×2046
12 | 4098 | 4095 | 531441 | 0.008 | no | 2 | 1 | 1.00 | 1×4092, 2×3
=== PROJECTION ONTO SHARED-CYCLE BLOCKS ===
n | k | contiguous-block |/ 3^k | spread |/ 3^k
----+-----+-------------------+-------+--------+-------
3 | 3 | 6 / 27 | 0.222 | 6 | 0.222
4 | 3 | 15 / 27 | 0.556 | 15 | 0.556
4 | 4 | 15 / 81 | 0.185 | 15 | 0.185
5 | 3 | 21 / 27 | 0.778 | 24 | 0.889
5 | 4 | 30 / 81 | 0.370 | 30 | 0.370
5 | 5 | 30 / 243 | 0.123 | 30 | 0.123
6 | 3 | 21 / 27 | 0.778 | 27 | 1.000
6 | 4 | 45 / 81 | 0.556 | 51 | 0.630
6 | 5 | 63 / 243 | 0.259 | 63 | 0.259
6 | 6 | 63 / 729 | 0.086 | 63 | 0.086
7 | 3 | 21 / 27 | 0.778 | 27 | 1.000
7 | 4 | 45 / 81 | 0.556 | 78 | 0.963
7 | 5 | 93 / 243 | 0.383 | 114 | 0.469
7 | 6 | 126 / 729 | 0.173 | 126 | 0.173
8 | 3 | 21 / 27 | 0.778 | 27 | 1.000
8 | 4 | 45 / 81 | 0.556 | 81 | 1.000
8 | 5 | 93 / 243 | 0.383 | 171 | 0.704
8 | 6 | 189 / 729 | 0.259 | 237 | 0.325
9 | 3 | 21 / 27 | 0.778 | 27 | 1.000
9 | 4 | 45 / 81 | 0.556 | 81 | 1.000
9 | 5 | 93 / 243 | 0.383 | 240 | 0.988
9 | 6 | 189 / 729 | 0.259 | 384 | 0.527
10 | 3 | 21 / 27 | 0.778 | 27 | 1.000
10 | 4 | 45 / 81 | 0.556 | 81 | 1.000
10 | 5 | 93 / 243 | 0.383 | 243 | 1.000
10 | 6 | 189 / 729 | 0.259 | 561 | 0.770
11 | 3 | 21 / 27 | 0.778 | 27 | 1.000
11 | 4 | 45 / 81 | 0.556 | 81 | 1.000
11 | 5 | 93 / 243 | 0.383 | 243 | 1.000
11 | 6 | 189 / 729 | 0.259 | 726 | 0.996
12 | 3 | 21 / 27 | 0.778 | 27 | 1.000
12 | 4 | 45 / 81 | 0.556 | 81 | 1.000
12 | 5 | 93 / 243 | 0.383 | 243 | 1.000
12 | 6 | 189 / 729 | 0.259 | 729 | 1.000
@@ -0,0 +1,219 @@
"""Step 1 of birkhoff_heesch_reducibility.tex: enumerate the fiber
distribution N(T'_{f'}; σ) for spoke-only tire annular face connectors.
In the spoke-only setting (Remark 1.16.1) the tire annular face
connector is
G_n = C_n + one pendant edge at each cycle vertex
where n = m + k = |V(B_out)| + |V(B_in)|. Each cycle vertex v_i has
degree 3 (two cycle edges + one pendant spoke). At k = 3 colors, the
proper-edge-coloring constraint forces the spoke color s_i at v_i to
be the unique color not used by the two cycle edges at v_i.
So the map
proper edge 3-coloring of G_n --> σ{1,2,3}^n
is well-defined (each cycle coloring maps to one σ). The fiber count
N(σ) := #{cycle colorings inducing σ} partitions the P_e(G_n, 3) =
2^n + 2(-1)^n proper edge colorings into fibers over σ.
This script computes the full fiber distribution and various
summaries. Output is written to fiber_data.json next to this file.
"""
from __future__ import annotations
import json
import os
from collections import Counter
from itertools import product
COLORS = (1, 2, 3)
def induced_sigma(cycle_coloring: tuple[int, ...]) -> tuple[int, ...]:
"""Given a proper edge 3-coloring (c(e_0), ..., c(e_{n-1})) of C_n,
return the induced spoke configuration σ where σ_i = third color at v_i.
v_i is incident to edges e_{i-1} and e_i (indices mod n)."""
n = len(cycle_coloring)
return tuple(
({1, 2, 3} - {cycle_coloring[(i - 1) % n], cycle_coloring[i]}).pop()
for i in range(n)
)
def enumerate_proper_cycle_colorings(n: int):
"""Yield all proper edge 3-colorings of C_n (i.e., n-tuples in {1,2,3}^n
with consecutive entries distinct, including wraparound)."""
for ce in product(COLORS, repeat=n):
if all(ce[i] != ce[(i + 1) % n] for i in range(n)):
yield ce
def fiber_distribution(n: int) -> dict[tuple[int, ...], int]:
"""Return Counter mapping σ -> N(σ) for G_n = C_n + n pendants."""
fibers: Counter[tuple[int, ...]] = Counter()
for ce in enumerate_proper_cycle_colorings(n):
fibers[induced_sigma(ce)] += 1
return dict(fibers)
def projection_support(fibers: dict[tuple[int, ...], int], positions: tuple[int, ...]) -> set[tuple[int, ...]]:
"""Return the set of σ-projections onto the given positions
(e.g., positions=(0,1,2,3) extracts the first four coords of each σ)."""
return {tuple(sigma[p] for p in positions) for sigma in fibers}
def summary_row(n: int) -> dict:
"""Compute summary statistics for n = m + k."""
fibers = fiber_distribution(n)
total = sum(fibers.values())
support = len(fibers)
fiber_sizes = list(fibers.values())
size_dist = Counter(fiber_sizes)
# P_e(C_n, 3) closed form
pe_closed = 2**n + 2 * ((-1) ** n)
# Universe size for σ
universe = 3**n
# A-reducibility check: is every σ realizable?
a_reducible = (support == universe)
return {
'n': n,
'P_e_computed': total,
'P_e_closed_form': pe_closed,
'match': total == pe_closed,
'sigma_support': support,
'sigma_universe': universe,
'support_fraction': support / universe if universe else 0.0,
'A_reducible': a_reducible,
'max_fiber': max(fiber_sizes) if fiber_sizes else 0,
'min_fiber': min(fiber_sizes) if fiber_sizes else 0,
'mean_fiber': total / support if support else 0.0,
'fiber_size_distribution': dict(size_dist),
}
def half_cycle_projections(n: int, k_values=(3, 4, 5, 6)) -> dict:
"""For each k <= n in k_values, project σ onto contiguous-block
positions (0, 1, ..., k-1) and tabulate how many of {1,2,3}^k are
covered. This is the support of σ restricted to a 'shared cycle'
of length k.
Also try the 'alternating' pattern (take every other position)
when the math works out."""
fibers = fiber_distribution(n)
out = {}
for k in k_values:
if k > n:
continue
# contiguous block: first k positions
contiguous = projection_support(fibers, tuple(range(k)))
# 'spread' block: positions evenly spaced (if possible)
if k <= n:
spread_positions = tuple(round(i * n / k) % n for i in range(k))
# ensure distinct
if len(set(spread_positions)) == k:
spread = projection_support(fibers, spread_positions)
else:
spread = None
else:
spread = None
out[k] = {
'k': k,
'positions_contiguous': tuple(range(k)),
'support_contiguous': len(contiguous),
'positions_spread': spread_positions if spread else None,
'support_spread': len(spread) if spread else None,
'universe_k': 3**k,
}
return out
def format_table(rows: list[dict]) -> str:
lines = [
'n | P_e | |C| | 3^n | |C|/3^n | A-red? | max | min | mean | fiber sizes',
'----+-------+-------+--------+---------+--------+-----+-----+-------+-------------',
]
for r in rows:
sz_dist = sorted(r['fiber_size_distribution'].items())
sz_str = ', '.join(f"{s}×{c}" for s, c in sz_dist)
lines.append(
f"{r['n']:2d} | {r['P_e_computed']:5d} | {r['sigma_support']:5d} | "
f"{r['sigma_universe']:6d} | {r['support_fraction']:7.3f} | "
f"{'yes' if r['A_reducible'] else 'no':4s} | "
f"{r['max_fiber']:3d} | {r['min_fiber']:3d} | "
f"{r['mean_fiber']:5.2f} | {sz_str}"
)
return '\n'.join(lines)
def format_projection_table(projections_by_n: dict[int, dict]) -> str:
lines = [
'n | k | contiguous-block |/ 3^k | spread |/ 3^k',
'----+-----+-------------------+-------+--------+-------',
]
for n in sorted(projections_by_n):
for k, info in sorted(projections_by_n[n].items()):
uni = info['universe_k']
sc = info['support_contiguous']
ss = info['support_spread']
ss_str = f"{ss:6d} | {ss/uni:.3f}" if ss is not None else f"{'-':6s} | - "
lines.append(
f"{n:2d} | {k:2d} | {sc:7d} / {uni:5d} | {sc/uni:.3f} | {ss_str}"
)
return '\n'.join(lines)
def main():
here = os.path.dirname(os.path.abspath(__file__))
out_json = os.path.join(here, 'fiber_data.json')
out_txt = os.path.join(here, 'fiber_data.txt')
# Step 1: fiber distribution for n = 3..12
n_range = range(3, 13)
rows = []
full_fibers = {}
projections = {}
for n in n_range:
rows.append(summary_row(n))
full_fibers[n] = fiber_distribution(n)
projections[n] = half_cycle_projections(n)
# Output tables
summary_text = (
'=== FIBER DISTRIBUTION SUMMARY (G_n = C_n + n pendants, k=3 colors) ===\n\n'
+ format_table(rows)
+ '\n\n=== PROJECTION ONTO SHARED-CYCLE BLOCKS ===\n\n'
+ format_projection_table(projections)
+ '\n'
)
print(summary_text)
with open(out_txt, 'w') as f:
f.write(summary_text)
print(f"\nWrote {out_txt}")
# Save raw data for follow-up analyses (step 2: adjacent-tire overlap)
data = {
'summary_rows': rows,
'projections': {str(n): projections[n] for n in projections},
# full_fibers: convert tuple keys to strings for JSON
'full_fibers': {
str(n): {','.join(map(str, sigma)): count
for sigma, count in full_fibers[n].items()}
for n in full_fibers
},
}
with open(out_json, 'w') as f:
json.dump(data, f, indent=2)
print(f"Wrote {out_json}")
if __name__ == '__main__':
main()
@@ -0,0 +1,8 @@
\relax
\newlabel{obs:dichotomy}{{}{2}}
\newlabel{obs:threshold}{{}{2}}
\@writefile{toc}{\contentsline {paragraph}{Threshold data (spread projection).}{2}{}\protected@file@percent }
\@writefile{toc}{\contentsline {paragraph}{Contiguous projection (for contrast).}{2}{}\protected@file@percent }
\@writefile{toc}{\contentsline {paragraph}{Implication for the chain-pigeonhole step.}{3}{}\protected@file@percent }
\newlabel{obs:conjecture}{{}{3}}
\gdef \@abspage@last{4}
@@ -0,0 +1,325 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 01:26
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**tire_fiber_data.tex
(./tire_fiber_data.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_data.aux)
\openout1 = `tire_fiber_data.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
(/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 18.
(/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 18.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
)
Overfull \hbox (4.90312pt too wide) in paragraph at lines 29--34
\OML/cmm/m/it/10.95 n$\OT1/cmr/m/n/10.95 ). Script: \OT1/cmtt/m/n/10.95 experim
ents/tire[]fiber[]enumeration.py\OT1/cmr/m/n/10.95 ; raw data: \OT1/cmtt/m/n/10
.95 experiments/fiber[]data.json\OT1/cmr/m/n/10.95 .
[]
[1
{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
[2] [3] [4] (./tire_fiber_data.aux) )
Here is how much of TeX's memory you used:
4585 strings out of 478268
74198 string characters out of 5846347
378410 words of memory out of 5000000
22762 multiletter control sequences out of 15000+600000
482013 words of font info for 77 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
55i,9n,63p,249b,229s 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/t
ype1/public/amsfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/ty
pe1/public/amsfonts/cm/cmbx12.pfb></usr/local/texlive/2022/texmf-dist/fonts/typ
e1/public/amsfonts/cm/cmex10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type
1/public/amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1
/public/amsfonts/cm/cmmi12.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/
public/amsfonts/cm/cmmi7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/pu
blic/amsfonts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publ
ic/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/a
msfonts/cm/cmr8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsf
onts/cm/cmsy10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfo
nts/cm/cmsy6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfont
s/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/c
m/cmtt10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/cm-super/sf
rm1095.pfb>
Output written on tire_fiber_data.pdf (4 pages, 199931 bytes).
PDF statistics:
98 PDF objects out of 1000 (max. 8388607)
59 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,254 @@
\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsthm}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{booktabs}
\usepackage{caption}
\geometry{margin=1in}
\title{Fiber distributions for spoke-only tire face connectors:\\
enumeration data for $n = 3, \dots, 12$}
\author{}
\date{}
\newtheorem*{obs}{Observation}
\newtheorem*{defn}{Definition}
\begin{document}
\maketitle
\section*{What this is}
This note is the output of Step~1 of the action items in
\texttt{birkhoff\_heesch\_reducibility.tex}: a brute-force enumeration
of the fiber distribution $N(T'_{f'}; \sigma)$ for small spoke-only
tire annular face connectors, framed as a $k = 3$ edge-coloring of the
graph
\[
G_n \;:=\; C_n \;+\; \text{(one pendant edge at each cycle vertex)},
\]
which is the spoke-only $T'_{f'}$ when $n = m + k$ (the boundary
cycle lengths of the underlying tire sum to $n$). Script:
\texttt{experiments/tire\_fiber\_enumeration.py}; raw data:
\texttt{experiments/fiber\_data.json}.
\section*{Setup recap}
A proper edge $3$-coloring of $G_n$ assigns colors to $n$ cycle edges
and $n$ pendant edges so that the three edges incident to each cycle
vertex $v_i$ get distinct colors. Since $\deg(v_i) = 3$ and we have
exactly $3$ colors, the pendant color $s_i$ is uniquely determined by
the two cycle-edge colors at $v_i$ as $s_i = \{1,2,3\} \setminus
\{c(e_{i-1}), c(e_i)\}$. Therefore the map
\[
\{\text{proper edge $3$-colorings of } G_n\}
\;\longrightarrow\;
\Sigma := \{1,2,3\}^n, \qquad (c, s) \mapsto s,
\]
is well-defined, and
\[
P_e(G_n, 3) \;=\; |\{\text{cycle colorings}\}| \;=\; 2^n + 2(-1)^n
\;=\; \sum_{\sigma \in \Sigma} N(G_n; \sigma).
\]
The realisable support is $\mathcal{C} := \{\sigma : N(G_n; \sigma) >
0\}$. ``A-reducibility'' (every $\sigma$ realisable) corresponds to
$\mathcal{C} = \Sigma$.
\section*{Main table}
\begin{center}
\small
\begin{tabular}{r r r r r r r r l}
\toprule
$n$ & $P_e$ & $|\mathcal{C}|$ & $|\Sigma| = 3^n$
& $|\mathcal{C}|/|\Sigma|$ & A-red.? & max $N$ & min $N$ & fiber size dist.\\
\midrule
$3$ & $6$ & $6$ & $27$ & $0.222$ & no & $1$ & $1$ & $1{\times}6$ \\
$4$ & $18$ & $15$ & $81$ & $0.185$ & no & $2$ & $1$ & $1{\times}12,\;2{\times}3$ \\
$5$ & $30$ & $30$ & $243$ & $0.123$ & no & $1$ & $1$ & $1{\times}30$ \\
$6$ & $66$ & $63$ & $729$ & $0.086$ & no & $2$ & $1$ & $1{\times}60,\;2{\times}3$ \\
$7$ & $126$ & $126$ & $2187$ & $0.058$ & no & $1$ & $1$ & $1{\times}126$ \\
$8$ & $258$ & $255$ & $6561$ & $0.039$ & no & $2$ & $1$ & $1{\times}252,\;2{\times}3$ \\
$9$ & $510$ & $510$ & $19683$ & $0.026$ & no & $1$ & $1$ & $1{\times}510$ \\
$10$ & $1026$ & $1023$ & $59049$ & $0.017$ & no & $2$ & $1$ & $1{\times}1020,\;2{\times}3$ \\
$11$ & $2046$ & $2046$ & $177147$ & $0.012$ & no & $1$ & $1$ & $1{\times}2046$ \\
$12$ & $4098$ & $4095$ & $531441$ & $0.008$ & no & $2$ & $1$ & $1{\times}4092,\;2{\times}3$ \\
\bottomrule
\end{tabular}
\end{center}
\section*{Two empirical findings}
\begin{obs}[Fiber-size dichotomy]
\label{obs:dichotomy}
For every $n \in \{3, \dots, 12\}$ examined, every fiber has size $1$
or $2$. The only $\sigma$ with $N(\sigma) = 2$ are the three constant
configurations $\sigma = (a, a, \dots, a)$ for $a \in \{1, 2, 3\}$,
and only when $n$ is even. For odd $n$, no constant $\sigma$ is
realisable.
\end{obs}
This is straightforward from the cycle structure: a constant $\sigma$
forces every cycle edge to lie in $\{1,2,3\} \setminus \{a\}$, so the
cycle alternates between two colors --- possible only for even $n$,
and in two ways. For non-constant $\sigma$, the cycle coloring is
uniquely determined by $\sigma$ via constraint propagation.
\medskip
\noindent
The much more interesting finding concerns projections of $\mathcal{C}$
onto a $k$-position subset of $\sigma$:
\begin{obs}[Spread-projection threshold]
\label{obs:threshold}
Fix $k \geq 3$ and let $P \subseteq \{0, 1, \dots, n-1\}$ be a set
of $k$ positions chosen as evenly spaced as possible (i.e.\
$P = \{\lfloor i n/k \rfloor : 0 \leq i < k\}$). Write $\pi_P :
\Sigma \to \{1,2,3\}^k$ for the projection. Then empirically, for
$n \in \{3, \dots, 12\}$,
\[
\pi_P(\mathcal{C}) \;=\; \{1,2,3\}^k
\qquad\Longleftrightarrow\qquad n \;\geq\; 2k.
\]
For $n < 2k$ the deficit $|\{1,2,3\}^k| - |\pi_P(\mathcal{C})|$ is
small (between $1$ and roughly $30$ across the data) and shrinks as
$n \to 2k$ from below.
\end{obs}
\paragraph{Threshold data (spread projection).}
\begin{center}
\small
\begin{tabular}{r | c c c c c c c c c c}
\toprule
& \multicolumn{10}{c}{$n$}\\
$k$ & $3$ & $4$ & $5$ & $6$ & $7$ & $8$ & $9$ & $10$ & $11$ & $12$ \\
\midrule
$3$ & $6$ & $15$ & $24$ & $\mathbf{27}$ & $27$ & $27$ & $27$ & $27$ & $27$ & $27$ \\
$4$ & --- & $15$ & $30$ & $51$ & $78$ & $\mathbf{81}$ & $81$ & $81$ & $81$ & $81$ \\
$5$ & --- & --- & $30$ & $63$ & $114$ & $171$ & $240$ & $\mathbf{243}$ & $243$ & $243$ \\
$6$ & --- & --- & --- & $63$ & $126$ & $237$ & $384$ & $561$ & $726$ & $\mathbf{729}$ \\
\bottomrule
\end{tabular}
\end{center}
\noindent
(Entries are $|\pi_P(\mathcal{C})|$; bold $=$ first row where the
support reaches the universe $3^k$. Universe sizes: $3^3 = 27,\;
3^4 = 81,\; 3^5 = 243,\; 3^6 = 729$.)
\paragraph{Contiguous projection (for contrast).}
Projecting onto a \emph{contiguous} block $P = \{0, 1, \dots, k-1\}$
gives a much smaller support that quickly stabilises and never reaches
the universe. For $k = 3$ and $n \geq 5$, the contiguous projection
plateaus at exactly $21/27$, with the $6$ missing patterns being
\[
\{(a, b, a) \in \{1,2,3\}^3 : a \neq b\}
\;=\; \{(1,2,1), (1,3,1), (2,1,2), (2,3,2), (3,1,3), (3,2,3)\}.
\]
These are the ``$aba$ palindromes,'' and the obstruction is a local
one: at three consecutive cycle positions with $\sigma = (a, b, a)$,
the two cycle edges $c(e_0)$ and $c(e_1)$ are both forced to be the
unique color not in $\{a, b\}$, contradicting proper-coloring at the
middle vertex.
\section*{Reducibility interpretation}
Translating through the dictionary of
\texttt{birkhoff\_heesch\_reducibility.tex}:
\begin{itemize}
\item \textbf{No spoke-only tire is A-reducible.} The realisable
support is a vanishing fraction of $\Sigma = \{1,2,3\}^n$ as $n$
grows ($\sim\!2^n / 3^n$). This is unsurprising --- it would
have been startling if it held.
\item \textbf{Fiber concentration is extreme.} Every fiber has size
$\leq 2$. This is the strongest possible concentration of the
fiber distribution: realisable spoke configurations and
cycle-edge colorings are essentially in bijection.
\item \textbf{Spread-projection saturation gives a strong positive
result.} The projection of $\mathcal{C}$ onto any half-cycle (or
shorter spread block) covers \emph{all} of $\{1,2,3\}^k$ once
$n \geq 2k$. In tire language: if the dual annular cycle is at
least twice as long as the shared boundary cycle, every ring
coloring on the shared cycle is realisable.
\item \textbf{Tires with $m \geq k$ saturate.} A tire with boundary
lengths $|B_{\mathrm{out}}| = m$ and $|B_{\mathrm{in}}| = k$ has
dual cycle of length $n = m + k$ in the spoke-only setting. The
$k$ inner-direction spokes occupy $k$ positions among $n$; in a
balanced triangulation (alternating U/D triangles), these
positions are spread. Observation~\ref{obs:threshold} then says
$\pi(\mathcal{C}) = \{1,2,3\}^k$ whenever $m \geq k$.
\end{itemize}
\paragraph{Implication for the chain-pigeonhole step.}
Two tires sharing a cycle $\gamma$ of length $k$ admit a joint edge
$3$-coloring iff the realisable spoke-projections of the two tires
onto $\gamma$ intersect. By the above:
\begin{itemize}
\item If \emph{both} adjacent tires have their non-$\gamma$-boundary
at least as long as $\gamma$, both projections equal
$\{1,2,3\}^k$ and the intersection is trivially non-empty.
Chain pigeonhole succeeds.
\item If \emph{one} side saturates and the other does not, the
intersection still equals the smaller (non-saturating) set,
which is non-empty. Chain pigeonhole succeeds.
\item The only potentially troublesome case is when \emph{both}
sides fail to saturate, i.e.\ both adjacent tires have
non-$\gamma$ boundaries shorter than $\gamma$ (in particular,
$\gamma$ is locally the longest cycle).
\end{itemize}
In a level-source BFS decomposition with cycles growing outward from
the source, ``$\gamma$ is locally the longest cycle'' happens at most
at one cycle: the outermost level. So for a level decomposition with
strictly nested cycles, only the outermost shared boundary is a
candidate failure point.
\section*{Conjecture suggested by the data}
\begin{obs}[Conjectural saturation principle]
\label{obs:conjecture}
For any spoke-only tire $T$ with boundary cycle lengths
$|B_{\mathrm{out}}| = m$ and $|B_{\mathrm{in}}| = k$ satisfying
$m \geq k$, the projection of the realisable spoke support
$\mathcal{C}(T'_{f'})$ onto the $k$ inner-direction spokes equals
$\{1,2,3\}^k$, independently of the choice of triangulation
(provided the inner-spoke positions are not all consecutive).
\end{obs}
\noindent
The data verifies this for $m + k = n \leq 12$ and balanced (spread)
triangulations. A proof would presumably proceed by induction on $m$
or by an explicit construction of cycle colorings realising any
target boundary configuration. This is the natural next computational
step (e.g.\ extend the enumeration to $n \leq 18$ and try unbalanced
spoke partitions) and the natural next analytic step (try to prove
the saturation principle from first principles).
\section*{Caveats}
\begin{enumerate}
\item All data is for the \textbf{spoke-only} case
(Remark~1.16.1): no chords in the inner outerplanar graph
$O$. Tires with non-trivial $O$ have additional structure
inside $T'_{f'}$ that we have not enumerated.
\item The ``spread'' position pattern in the enumeration script
uses
$P = \{\lfloor in/k \rfloor : 0 \leq i < k\}$, which is one
canonical evenly-spaced choice. Other spread patterns may
give different supports at the same $(n, k)$.
\item The threshold $n = 2k$ is observed empirically up to $n = 12$.
It is consistent with the heuristic that ``$k$ spread spoke
positions on $C_n$ are independent enough to range freely once
$n \geq 2k$,'' but is not proven here.
\item Adjacent-tire intersection (the actual chain pigeonhole step)
is left to a separate computation that takes pairs of fiber
distributions and intersects projections on the shared cycle.
That is Step~2 of the action items.
\end{enumerate}
\end{document}