diff --git a/papers/colored_edge_flip_classes/experiments/self_flip_neighbor.py b/papers/colored_edge_flip_classes/experiments/self_flip_neighbor.py new file mode 100644 index 0000000..e81d2e9 --- /dev/null +++ b/papers/colored_edge_flip_classes/experiments/self_flip_neighbor.py @@ -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)) diff --git a/papers/colored_edge_flip_classes/paper.aux b/papers/colored_edge_flip_classes/paper.aux index 31d94f6..1cc9257 100644 --- a/papers/colored_edge_flip_classes/paper.aux +++ b/papers/colored_edge_flip_classes/paper.aux @@ -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} diff --git a/papers/colored_edge_flip_classes/paper.fdb_latexmk b/papers/colored_edge_flip_classes/paper.fdb_latexmk index ad32bcd..65559a0 100644 --- a/papers/colored_edge_flip_classes/paper.fdb_latexmk +++ b/papers/colored_edge_flip_classes/paper.fdb_latexmk @@ -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" diff --git a/papers/colored_edge_flip_classes/paper.log b/papers/colored_edge_flip_classes/paper.log index ede1621..85a3d23 100644 --- a/papers/colored_edge_flip_classes/paper.log +++ b/papers/colored_edge_flip_classes/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/public/amsfonts/cm/cmsy8.pfb> -Output written on paper.pdf (4 pages, 246274 bytes). + +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) diff --git a/papers/colored_edge_flip_classes/paper.pdf b/papers/colored_edge_flip_classes/paper.pdf index 296f478..00fb182 100644 Binary files a/papers/colored_edge_flip_classes/paper.pdf and b/papers/colored_edge_flip_classes/paper.pdf differ diff --git a/papers/colored_edge_flip_classes/paper.tex b/papers/colored_edge_flip_classes/paper.tex index 5d6f9d0..7d0939d 100644 --- a/papers/colored_edge_flip_classes/paper.tex +++ b/papers/colored_edge_flip_classes/paper.tex @@ -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} %-----------------------------------------------------------------------