diff --git a/papers/dual_decomposition_minimal_counterexamples/experiments/draw_chord_apex_proof.py b/papers/dual_decomposition_minimal_counterexamples/experiments/draw_chord_apex_proof.py new file mode 100644 index 0000000..b064fc6 --- /dev/null +++ b/papers/dual_decomposition_minimal_counterexamples/experiments/draw_chord_apex_proof.py @@ -0,0 +1,180 @@ +r"""Draw diagrams illustrating the proof of Lemma 2.6 (chord-apex). + +Three figures rendered on the dodecahedral G': + step1: the assumed proper 3-edge-colouring of \widehat{G}'_{v,0}, with the + v_n-edges receiving distinct colours X (red), Y (green, spike), + Z (blue), and the chord coloured W with W != Y, forcing W in {X, Z}. + step2: lift to G' in the case W = Z. The externals inherit + psi(f) = (X, Y, Z, Z, Z) and Lemma 2.4 completes partial F_v. + step3: lift to G' in the case W = X with psi(f) = (X, Y, Z, X, X). +""" +import os +import matplotlib.pyplot as plt +from matplotlib.lines import Line2D + +from reduced_dual import build_dual, apply_reduction + + +OUT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +C1 = '#dc2626' # red -> X +C2 = '#16a34a' # green -> Y (spike) +C3 = '#2563eb' # blue -> Z +DARK = '#374151' +DEG2 = '#f59e0b' +GRAY = '#9ca3af' +LIGHT = '#e5e7eb' +APEX_FILL = '#fef3c7' + + +def base_canvas(title): + fig, ax = plt.subplots(figsize=(8.5, 8.5)) + ax.set_aspect('equal') + ax.axis('off') + ax.set_title(title, fontsize=12) + return fig, ax + + +def draw_lift(ax, Gp, pos, A, B, other_surv, f_cols, e_cols, f_labels): + """G' with f_k and partial F_v boundary edges coloured; rest in light gray.""" + pentagon_edges = set() + for k in range(5): + pentagon_edges.add(frozenset((A[k], B[k]))) # f_k + pentagon_edges.add(frozenset((B[k], B[(k + 1) % 5]))) # boundary + for u, v in Gp.edges(): + if frozenset((u, v)) in pentagon_edges: + continue + (x0, y0), (x1, y1) = pos[u], pos[v] + ax.plot([x0, x1], [y0, y1], color=LIGHT, lw=1.2, zorder=1) + other = [v for v in other_surv if v not in A and v not in B] + xs = [pos[v][0] for v in other] + ys = [pos[v][1] for v in other] + ax.scatter(xs, ys, s=50, color=LIGHT, zorder=2) + for k, v in enumerate(A): + ax.scatter(*pos[v], s=240, color=DEG2, edgecolors='black', + linewidths=0.8, zorder=4) + ax.annotate(f'$A_{k}$', (pos[v][0] * 1.18, pos[v][1] * 1.18), + ha='center', va='center', fontsize=12, color='#a16207', + zorder=5) + for k, v in enumerate(B): + ax.scatter(*pos[v], s=160, color='white', edgecolors=DARK, + linewidths=1.2, zorder=4) + ax.annotate(f'$B_{k}$', (pos[v][0] * 0.62, pos[v][1] * 0.62), + ha='center', va='center', fontsize=11, color=DARK, + zorder=5) + for k in range(5): + (x0, y0), (x1, y1) = pos[B[k]], pos[A[k]] + ax.plot([x0, x1], [y0, y1], color=f_cols[k], lw=3.2, zorder=3) + mx, my = 0.55 * x0 + 0.45 * x1, 0.55 * y0 + 0.45 * y1 + ax.annotate(f_labels[k], (mx, my), fontsize=10, color=f_cols[k], + fontweight='bold', ha='center', va='center', zorder=7, + bbox=dict(boxstyle='round,pad=0.15', fc='white', + ec=f_cols[k], lw=0.5)) + for k in range(5): + (x0, y0), (x1, y1) = pos[B[k]], pos[B[(k + 1) % 5]] + ax.plot([x0, x1], [y0, y1], color=e_cols[k], lw=3.2, zorder=3) + + +def main(): + Gp, pos, Fv = build_dual() + res = apply_reduction(Gp, pos, Fv, i=0) + npos, A = res['pos'], res['A'] + v_n, apex_nbrs, chord = res['v_n'], res['apex_nbrs'], res['chord'] + + a_pair = {} + for u in A: + for nbr in Gp.neighbors(u): + if nbr in Fv: + a_pair[u] = nbr + break + B = [a_pair[A[k]] for k in range(5)] + + survivors = [v for v in Gp if v not in Fv] + surv_set = set(survivors) + surv_edges = [(u, v) for u, v in Gp.edges() + if u in surv_set and v in surv_set] + other_surv = [v for v in survivors if v not in A] + + # ----- Step 1: assumed colouring of the reduced dual ----- + fig, ax = base_canvas( + "Step 1: $\\varphi$ on $\\widehat{G}'_{v,0}$ assigns distinct colours " + "$X, Y, Z$ to the $v_n$-edges (propriety at $v_n$);\n" + "by hypothesis $W \\neq Y$, forcing $W \\in \\{X, Z\\}$.") + for u, v in surv_edges: + (x0, y0), (x1, y1) = pos[u], pos[v] + ax.plot([x0, x1], [y0, y1], color=GRAY, lw=1.4, zorder=1) + xs = [pos[v][0] for v in other_surv] + ys = [pos[v][1] for v in other_surv] + ax.scatter(xs, ys, s=80, color=DARK, zorder=3) + for k, v in enumerate(A): + ax.scatter(*pos[v], s=240, color=DEG2, edgecolors='black', + linewidths=0.8, zorder=4) + ax.annotate(f'$A_{k}$', (pos[v][0] * 1.18, pos[v][1] * 1.18), + ha='center', va='center', fontsize=12, color='#a16207', + zorder=5) + for k, (color, lbl) in enumerate([(C1, '$X$'), (C2, '$Y$'), (C3, '$Z$')]): + u = A[k] + (x0, y0), (x1, y1) = npos[v_n], pos[u] + ax.plot([x0, x1], [y0, y1], color=color, lw=3.4, zorder=5) + mx, my = 0.5 * x1 + 0.5 * x0, 0.5 * y1 + 0.5 * y0 + ax.annotate(lbl, (mx, my), fontsize=12, color=color, fontweight='bold', + ha='center', va='center', zorder=7, + bbox=dict(boxstyle='round,pad=0.18', fc='white', ec=color, + lw=0.6)) + ax.scatter(*npos[v_n], s=300, color=APEX_FILL, marker='s', + edgecolors='black', linewidths=1.0, zorder=6) + ax.annotate('$v_n$', npos[v_n], textcoords='offset points', xytext=(0, 14), + ha='center', fontsize=12, fontweight='bold', color=DARK, + zorder=7) + (x0, y0), (x1, y1) = pos[chord[0]], pos[chord[1]] + ax.plot([x0, x1], [y0, y1], color=DARK, lw=2.4, ls='--', zorder=5) + mx, my = (x0 + x1) / 2, (y0 + y1) / 2 + ax.annotate('$W$', (mx, my), fontsize=12, color=DARK, fontweight='bold', + ha='center', va='center', zorder=7, + bbox=dict(boxstyle='round,pad=0.18', fc='white', ec=DARK, + lw=0.6)) + ax.legend(handles=[ + Line2D([0], [0], color=C1, lw=3, label='$X$ (side)'), + Line2D([0], [0], color=C2, lw=3, label='$Y$ (spike)'), + Line2D([0], [0], color=C3, lw=3, label='$Z$ (side)'), + Line2D([0], [0], color=DARK, lw=2, ls='--', + label='$W$ (merged), $W \\neq Y$'), + ], loc='upper left', fontsize=10) + fig.savefig(os.path.join(OUT_DIR, 'fig_chord_apex_step1.png'), + dpi=170, bbox_inches='tight') + plt.close(fig) + + cases = [ + dict( + title=("Step 2: lift to $G'$ when $W = Z$. The externals inherit " + "$\\psi(f) = (X, Y, Z, Z, Z)$;\n" + "Lemma 2.4 colours the five edges of $\\partial F_v$."), + f_cols=[C1, C2, C3, C3, C3], + e_cols=[C3, C1, C2, C1, C2], + f_labels=['$X$', '$Y$', '$Z$', '$Z$', '$Z$'], + out='fig_chord_apex_step2.png', + ), + dict( + title=("Step 3: lift to $G'$ when $W = X$. The externals inherit " + "$\\psi(f) = (X, Y, Z, X, X)$;\n" + "Lemma 2.4 colours the five edges of $\\partial F_v$."), + f_cols=[C1, C2, C3, C1, C1], + e_cols=[C3, C1, C2, C3, C2], + f_labels=['$X$', '$Y$', '$Z$', '$X$', '$X$'], + out='fig_chord_apex_step3.png', + ), + ] + + for case in cases: + fig, ax = base_canvas(case['title']) + draw_lift(ax, Gp, pos, A, B, other_surv, + case['f_cols'], case['e_cols'], case['f_labels']) + fig.savefig(os.path.join(OUT_DIR, case['out']), + dpi=170, bbox_inches='tight') + plt.close(fig) + + print(f"wrote fig_chord_apex_step{{1,2,3}}.png to {OUT_DIR}") + + +if __name__ == '__main__': + main() diff --git a/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step1.png b/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step1.png new file mode 100644 index 0000000..833eae1 Binary files /dev/null and b/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step1.png differ diff --git a/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step2.png b/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step2.png new file mode 100644 index 0000000..84eedc2 Binary files /dev/null and b/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step2.png differ diff --git a/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step3.png b/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step3.png new file mode 100644 index 0000000..c57861d Binary files /dev/null and b/papers/dual_decomposition_minimal_counterexamples/fig_chord_apex_step3.png differ diff --git a/papers/dual_decomposition_minimal_counterexamples/paper.aux b/papers/dual_decomposition_minimal_counterexamples/paper.aux index 67bb3a4..7fd54d6 100644 --- a/papers/dual_decomposition_minimal_counterexamples/paper.aux +++ b/papers/dual_decomposition_minimal_counterexamples/paper.aux @@ -9,10 +9,12 @@ \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces The four steps of Definition\nonbreakingspace 2.1\hbox {}, illustrated on $G' = $ the dodecahedron (dual of the icosahedron) with $F_v$ the inner pentagon and $i = 0$. Top left: delete the five boundary vertices of $F_v$, leaving five degree-$2$ vertices on a new face $F$. Top right: order them clockwise as $A_0,\dots ,A_4$. Bottom left: add $v_n$ joined to $A_0, A_1, A_2$. Bottom right: add the chord $A_3 A_4$, giving the cubic plane graph $\setbox \z@ \hbox {\mathsurround \z@ $\textstyle G$}\mathaccent "0362{G}'_{v,0}$.}}{3}{}\protected@file@percent } \newlabel{fig:reduced-dual-steps}{{1}{3}} \newlabel{lem:pentagonal-externals}{{2.4}{3}} +\newlabel{lem:chord-apex}{{2.6}{4}} +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces The proof of Lemma\nonbreakingspace 2.6\hbox {}, illustrated for $i = 0$ on $G' = $ the dodecahedron. Top: under the assumption $W \neq Y$, propriety at $v_n$ forces $W \in \{X, Z\}$. Bottom: in either case the lift to $G'$ has externals satisfying the hypothesis of Lemma\nonbreakingspace 2.4\hbox {}, which colours $\partial F_v$ to extend $\psi $ to a proper $3$-edge-colouring of $G'$.}}{5}{}\protected@file@percent } +\newlabel{fig:chord-apex-proof}{{2}{5}} \newlabel{tocindent-1}{0pt} \newlabel{tocindent0}{0pt} \newlabel{tocindent1}{17.77782pt} \newlabel{tocindent2}{0pt} \newlabel{tocindent3}{0pt} -\newlabel{lem:chord-apex}{{2.6}{4}} -\gdef \@abspage@last{4} +\gdef \@abspage@last{6} diff --git a/papers/dual_decomposition_minimal_counterexamples/paper.log b/papers/dual_decomposition_minimal_counterexamples/paper.log index fd066d5..ce6f332 100644 --- a/papers/dual_decomposition_minimal_counterexamples/paper.log +++ b/papers/dual_decomposition_minimal_counterexamples/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) 22 MAY 2026 20:19 +This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 22 MAY 2026 20:45 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -222,33 +222,54 @@ Package pdftex.def Info: fig_reduced_dual_step4.png used on input line 166. LaTeX Warning: `h' float specifier changed to `ht'. [2] [3 <./fig_reduced_dual_step1.png> <./fig_reduced_dual_step2.png> <./fig_red -uced_dual_step3.png> <./fig_reduced_dual_step4.png>] [4] (./paper.aux) ) +uced_dual_step3.png> <./fig_reduced_dual_step4.png>] + +File: fig_chord_apex_step1.png Graphic file (type png) + +Package pdftex.def Info: fig_chord_apex_step1.png used on input line 286. +(pdftex.def) Requested size: 251.9989pt x 250.5104pt. + +File: fig_chord_apex_step2.png Graphic file (type png) + +Package pdftex.def Info: fig_chord_apex_step2.png used on input line 287. +(pdftex.def) Requested size: 172.79846pt x 176.08986pt. + +File: fig_chord_apex_step3.png Graphic file (type png) + +Package pdftex.def Info: fig_chord_apex_step3.png used on input line 288. +(pdftex.def) Requested size: 172.79846pt x 176.08986pt. + + +LaTeX Warning: `h' float specifier changed to `ht'. + +[4] [5 <./fig_chord_apex_step1.png> <./fig_chord_apex_step2.png> <./fig_chord_a +pex_step3.png>] [6] (./paper.aux) ) Here is how much of TeX's memory you used: - 3020 strings out of 478268 - 42520 string characters out of 5846347 - 343128 words of memory out of 5000000 - 21064 multiletter control sequences out of 15000+600000 + 3042 strings out of 478268 + 43139 string characters out of 5846347 + 343136 words of memory out of 5000000 + 21083 multiletter control sequences out of 15000+600000 476364 words of font info for 55 fonts, out of 8000000 for 9000 1302 hyphenation exceptions out of 8191 69i,8n,76p,664b,298s stack positions out of 10000i,1000n,20000p,200000b,200000s - -Output written on paper.pdf (4 pages, 501796 bytes). + +Output written on paper.pdf (6 pages, 750077 bytes). PDF statistics: - 91 PDF objects out of 1000 (max. 8388607) - 50 compressed objects within 1 object stream + 103 PDF objects out of 1000 (max. 8388607) + 54 compressed objects within 1 object stream 0 named destinations out of 1000 (max. 500000) - 21 words of extra memory for PDF output out of 10000 (max. 10000000) + 36 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/papers/dual_decomposition_minimal_counterexamples/paper.pdf b/papers/dual_decomposition_minimal_counterexamples/paper.pdf index 1ab4c4e..188ee4a 100644 Binary files a/papers/dual_decomposition_minimal_counterexamples/paper.pdf and b/papers/dual_decomposition_minimal_counterexamples/paper.pdf differ diff --git a/papers/dual_decomposition_minimal_counterexamples/paper.tex b/papers/dual_decomposition_minimal_counterexamples/paper.tex index b1a2efb..627a8c3 100644 --- a/papers/dual_decomposition_minimal_counterexamples/paper.tex +++ b/papers/dual_decomposition_minimal_counterexamples/paper.tex @@ -281,20 +281,71 @@ $\widehat{G}'_{v,i}$, the merged edge and the spike edge receive the same colour. \end{lemma} +\begin{figure}[h] +\centering +\includegraphics[width=0.7\textwidth]{fig_chord_apex_step1.png}\\[0.4em] +\includegraphics[width=0.48\textwidth]{fig_chord_apex_step2.png}\hfill +\includegraphics[width=0.48\textwidth]{fig_chord_apex_step3.png} +\caption{The proof of Lemma~\ref{lem:chord-apex}, illustrated for $i = 0$ on +$G' = $ the dodecahedron. Top: under the assumption $W \neq Y$, propriety at +$v_n$ forces $W \in \{X, Z\}$. Bottom: in either case the lift to $G'$ has +externals satisfying the hypothesis of +Lemma~\ref{lem:pentagonal-externals}, which colours $\partial F_v$ to extend +$\psi$ to a proper $3$-edge-colouring of $G'$.} +\label{fig:chord-apex-proof} +\end{figure} + \begin{proof} -% TODO. Intended argument: given a proper 3-edge-colouring of -% \widehat{G}'_{v,i}, the colour at each A_k of the new edge there (one of the -% three v_n-edges for k in {i, i+1, i+2}, or the chord for k in {i+3, i+4}) -% determines the colour of f_k in any lift to G' --- it is the unique colour -% not used by the two original edges at A_k. Because the chord has a single -% colour, f_{i+3} and f_{i+4} agree. If the merged edge and the spike edge -% receive distinct colours, the three v_n-edges contribute three distinct -% colours to f_i, f_{i+1}, f_{i+2}, and the resulting f-vector has shape -% (X, Y, Z, W, W) with X, Y, Z distinct and W \neq Y. By -% Lemma~\ref{lem:pentagonal-externals} applied to G' at the face F_v, this -% extends to a proper 3-edge-colouring of G' --- contradicting that G' (the -% dual of the minimal counterexample G) is not 3-edge-colourable. Hence the -% merged edge and the spike edge must share a colour. +After cyclically relabelling, assume $i = 0$. Suppose for contradiction that +$\varphi$ is a proper $3$-edge-colouring of $\widehat{G}'_{v,0}$ in which the +merged edge $\{A_3, A_4\}$ and the spike edge $\{A_1, v_n\}$ receive different +colours (Figure~\ref{fig:chord-apex-proof}, top), and write +\[ + X = \varphi(\{A_0, v_n\}), \quad + Y = \varphi(\{A_1, v_n\}), \quad + Z = \varphi(\{A_2, v_n\}), \quad + W = \varphi(\{A_3, A_4\}). +\] +Propriety of $\varphi$ at $v_n$ forces $\{X, Y, Z\} = \{1, 2, 3\}$, and the +assumption $W \neq Y$ leaves $W \in \{X, Z\}$. + +We lift $\varphi$ to a colouring $\psi$ of $E(G')$ as follows. Let +$B_0, \dots, B_4$ be the boundary vertices of $\partial F_v$ in $G'$, indexed +so that $f_k = B_k A_k$. On every edge of $G'$ that survived the reduction, +set $\psi = \varphi$. At each $A_k$ the two surviving edges retain their +$\varphi$-colours, so the remaining edge at $A_k$ --- in $G'$ this is the +external $f_k$; in $\widehat{G}'_{v,0}$ this is a $v_n$-edge ($k \in +\{0, 1, 2\}$) or the chord ($k \in \{3, 4\}$) --- is forced to take the third +colour at $A_k$. Since the two-surviving-edge colours at $A_k$ agree in $G'$ +and $\widehat{G}'_{v,0}$, the third colour does too, giving +\[ + \psi(f_0) = X, \quad \psi(f_1) = Y, \quad \psi(f_2) = Z, \quad + \psi(f_3) = \psi(f_4) = W +\] +(the last two equalities holding because the chord is a single edge contributing +its colour at each of $A_3$ and $A_4$). + +It remains to assign colours to the five boundary edges $B_k B_{k+1}$ of +$\partial F_v$. Apply Lemma~\ref{lem:pentagonal-externals} to $G'$ at the face +$F_v$ with the $B_k$'s as its boundary vertices and the same indexing. The +external vector $(\psi(f_0), \dots, \psi(f_4)) = (X, Y, Z, W, W)$ falls into +one of two cases (Figure~\ref{fig:chord-apex-proof}, bottom): +\begin{itemize} + \item if $W = Z$, it is $(X, Y, Z, Z, Z)$: three consecutive $Z$'s at + positions $2, 3, 4$, with $\{X, Y\} = \{1, 2, 3\} \setminus \{Z\}$; + \item if $W = X$, it is $(X, Y, Z, X, X)$: three consecutive $X$'s at + positions $3, 4, 0$, with $\{Y, Z\} = \{1, 2, 3\} \setminus \{X\}$. +\end{itemize} +Each case satisfies the hypothesis of Lemma~\ref{lem:pentagonal-externals}; +its $(\Leftarrow)$ direction therefore assigns colours to the boundary edges +$B_k B_{k+1}$ that make $\psi$ proper at every $B_k$. + +The resulting $\psi$ is a proper $3$-edge-colouring of $G'$: proper at every +$B_k$ by the lemma, at every $A_k$ by the construction, and at every other +vertex because such a vertex has the same neighbourhood in $G'$ as in +$\widehat{G}'_{v,0}$ with the same incident-edge colours. By Tait's theorem, +$G'$ is $3$-edge-colourable iff $G$ is $4$-vertex-colourable, contradicting +that $G$ is a counterexample. The assumption $W \neq Y$ is therefore false. \end{proof} \end{document}