face_monochromatic_pairs: strengthen Conj 5.5 to face-length ≥ 5, find 28-vertex counterexample
- Paper: Conjecture 5.5 restated with the hypothesis that every face
of H has length ≥ 5 (= the cubic plane analogue of "no triangles
or quadrilaterals as faces"). This kills K_4 and the n=8 trivial
counterexamples (girth 3) and the ad-hoc n=40 counterexample
(which has 2 triangles and 4 quadrilaterals). A new remark catalogues
these excluded counterexamples and the smallest cubic plane graphs
satisfying the hypothesis (dodecahedron at |V| = 20).
- search_smaller_counterexample.py: --min-face=N option to filter
cubic planar graphs by minimum face length.
- search_min_face5_counterexample.py: enumerates triangulations T
with min degree ≥ 5 via graphs.triangulations(n, minimum_degree=5),
takes planar dual (= cubic plane with all faces ≥ 5), and runs the
Heawood-constancy check.
- Result: smallest counterexample at triangulation order n_T = 16,
whose dual is a 28-vertex cubic plane graph (graph6
[kG[A?_A?_?_?K?D?@_CO?o?@_??A??@C??O??AG?C????`???a???W???A_???F).
Faces: 12 pentagons + 4 hexagons (a C28 fullerene). Both
K_{red, blue} and K_{red, green} are 12-cycles sharing the
colour-red edge (0, 1) and both have h_φ ≡ -1. 8 of 28 vertices
lie outside V(K_0) ∪ V(K_1).
- verify_28_vertex_counterexample.py: reproduces the counterexample,
verifies all properties, and renders figures/min-face-5-counterexample.png.
Note on the boundary: face-length ≥ 6 is impossible for cubic plane
graphs by Euler (6F = 6(V/2 + 2) > 3V = sum face lengths for V > 4).
So face-length ≥ 5 is the strongest face-length restriction admitting
any cubic plane graphs at all.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -146,19 +146,45 @@ def check_graph(G):
|
||||
return None
|
||||
|
||||
|
||||
def min_face_length(G):
|
||||
"""Min face length of G in its current planar embedding."""
|
||||
return min(len(f) for f in G.faces())
|
||||
|
||||
|
||||
def main():
|
||||
args = [a for a in sys.argv[1:] if not a.startswith('--')]
|
||||
max_n = int(args[0]) if args else 18
|
||||
flag_all = '--all' in sys.argv[1:]
|
||||
# Parse --min-face N
|
||||
min_face = None
|
||||
for i, a in enumerate(sys.argv[1:]):
|
||||
if a == '--min-face' and i + 1 < len(sys.argv) - 1:
|
||||
min_face = int(sys.argv[i + 2])
|
||||
break
|
||||
if a.startswith('--min-face='):
|
||||
min_face = int(a.split('=', 1)[1])
|
||||
break
|
||||
|
||||
print(f"Searching for cubic plane graph counterexamples to "
|
||||
f"Conjecture 5.5, n in [4, {max_n}] "
|
||||
f"({'continuing past first hit' if flag_all else 'stopping at first hit'})\n")
|
||||
f"({'continuing past first hit' if flag_all else 'stopping at first hit'})"
|
||||
+ (f", min face length >= {min_face}" if min_face else "")
|
||||
+ "\n")
|
||||
|
||||
# If filtering by min face length, skip small n where impossible.
|
||||
# For all-faces-length->=L cubic plane: V - E + F = 2, E = 3V/2,
|
||||
# sum face lengths = 3V, F = V/2 + 2, so min sum = L*(V/2 + 2)
|
||||
# <= 3V gives V >= 2L*(L-3)/(3-L/2)... let's just set V >= 20 for L=5.
|
||||
if min_face is not None and min_face >= 5:
|
||||
n_start = max(4, 20)
|
||||
else:
|
||||
n_start = 4
|
||||
|
||||
first_found = None
|
||||
for n in range(4, max_n + 1, 2): # cubic requires n even
|
||||
for n in range(n_start, max_n + 1, 2): # cubic requires n even
|
||||
start = time.time()
|
||||
count = 0
|
||||
skipped = 0
|
||||
found = None
|
||||
try:
|
||||
gen = graphs.planar_graphs(
|
||||
@@ -172,6 +198,11 @@ def main():
|
||||
for G in gen:
|
||||
if max(G.degree()) != 3:
|
||||
continue # not cubic
|
||||
if min_face is not None:
|
||||
G.is_planar(set_embedding=True)
|
||||
if min_face_length(G) < min_face:
|
||||
skipped += 1
|
||||
continue
|
||||
count += 1
|
||||
res = check_graph(G)
|
||||
if res is not None:
|
||||
@@ -180,8 +211,10 @@ def main():
|
||||
break
|
||||
elapsed = time.time() - start
|
||||
if found is None:
|
||||
print(f"n={n:>3}: checked {count} graphs, no counterexample "
|
||||
f"[{elapsed:.1f}s]")
|
||||
extra = (f", skipped {skipped} due to small face"
|
||||
if min_face is not None else "")
|
||||
print(f"n={n:>3}: checked {count} graphs, no counterexample"
|
||||
f"{extra} [{elapsed:.1f}s]")
|
||||
else:
|
||||
G, (col, K0, K1, h0, h1, a, b, c, e) = found
|
||||
colour_name = {0: 'red', 1: 'blue', 2: 'green'}
|
||||
|
||||
Reference in New Issue
Block a user