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:
@@ -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))
|
||||
@@ -10,12 +10,16 @@
|
||||
\newlabel{lem:edge-deletion-4colorable}{{4.2}{2}}
|
||||
\newlabel{lem:edge-deletion-coloring-structure}{{4.3}{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{tocindent0}{0pt}
|
||||
\newlabel{tocindent1}{17.77782pt}
|
||||
\newlabel{tocindent2}{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 }
|
||||
\newlabel{fig:flip-proof-case-two}{{2}{4}}
|
||||
\newlabel{thm:no-colored-class-contains-G}{{4.5}{4}}
|
||||
\gdef \@abspage@last{4}
|
||||
\@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{tab:self-flip}{{1}{5}}
|
||||
\gdef \@abspage@last{5}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 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/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 ""
|
||||
@@ -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/web2c/pdftex/pdflatex.fmt" 1665017617 2826443 7e98410c533054b636c6470db83a27bc ""
|
||||
"/usr/local/texlive/2022/texmf.cnf" 1647878952 577 209b46be99c9075fd74d4c0369380e8c ""
|
||||
"paper.aux" 1778743331 1709 057e58fcb5472314b0a7029f2c0f7505 "pdflatex"
|
||||
"paper.tex" 1778743323 14730 0431b5dd1f68c135b8365d9286869b8f ""
|
||||
"paper.aux" 1781844090 2204 9c1b0b970c8aeef1caf450ea82c0c00d "pdflatex"
|
||||
"paper.tex" 1781844079 17938 6757143b0e59891047a9dd2db3f626cf ""
|
||||
(generated)
|
||||
"paper.aux"
|
||||
"paper.log"
|
||||
|
||||
@@ -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
|
||||
restricted \write18 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
|
||||
))
|
||||
[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:
|
||||
13206 strings out of 478268
|
||||
266409 string characters out of 5846347
|
||||
540812 words of memory out of 5000000
|
||||
31041 multiletter control sequences out of 15000+600000
|
||||
13208 strings out of 478268
|
||||
266448 string characters out of 5846347
|
||||
541829 words of memory out of 5000000
|
||||
31043 multiletter control sequences out of 15000+600000
|
||||
477211 words of font info for 59 fonts, out of 8000000 for 9000
|
||||
1302 hyphenation exceptions out of 8191
|
||||
100i,9n,104p,495b,794s stack positions out of 10000i,1000n,20000p,200000b,200000s
|
||||
</usr/local/texlive/2022/texmf-dist/fonts/type1/publ
|
||||
ic/amsfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publi
|
||||
c/amsfonts/cm/cmcsc10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publi
|
||||
c/amsfonts/cm/cmex10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public
|
||||
/amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/
|
||||
amsfonts/cm/cmmi5.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
|
||||
sfonts/cm/cmmi7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsf
|
||||
onts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfon
|
||||
ts/cm/cmmi9.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts
|
||||
/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/c
|
||||
m/cmr6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/c
|
||||
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/cmr9.pf
|
||||
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/cmsy7.pfb><
|
||||
/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></u
|
||||
sr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy9.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/cmti8.pfb></usr/lo
|
||||
cal/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
|
||||
Output written on paper.pdf (4 pages, 246274 bytes).
|
||||
</usr/local/texlive/2022/texmf-dist/fonts/type1/public/a
|
||||
msfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
|
||||
sfonts/cm/cmcsc10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
|
||||
sfonts/cm/cmex10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ams
|
||||
fonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsf
|
||||
onts/cm/cmmi5.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfon
|
||||
ts/cm/cmmi7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts
|
||||
/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/c
|
||||
m/cmmi9.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/
|
||||
cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cm
|
||||
r6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.
|
||||
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/cmr9.pfb></
|
||||
usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></u
|
||||
sr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr
|
||||
/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/l
|
||||
ocal/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy9.pfb></usr/loc
|
||||
al/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/loca
|
||||
l/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/local/
|
||||
texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
|
||||
Output written on paper.pdf (5 pages, 251916 bytes).
|
||||
PDF statistics:
|
||||
120 PDF objects out of 1000 (max. 8388607)
|
||||
73 compressed objects within 1 object stream
|
||||
123 PDF objects out of 1000 (max. 8388607)
|
||||
75 compressed objects within 1 object stream
|
||||
0 named destinations out of 1000 (max. 500000)
|
||||
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.
|
||||
\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}
|
||||
|
||||
%-----------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user