Add self-flip-neighbor survey and write-up

Add experiments/self_flip_neighbor.py: enumerate the admissible flips of a
maximal planar graph and test each for isomorphism to the original, i.e. decide
whether G lies in its own flip neighborhood N(G). Supports a single graph6 input
or an order-range survey over min-degree-5 triangulations.

Add a "self-flip neighbors" section to paper.tex with the n=12..25 survey table
and a remark: the self-flip fraction declines as expected (min-degree-5
triangulations are asymptotically rigid), and this is not useful for narrowing
the minimal criminal since it neither includes nor excludes any candidate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-19 00:59:44 -04:00
parent f54b66f857
commit b1d681f39e
6 changed files with 220 additions and 36 deletions
@@ -0,0 +1,103 @@
"""Experiment: is a given maximal planar graph in its own flip neighborhood?
The flip neighborhood N(G) of a maximal planar graph G (Definition
"flip-neighborhood" in paper.tex) is the set of maximal planar graphs obtainable
from G by a single admissible edge flip: pick an edge uv whose two incident
triangular faces are uvw and uvx, delete uv, and insert wx, provided wx is not
already an edge.
We call G a *self-flip-neighbor* iff some admissible flip G^flip(uv) is
isomorphic to G --- equivalently, G in N(G). A flip always changes the labelled
edge set (it removes uv and adds a non-edge wx), so this is a genuine question
about the isomorphism type: it asks whether a single diagonal flip can map the
triangulation back onto a copy of itself.
This module enumerates every admissible flip of G, tests each resulting
triangulation for isomorphism to G, and reports the witnessing edges. It can run
on a single graph (given as a graph6 string, or the icosahedron by default) or
survey every min-degree-5 maximal planar graph over a range of orders.
"""
import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))) # repo root for `lib`
from typing import Iterator, Any, cast
from sage.all import Graph, graphs # type: ignore[attr-defined] # pylint: disable=no-name-in-module
# Reuse the flip machinery from the survey in this same directory.
from colored_edge_flip_class_survey import face_thirds, canonical_g6 # type: ignore[import]
def admissible_flips(g: Graph) -> Iterator[tuple[Any, Any, Any, Any, Graph]]:
"""Yield (u, v, w, x, H) for every admissible edge flip of g: uv is the
flipped edge, wx the inserted diagonal (a non-edge), and H = g^flip(uv)."""
pairs = face_thirds(g)
for u, v in list(g.edges(labels=False)):
thirds = pairs.get(frozenset((u, v)))
if thirds is None or len(thirds) != 2:
continue
w, x = thirds
if g.has_edge(w, x):
continue
h = g.copy()
h.delete_edge(u, v)
h.add_edge(w, x)
yield u, v, w, x, h
def self_flip_witnesses(g: Graph) -> list[tuple[Any, Any, Any, Any]]:
"""Return every (u, v, w, x) such that the admissible flip uv -> wx yields a
graph isomorphic to g. Non-empty iff g lies in its own flip neighborhood."""
target = canonical_g6(g)
witnesses: list[tuple[Any, Any, Any, Any]] = []
for u, v, w, x, h in admissible_flips(g):
if canonical_g6(h) == target:
witnesses.append((u, v, w, x))
return witnesses
def is_self_flip_neighbor(g: Graph) -> bool:
"""True iff g in N(g): some admissible flip of g is isomorphic to g."""
target = canonical_g6(g)
return any(canonical_g6(h) == target for *_e, h in admissible_flips(g))
def report_single(g: Graph) -> bool:
"""Print a per-edge flip report for g and return whether it self-flips."""
flips = list(admissible_flips(g))
witnesses = self_flip_witnesses(g)
print(f"graph6={g.graph6_string()} |V|={g.order()} |E|={g.size()} "
f"admissible flips={len(flips)} self-flip witnesses={len(witnesses)}")
for u, v, w, x in witnesses:
print(f" flip edge ({u},{v}) -> ({w},{x}) gives a graph isomorphic to G")
print(f" => G {'IS' if witnesses else 'is NOT'} in its own flip neighborhood")
return bool(witnesses)
def survey(min_order: int, max_order: int) -> None:
"""For each order in [min_order, max_order], count how many min-degree-5
maximal planar graphs are self-flip-neighbors."""
for n in range(min_order, max_order + 1):
gen = graphs.planar_graphs(
n, minimum_connectivity=3, maximum_face_size=3, minimum_degree=5
)
checked = 0
self_flip = 0
for g in gen:
checked += 1
if is_self_flip_neighbor(cast(Graph, g)):
self_flip += 1
print(f"order {n}: {checked} min-degree-5 maximal planar graphs, "
f"{self_flip} are self-flip-neighbors")
if __name__ == "__main__":
if len(sys.argv) >= 2 and sys.argv[1].lstrip("-").isdigit():
lo = int(sys.argv[1])
hi = int(sys.argv[2]) if len(sys.argv) > 2 else lo
survey(lo, hi)
else:
if len(sys.argv) >= 2:
graph = Graph(sys.argv[1])
else:
graph = graphs.IcosahedralGraph()
print("(no graph given; using the icosahedron)")
report_single(cast(Graph, graph))
+8 -4
View File
@@ -10,12 +10,16 @@
\newlabel{lem:edge-deletion-4colorable}{{4.2}{2}} \newlabel{lem:edge-deletion-4colorable}{{4.2}{2}}
\newlabel{lem:edge-deletion-coloring-structure}{{4.3}{3}} \newlabel{lem:edge-deletion-coloring-structure}{{4.3}{3}}
\newlabel{thm:flip-neighborhood-4colorable}{{4.4}{3}} \newlabel{thm:flip-neighborhood-4colorable}{{4.4}{3}}
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Case\nonbreakingspace 2 of the proof of Theorem\nonbreakingspace 4.4\hbox {}: $u, v$ share color $a$ and $w, x$ share color $c$. The $\{a, b\}$-Kempe path $P$ from $u$ to $v$ separates $w$ from $x$ in the plane, so no $\{c, d\}$-path between $w$ and $x$ can avoid crossing $P$; since the color sets $\{a, b\}$ and $\{c, d\}$ are disjoint, no such path exists.}}{4}{}\protected@file@percent }
\newlabel{fig:flip-proof-case-two}{{2}{4}}
\newlabel{thm:no-colored-class-contains-G}{{4.5}{4}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{5}{A computational aside: self-flip neighbors}}{4}{}\protected@file@percent }
\newlabel{def:self-flip-neighbor}{{5.1}{4}}
\newlabel{tocindent-1}{0pt} \newlabel{tocindent-1}{0pt}
\newlabel{tocindent0}{0pt} \newlabel{tocindent0}{0pt}
\newlabel{tocindent1}{17.77782pt} \newlabel{tocindent1}{17.77782pt}
\newlabel{tocindent2}{0pt} \newlabel{tocindent2}{0pt}
\newlabel{tocindent3}{0pt} \newlabel{tocindent3}{0pt}
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Case\nonbreakingspace 2 of the proof of Theorem\nonbreakingspace 4.4\hbox {}: $u, v$ share color $a$ and $w, x$ share color $c$. The $\{a, b\}$-Kempe path $P$ from $u$ to $v$ separates $w$ from $x$ in the plane, so no $\{c, d\}$-path between $w$ and $x$ can avoid crossing $P$; since the color sets $\{a, b\}$ and $\{c, d\}$ are disjoint, no such path exists.}}{4}{}\protected@file@percent } \@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Self-flip neighbors among min-degree-$5$ maximal planar graphs. No graph on $n \leq 15$ vertices is a self-flip neighbor; beyond the first occurrences the fraction declines steadily.}}{5}{}\protected@file@percent }
\newlabel{fig:flip-proof-case-two}{{2}{4}} \newlabel{tab:self-flip}{{1}{5}}
\newlabel{thm:no-colored-class-contains-G}{{4.5}{4}} \gdef \@abspage@last{5}
\gdef \@abspage@last{4}
@@ -1,5 +1,5 @@
# Fdb version 3 # Fdb version 3
["pdflatex"] 1778743331 "paper.tex" "paper.pdf" "paper" 1778743331 ["pdflatex"] 1781844089 "paper.tex" "paper.pdf" "paper" 1781844090
"/usr/local/texlive/2022/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" "/usr/local/texlive/2022/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 ""
"/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df "" "/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df ""
"/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm" 1246382020 988 bdf658c3bfc2d96d3c8b02cfc1c94c20 "" "/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm" 1246382020 988 bdf658c3bfc2d96d3c8b02cfc1c94c20 ""
@@ -131,8 +131,8 @@
"/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1647878959 4410336 7d30a02e9fa9a16d7d1f8d037ba69641 "" "/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1647878959 4410336 7d30a02e9fa9a16d7d1f8d037ba69641 ""
"/usr/local/texlive/2022/texmf-var/web2c/pdftex/pdflatex.fmt" 1665017617 2826443 7e98410c533054b636c6470db83a27bc "" "/usr/local/texlive/2022/texmf-var/web2c/pdftex/pdflatex.fmt" 1665017617 2826443 7e98410c533054b636c6470db83a27bc ""
"/usr/local/texlive/2022/texmf.cnf" 1647878952 577 209b46be99c9075fd74d4c0369380e8c "" "/usr/local/texlive/2022/texmf.cnf" 1647878952 577 209b46be99c9075fd74d4c0369380e8c ""
"paper.aux" 1778743331 1709 057e58fcb5472314b0a7029f2c0f7505 "pdflatex" "paper.aux" 1781844090 2204 9c1b0b970c8aeef1caf450ea82c0c00d "pdflatex"
"paper.tex" 1778743323 14730 0431b5dd1f68c135b8365d9286869b8f "" "paper.tex" 1781844079 17938 6757143b0e59891047a9dd2db3f626cf ""
(generated) (generated)
"paper.aux" "paper.aux"
"paper.log" "paper.log"
+33 -29
View File
@@ -1,4 +1,4 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 14 MAY 2026 03:22 This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 19 JUN 2026 00:41
entering extended mode entering extended mode
restricted \write18 enabled. restricted \write18 enabled.
%&-line parsing enabled. %&-line parsing enabled.
@@ -486,39 +486,43 @@ File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
e e
)) ))
[1{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [1{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
[2] [3] [4] (./paper.aux) ) [2] [3]
LaTeX Warning: `h' float specifier changed to `ht'.
[4] [5] (./paper.aux) )
Here is how much of TeX's memory you used: Here is how much of TeX's memory you used:
13206 strings out of 478268 13208 strings out of 478268
266409 string characters out of 5846347 266448 string characters out of 5846347
540812 words of memory out of 5000000 541829 words of memory out of 5000000
31041 multiletter control sequences out of 15000+600000 31043 multiletter control sequences out of 15000+600000
477211 words of font info for 59 fonts, out of 8000000 for 9000 477211 words of font info for 59 fonts, out of 8000000 for 9000
1302 hyphenation exceptions out of 8191 1302 hyphenation exceptions out of 8191
100i,9n,104p,495b,794s stack positions out of 10000i,1000n,20000p,200000b,200000s 100i,9n,104p,495b,794s stack positions out of 10000i,1000n,20000p,200000b,200000s
</usr/local/texlive/2022/texmf-dist/fonts/type1/publ </usr/local/texlive/2022/texmf-dist/fonts/type1/public/a
ic/amsfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publi msfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
c/amsfonts/cm/cmcsc10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publi sfonts/cm/cmcsc10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
c/amsfonts/cm/cmex10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public sfonts/cm/cmex10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ams
/amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ fonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsf
amsfonts/cm/cmmi5.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am onts/cm/cmmi5.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfon
sfonts/cm/cmmi7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsf ts/cm/cmmi7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts
onts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfon /cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/c
ts/cm/cmmi9.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts m/cmmi9.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/
/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/c cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cm
m/cmr6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/c r6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.
mr7.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/cmr8.pfb
.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr9.pf ></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr9.pfb></
b></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></u
></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb>< sr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr
/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></u /local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/l
sr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy9.pfb></usr ocal/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy9.pfb></usr/loc
/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/ al/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/loca
local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/lo l/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/local/
cal/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb> texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
Output written on paper.pdf (4 pages, 246274 bytes). Output written on paper.pdf (5 pages, 251916 bytes).
PDF statistics: PDF statistics:
120 PDF objects out of 1000 (max. 8388607) 123 PDF objects out of 1000 (max. 8388607)
73 compressed objects within 1 object stream 75 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000) 0 named destinations out of 1000 (max. 500000)
13 words of extra memory for PDF output out of 10000 (max. 10000000) 13 words of extra memory for PDF output out of 10000 (max. 10000000)
Binary file not shown.
@@ -371,6 +371,79 @@ in particular, $\varphi$ is a proper $4$-coloring of $H_k = G$. But
$\chi(G) \geq 5$ admits no such coloring, a contradiction. $\chi(G) \geq 5$ admits no such coloring, a contradiction.
\end{proof} \end{proof}
\section{A computational aside: self-flip neighbors}
Since $\mathcal{N}(G)$ is defined up to isomorphism, it is natural to
ask whether $G$ can be one of its own flip neighbors.
\begin{definition}[Self-flip neighbor]\label{def:self-flip-neighbor}
A maximal planar graph $G$ is a \emph{self-flip neighbor} if
$G \in \mathcal{N}(G)$; that is, if some admissible edge flip
$G^{\mathrm{flip}(uv)}$ is isomorphic to $G$.
\end{definition}
A single flip always changes the labelled edge set --- it deletes
$uv$ and inserts a non-edge $wx$ --- so the property is genuinely one
of the isomorphism type: it asks whether a diagonal flip can carry the
triangulation back onto a copy of itself. Equivalently, the degree
changes induced by the flip ($-1$ at $u$ and $v$, $+1$ at $w$ and $x$)
must be undone by an automorphism of the resulting graph.
We surveyed every maximal planar graph of minimum degree $5$ on
$n \leq 25$ vertices, counting those that are self-flip neighbors.
The results are recorded in Table~\ref{tab:self-flip}.
\begin{table}[h]
\centering
\begin{tabular}{rrrr}
\hline
$n$ & min-degree-$5$ & self-flip & fraction \\
& triangulations & neighbors & \\
\hline
$12$ & $1$ & $0$ & $0\%$ \\
$13$ & $0$ & $0$ & --- \\
$14$ & $1$ & $0$ & $0\%$ \\
$15$ & $1$ & $0$ & $0\%$ \\
$16$ & $3$ & $1$ & $33.3\%$ \\
$17$ & $4$ & $1$ & $25.0\%$ \\
$18$ & $12$ & $2$ & $16.7\%$ \\
$19$ & $23$ & $5$ & $21.7\%$ \\
$20$ & $73$ & $12$ & $16.4\%$ \\
$21$ & $192$ & $27$ & $14.1\%$ \\
$22$ & $651$ & $51$ & $7.8\%$ \\
$23$ & $2070$ & $120$ & $5.8\%$ \\
$24$ & $7290$ & $273$ & $3.7\%$ \\
$25$ & $25381$ & $598$ & $2.4\%$ \\
\hline
\end{tabular}
\caption{Self-flip neighbors among min-degree-$5$ maximal planar
graphs. No graph on $n \leq 15$ vertices is a self-flip neighbor;
beyond the first occurrences the fraction declines steadily.}
\label{tab:self-flip}
\end{table}
\begin{remark}
The proportion of self-flip neighbors declines as $n$ grows --- from a
peak near a third at $n = 16$ to roughly $2\%$ at $n = 25$ --- and the
trend is the one to expect. A self-flip neighbor requires a flip whose
induced degree changes are reversed by an automorphism of the flipped
graph, but min-degree-$5$ triangulations are asymptotically rigid: the
share with a nontrivial automorphism group, let alone one of the
required form, tends to $0$. The absolute count of self-flip neighbors
continues to grow, but ever more slowly than the census itself, so the
fraction appears to vanish in the limit.
This observation is not, by itself, useful for narrowing down the
minimal criminal $G_0$. Whether or not $G_0$ is a self-flip neighbor,
Theorem~\ref{thm:flip-neighborhood-4colorable} already shows every
graph in $\mathcal{N}(G_0)$ is $4$-colorable; self-flip neighborness
is a generic structural feature of the surrounding census rather than a
property forced on, or forbidden of, a minimum counterexample. It
neither includes nor excludes any candidate, and so contributes nothing
to the elimination program beyond confirming that the flip operation
behaves on min-degree-$5$ triangulations as one would anticipate.
\end{remark}
\end{document} \end{document}
%----------------------------------------------------------------------- %-----------------------------------------------------------------------