face_monochromatic_pairs: reframe Lemma 5.2 as a non-existence result
The previous statement "Heawood is constant on K through merged" was
strictly stronger than what the proof actually established without
Conjecture 5.3. Restate the lemma in the contrapositive direction:
If h_phi is constant on V(K), then no edge e in E(K) admits a face
F of G'^hat and edges e_1, e_2 on dF realising the clause-(3) arc
of Conjecture 5.1 at the endpoints of e.
Proof structure is mostly preserved (same F_R/F_L geometry, same case
split on phi(e) in {a, b}, same reading-off of cyclic colour orders).
The hypothesis "h_phi(v_0) != h_phi(v_1)" becomes "h_phi(v_0) =
h_phi(v_1)", which flips the conclusion: the same-coloured non-e
edges at v_0, v_1 land on opposite faces of e instead of the same
face. No dependency on Conjecture 5.3 or Theorem 4.X.
Redraw the figure to match the new lemma: both vertices labelled
h_phi = +1, both showing CW order (a, b, c), and the same-colour pair
(b-edges in Case A, a-edges in Case B) drawn on opposite sides of e.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1,17 +1,17 @@
|
||||
"""Two-panel illustration of the proof of Lemma 5.2
|
||||
(Heawood constant on Kempe cycles through merged).
|
||||
"""Two-panel illustration of the proof of Lemma 5.2 (a Heawood-constant
|
||||
Kempe cycle does not admit the clause-(3) arc of Conjecture 5.1).
|
||||
|
||||
Each panel shows two consecutive vertices v_0, v_1 on the {a, b}-Kempe
|
||||
cycle K, joined by an edge e, with h(v_0) = +1 (CW colour order (a, b, c))
|
||||
and h(v_1) = -1 (CW colour order (a, c, b)).
|
||||
cycle K, joined by an edge e, with h(v_0) = h(v_1) = +1: i.e., both
|
||||
have the same clockwise colour order (a, b, c). The would-be witness
|
||||
edges (b-edges in Case A, a-edges in Case B) lie on opposite sides of
|
||||
e, so no face of the graph contains both of them.
|
||||
|
||||
Left panel (Case A): phi(e) = a. The two b-edges at v_0, v_1 both lie on
|
||||
the same face F = F_R (right side of e); they form
|
||||
the witness (e_1, e_2).
|
||||
Left panel (Case A): phi(e) = a. The b-edges at v_0, v_1 are on
|
||||
opposite sides of e (one south, one north).
|
||||
|
||||
Right panel (Case B): phi(e) = b. The two a-edges at v_0, v_1 both lie
|
||||
on the same face F = F_L (left side of e); they
|
||||
form the witness (e_1, e_2).
|
||||
Right panel (Case B): phi(e) = b. The a-edges at v_0, v_1 are on
|
||||
opposite sides of e.
|
||||
|
||||
Produces fig_lemma_kempe_heawood.png.
|
||||
"""
|
||||
@@ -25,12 +25,12 @@ OUT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
DARK = '#374151'
|
||||
GRAY = '#9ca3af'
|
||||
|
||||
# Colour code matching earlier figures: a=red/orange, b=blue, c=green.
|
||||
COL_A = '#ea580c' # 'a'
|
||||
COL_B = '#2563eb' # 'b'
|
||||
COL_C = '#16a34a' # 'c'
|
||||
|
||||
FACE_FILL = '#fef3c7'
|
||||
FACE_FILL_R = '#fef3c7' # F_R shading (south)
|
||||
FACE_FILL_L = '#dbeafe' # F_L shading (north)
|
||||
|
||||
V0 = (-1.6, 0.0)
|
||||
V1 = ( 1.6, 0.0)
|
||||
@@ -62,7 +62,7 @@ def label_text(ax, p, text, color=DARK, fontsize=12, dx=0, dy=0,
|
||||
edgecolor='none', alpha=0.85))
|
||||
|
||||
|
||||
def label_edge_midpoint(ax, p, q, text, color, fontsize=11, offset=(0, 0)):
|
||||
def label_edge_midpoint(ax, p, q, text, color, fontsize=10, offset=(0, 0)):
|
||||
mid = ((p[0] + q[0]) / 2 + offset[0],
|
||||
(p[1] + q[1]) / 2 + offset[1])
|
||||
ax.text(mid[0], mid[1], text, ha='center', va='center',
|
||||
@@ -71,132 +71,122 @@ def label_edge_midpoint(ax, p, q, text, color, fontsize=11, offset=(0, 0)):
|
||||
edgecolor='none', alpha=0.9))
|
||||
|
||||
|
||||
def shade_face(ax, pts, color=FACE_FILL, alpha=0.7):
|
||||
def shade_face(ax, pts, color, alpha=0.55):
|
||||
poly = Polygon(pts, facecolor=color, edgecolor='none',
|
||||
alpha=alpha, zorder=1)
|
||||
ax.add_patch(poly)
|
||||
|
||||
|
||||
def panel_case_A(ax):
|
||||
# phi(e) = a. v_0 has CW order (a, b, c) starting from e at 0 deg:
|
||||
# e (a) at 0 deg, b-edge at 300 deg (southeast), c-edge at 120 deg
|
||||
# (northwest).
|
||||
# v_1 has CW order (a, c, b) starting from e at 180 deg:
|
||||
# e (a) at 180 deg, c-edge at 60 deg (northeast), b-edge at 240 deg
|
||||
# (south-southwest).
|
||||
e_color = COL_A
|
||||
# Other endpoints (stubs) of the non-e edges.
|
||||
b0 = edge_at(V0, -60) # b-edge at v_0, southeast
|
||||
c0 = edge_at(V0, 120) # c-edge at v_0, northwest
|
||||
c1 = edge_at(V1, 60) # c-edge at v_1, northeast
|
||||
b1 = edge_at(V1, 240) # b-edge at v_1, southwest
|
||||
# Same Heawood: v_0 and v_1 both have CW order (a, b, c) with e = a.
|
||||
# v_0: e at 0 deg (east), b at 300 deg (south), c at 60 deg (north).
|
||||
# v_1: e at 180 deg (west), b at 90 deg (north), c at 270 deg (south).
|
||||
# The b-edges land on opposite sides of e (south of v_0, north of v_1).
|
||||
b0 = edge_at(V0, 300) # south of v_0
|
||||
c0 = edge_at(V0, 60) # north of v_0
|
||||
b1 = edge_at(V1, 90) # north of v_1
|
||||
c1 = edge_at(V1, 270) # south of v_1
|
||||
|
||||
# Shade F_R = south face: vertices roughly (b0, V0, V1, b1) plus a
|
||||
# closing polygon below.
|
||||
shade_face(ax, [V0, V1, b1, (b1[0] + 0.2, b1[1] - 0.6),
|
||||
(b0[0] - 0.2, b0[1] - 0.6), b0])
|
||||
label_text(ax, ((V0[0] + V1[0]) / 2, -1.6), 'face $F$', color=DARK,
|
||||
fontsize=12, weight='bold')
|
||||
# Shade both F_R (south) and F_L (north) lightly.
|
||||
shade_face(ax, [V0, V1, c1, (c1[0] + 0.3, c1[1] - 0.6),
|
||||
(b0[0] - 0.3, b0[1] - 0.6), b0], color=FACE_FILL_R)
|
||||
shade_face(ax, [V0, c0, (c0[0] - 0.3, c0[1] + 0.6),
|
||||
(b1[0] + 0.3, b1[1] + 0.6), b1, V1], color=FACE_FILL_L)
|
||||
label_text(ax, ((V0[0] + V1[0]) / 2, -1.7), '$F_R$', color=DARK,
|
||||
fontsize=11, weight='bold')
|
||||
label_text(ax, ((V0[0] + V1[0]) / 2, 1.7), '$F_L$', color=DARK,
|
||||
fontsize=11, weight='bold')
|
||||
|
||||
# Edges
|
||||
draw_edge(ax, V0, V1, e_color) # e (color a)
|
||||
draw_edge(ax, V0, b0, COL_B) # b-edge at v_0
|
||||
draw_edge(ax, V0, c0, COL_C) # c-edge at v_0
|
||||
draw_edge(ax, V1, c1, COL_C) # c-edge at v_1
|
||||
draw_edge(ax, V1, b1, COL_B) # b-edge at v_1
|
||||
draw_edge(ax, V0, V1, COL_A)
|
||||
draw_edge(ax, V0, b0, COL_B)
|
||||
draw_edge(ax, V0, c0, COL_C)
|
||||
draw_edge(ax, V1, b1, COL_B)
|
||||
draw_edge(ax, V1, c1, COL_C)
|
||||
|
||||
# Vertices
|
||||
draw_vertex(ax, V0, DARK)
|
||||
draw_vertex(ax, V1, DARK)
|
||||
draw_vertex(ax, V0, DARK); draw_vertex(ax, V1, DARK)
|
||||
draw_stub(ax, b0); draw_stub(ax, c0)
|
||||
draw_stub(ax, c1); draw_stub(ax, b1)
|
||||
draw_stub(ax, b1); draw_stub(ax, c1)
|
||||
|
||||
# Labels
|
||||
label_text(ax, V0, '$v_0$', dy=0.28, fontsize=12)
|
||||
label_text(ax, (V0[0] - 0.05, V0[1] - 0.28), '$h_\\varphi\\!=\\!+1$',
|
||||
color=DARK, fontsize=9)
|
||||
label_text(ax, V1, '$v_1$', dy=0.28, fontsize=12)
|
||||
label_text(ax, (V1[0] + 0.05, V1[1] - 0.28), '$h_\\varphi\\!=\\!-1$',
|
||||
label_text(ax, (V1[0] + 0.05, V1[1] - 0.28), '$h_\\varphi\\!=\\!+1$',
|
||||
color=DARK, fontsize=9)
|
||||
|
||||
label_edge_midpoint(ax, V0, V1, '$e\\!=\\!a$', color=COL_A,
|
||||
offset=(0, 0.16))
|
||||
label_edge_midpoint(ax, V0, b0, '$e_1\\!=\\!b$', color=COL_B,
|
||||
offset=(-0.05, 0.05))
|
||||
offset=(0, 0.18))
|
||||
label_edge_midpoint(ax, V0, b0, '$b$', color=COL_B,
|
||||
offset=(-0.15, 0))
|
||||
label_edge_midpoint(ax, V0, c0, '$c$', color=COL_C,
|
||||
offset=(0.05, 0))
|
||||
offset=(-0.15, 0))
|
||||
label_edge_midpoint(ax, V1, b1, '$b$', color=COL_B,
|
||||
offset=(0.15, 0))
|
||||
label_edge_midpoint(ax, V1, c1, '$c$', color=COL_C,
|
||||
offset=(-0.05, 0))
|
||||
label_edge_midpoint(ax, V1, b1, '$e_2\\!=\\!b$', color=COL_B,
|
||||
offset=(0.05, 0.05))
|
||||
offset=(0.15, 0))
|
||||
|
||||
ax.set_title('Case A: $\\varphi(e) = a$. The two $b$-edges'
|
||||
' at $v_0, v_1$ lie on $\\partial F$',
|
||||
fontsize=11, color=DARK, pad=10, fontweight='bold')
|
||||
ax.set_title('Case A: $\\varphi(e) = a$. The two $b$-edges are on\n'
|
||||
'opposite sides of $e$ -- no common face',
|
||||
fontsize=11, color=DARK, pad=8, fontweight='bold')
|
||||
|
||||
|
||||
def panel_case_B(ax):
|
||||
# phi(e) = b. v_0 has CW order (a, b, c) with b = e at 0 deg:
|
||||
# a-edge at 60 deg (northeast), e (b) at 0 deg, c-edge at 300 deg
|
||||
# (southeast).
|
||||
# v_1 has CW order (a, c, b) with b = e at 180 deg:
|
||||
# a-edge at 60 deg (northeast), c-edge at 300 deg (southeast), e
|
||||
# (b) at 180 deg.
|
||||
e_color = COL_B
|
||||
a0 = edge_at(V0, 60) # a-edge at v_0, northeast
|
||||
c0 = edge_at(V0, -60) # c-edge at v_0, southeast
|
||||
a1 = edge_at(V1, 120) # a-edge at v_1, northwest
|
||||
c1 = edge_at(V1, 240) # c-edge at v_1, southwest
|
||||
# Same Heawood: v_0 and v_1 both have CW order (a, b, c) with e = b.
|
||||
# v_0: a at 60 deg (north), e (b) at 0 deg (east), c at 300 deg (south).
|
||||
# v_1: a at 270 deg (south), e (b) at 180 deg (west), c at 90 deg (north).
|
||||
# The a-edges land on opposite sides of e (north of v_0, south of v_1).
|
||||
a0 = edge_at(V0, 60) # north of v_0
|
||||
c0 = edge_at(V0, 300) # south of v_0
|
||||
a1 = edge_at(V1, 270) # south of v_1
|
||||
c1 = edge_at(V1, 90) # north of v_1
|
||||
|
||||
# Shade F_L = north face: a0, V0, V1, a1, plus a closing polygon above.
|
||||
shade_face(ax, [V0, a0, (a0[0] - 0.2, a0[1] + 0.6),
|
||||
(a1[0] + 0.2, a1[1] + 0.6), a1, V1])
|
||||
label_text(ax, ((V0[0] + V1[0]) / 2, 1.6), 'face $F$', color=DARK,
|
||||
fontsize=12, weight='bold')
|
||||
shade_face(ax, [V0, V1, a1, (a1[0] + 0.3, a1[1] - 0.6),
|
||||
(c0[0] - 0.3, c0[1] - 0.6), c0], color=FACE_FILL_R)
|
||||
shade_face(ax, [V0, a0, (a0[0] - 0.3, a0[1] + 0.6),
|
||||
(c1[0] + 0.3, c1[1] + 0.6), c1, V1], color=FACE_FILL_L)
|
||||
label_text(ax, ((V0[0] + V1[0]) / 2, -1.7), '$F_R$', color=DARK,
|
||||
fontsize=11, weight='bold')
|
||||
label_text(ax, ((V0[0] + V1[0]) / 2, 1.7), '$F_L$', color=DARK,
|
||||
fontsize=11, weight='bold')
|
||||
|
||||
# Edges
|
||||
draw_edge(ax, V0, V1, e_color)
|
||||
draw_edge(ax, V0, V1, COL_B)
|
||||
draw_edge(ax, V0, a0, COL_A)
|
||||
draw_edge(ax, V0, c0, COL_C)
|
||||
draw_edge(ax, V1, a1, COL_A)
|
||||
draw_edge(ax, V1, c1, COL_C)
|
||||
|
||||
# Vertices
|
||||
draw_vertex(ax, V0, DARK)
|
||||
draw_vertex(ax, V1, DARK)
|
||||
draw_vertex(ax, V0, DARK); draw_vertex(ax, V1, DARK)
|
||||
draw_stub(ax, a0); draw_stub(ax, c0)
|
||||
draw_stub(ax, a1); draw_stub(ax, c1)
|
||||
|
||||
# Labels
|
||||
label_text(ax, V0, '$v_0$', dy=0.28, fontsize=12)
|
||||
label_text(ax, (V0[0] - 0.05, V0[1] - 0.28), '$h_\\varphi\\!=\\!+1$',
|
||||
color=DARK, fontsize=9)
|
||||
label_text(ax, V1, '$v_1$', dy=0.28, fontsize=12)
|
||||
label_text(ax, (V1[0] + 0.05, V1[1] - 0.28), '$h_\\varphi\\!=\\!-1$',
|
||||
label_text(ax, (V1[0] + 0.05, V1[1] - 0.28), '$h_\\varphi\\!=\\!+1$',
|
||||
color=DARK, fontsize=9)
|
||||
|
||||
label_edge_midpoint(ax, V0, V1, '$e\\!=\\!b$', color=COL_B,
|
||||
offset=(0, -0.18))
|
||||
label_edge_midpoint(ax, V0, a0, '$e_1\\!=\\!a$', color=COL_A,
|
||||
offset=(-0.05, 0))
|
||||
label_edge_midpoint(ax, V0, a0, '$a$', color=COL_A,
|
||||
offset=(-0.15, 0))
|
||||
label_edge_midpoint(ax, V0, c0, '$c$', color=COL_C,
|
||||
offset=(0.05, 0))
|
||||
label_edge_midpoint(ax, V1, a1, '$e_2\\!=\\!a$', color=COL_A,
|
||||
offset=(0.05, 0))
|
||||
offset=(-0.15, 0))
|
||||
label_edge_midpoint(ax, V1, a1, '$a$', color=COL_A,
|
||||
offset=(0.15, 0))
|
||||
label_edge_midpoint(ax, V1, c1, '$c$', color=COL_C,
|
||||
offset=(-0.05, 0))
|
||||
offset=(0.15, 0))
|
||||
|
||||
ax.set_title('Case B: $\\varphi(e) = b$. The two $a$-edges'
|
||||
' at $v_0, v_1$ lie on $\\partial F$',
|
||||
fontsize=11, color=DARK, pad=10, fontweight='bold')
|
||||
ax.set_title('Case B: $\\varphi(e) = b$. The two $a$-edges are on\n'
|
||||
'opposite sides of $e$ -- no common face',
|
||||
fontsize=11, color=DARK, pad=8, fontweight='bold')
|
||||
|
||||
|
||||
def main():
|
||||
plt.rcParams['text.usetex'] = False # keep matplotlib defaults
|
||||
fig, axes = plt.subplots(1, 2, figsize=(13, 5.5))
|
||||
fig, axes = plt.subplots(1, 2, figsize=(13, 5.8))
|
||||
for ax in axes:
|
||||
ax.set_xlim(-3.5, 3.5)
|
||||
ax.set_ylim(-2.4, 2.4)
|
||||
ax.set_ylim(-2.5, 2.5)
|
||||
ax.set_aspect('equal')
|
||||
ax.axis('off')
|
||||
panel_case_A(axes[0])
|
||||
|
||||
Reference in New Issue
Block a user