Skip to content

Commit 704efa4

Browse files
committed
feat: lemmas about parity and Nat.antidiagonal (#6540)
1 parent 1377815 commit 704efa4

File tree

4 files changed

+81
-11
lines changed

4 files changed

+81
-11
lines changed

Mathlib/Algebra/GroupPower/Ring.lean

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,6 @@ theorem neg_pow (a : R) (n : ℕ) : (-a) ^ n = (-1) ^ n * a ^ n :=
201201
section
202202
set_option linter.deprecated false
203203

204-
@[simp]
205204
theorem neg_pow_bit0 (a : R) (n : ℕ) : (-a) ^ bit0 n = a ^ bit0 n := by
206205
rw [pow_bit0', neg_mul_neg, pow_bit0']
207206
#align neg_pow_bit0 neg_pow_bit0
@@ -213,7 +212,6 @@ theorem neg_pow_bit1 (a : R) (n : ℕ) : (-a) ^ bit1 n = -a ^ bit1 n := by
213212

214213
end
215214

216-
@[simp]
217215
theorem neg_sq (a : R) : (-a) ^ 2 = a ^ 2 := by simp [sq]
218216
#align neg_sq neg_sq
219217

Mathlib/Algebra/Parity.lean

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ theorem IsSquare_sq (a : α) : IsSquare (a ^ 2) :=
129129

130130
variable [HasDistribNeg α]
131131

132+
@[simp]
132133
theorem Even.neg_pow : Even n → ∀ a : α, (-a) ^ n = a ^ n := by
133134
rintro ⟨c, rfl⟩ a
134135
simp_rw [← two_mul, pow_mul, neg_sq]
@@ -329,6 +330,9 @@ theorem Even.add_odd : Even m → Odd n → Odd (m + n) := by
329330
exact ⟨m + n, by rw [mul_add, ← two_mul, add_assoc]⟩
330331
#align even.add_odd Even.add_odd
331332

333+
theorem Even.odd_add : Even m → Odd n → Odd (n + m) :=
334+
fun he ho ↦ by simp only [he.add_odd ho, add_comm n m]
335+
332336
theorem Odd.add_even (hm : Odd m) (hn : Even n) : Odd (m + n) := by
333337
rw [add_comm]
334338
exact hn.add_odd hm
@@ -346,11 +350,22 @@ theorem odd_one : Odd (1 : α) :=
346350
0, (zero_add _).symm.trans (congr_arg (· + (1 : α)) (mul_zero _).symm)⟩
347351
#align odd_one odd_one
348352

349-
@[simp]
353+
@[simp] lemma Even.add_one (h : Even m) : Odd (m + 1) := h.add_odd odd_one
354+
355+
@[simp] lemma Even.one_add (h : Even m) : Odd (1 + m) := h.odd_add odd_one
356+
350357
theorem odd_two_mul_add_one (m : α) : Odd (2 * m + 1) :=
351358
⟨m, rfl⟩
352359
#align odd_two_mul_add_one odd_two_mul_add_one
353360

361+
@[simp] lemma odd_add_self_one' : Odd (m + (m + 1)) := by simp [← add_assoc]
362+
363+
@[simp] lemma odd_add_one_self : Odd (m + 1 + m) := by simp [add_comm _ m]
364+
365+
@[simp] lemma odd_add_one_self' : Odd (m + (1 + m)) := by simp [add_comm 1 m]
366+
367+
@[simp] lemma one_add_self_self : Odd (1 + m + m) := by simp [add_comm 1 m]
368+
354369
theorem Odd.map [RingHomClass F α β] (f : F) : Odd m → Odd (f m) := by
355370
rintro ⟨m, rfl⟩
356371
exact ⟨f m, by simp [two_mul]⟩
@@ -386,6 +401,7 @@ theorem Odd.neg_pow : Odd n → ∀ a : α, (-a) ^ n = -a ^ n := by
386401
simp_rw [pow_add, pow_mul, neg_sq, pow_one, mul_neg]
387402
#align odd.neg_pow Odd.neg_pow
388403

404+
@[simp]
389405
theorem Odd.neg_one_pow (h : Odd n) : (-1 : α) ^ n = -1 := by rw [h.neg_pow, one_pow]
390406
#align odd.neg_one_pow Odd.neg_one_pow
391407

Mathlib/Data/Finset/NatAntidiagonal.lean

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ generally for sums going from `0` to `n`.
2020
This refines files `Data.List.NatAntidiagonal` and `Data.Multiset.NatAntidiagonal`.
2121
-/
2222

23+
open Function
2324

2425
namespace Finset
2526

@@ -51,7 +52,7 @@ theorem antidiagonal_succ (n : ℕ) :
5152
antidiagonal (n + 1) =
5253
cons (0, n + 1)
5354
((antidiagonal n).map
54-
(Function.Embedding.prodMap ⟨Nat.succ, Nat.succ_injective⟩ (Function.Embedding.refl _)))
55+
(Embedding.prodMap ⟨Nat.succ, Nat.succ_injective⟩ (Embedding.refl _)))
5556
(by simp) := by
5657
apply eq_of_veq
5758
rw [cons_val, map_val]
@@ -62,7 +63,7 @@ theorem antidiagonal_succ' (n : ℕ) :
6263
antidiagonal (n + 1) =
6364
cons (n + 1, 0)
6465
((antidiagonal n).map
65-
(Function.Embedding.prodMap (Function.Embedding.refl _) ⟨Nat.succ, Nat.succ_injective⟩))
66+
(Embedding.prodMap (Embedding.refl _) ⟨Nat.succ, Nat.succ_injective⟩))
6667
(by simp) := by
6768
apply eq_of_veq
6869
rw [cons_val, map_val]
@@ -74,19 +75,24 @@ theorem antidiagonal_succ_succ' {n : ℕ} :
7475
cons (0, n + 2)
7576
(cons (n + 2, 0)
7677
((antidiagonal n).map
77-
(Function.Embedding.prodMap ⟨Nat.succ, Nat.succ_injective⟩
78+
(Embedding.prodMap ⟨Nat.succ, Nat.succ_injective⟩
7879
⟨Nat.succ, Nat.succ_injective⟩)) <|
7980
by simp)
8081
(by simp) := by
8182
simp_rw [antidiagonal_succ (n + 1), antidiagonal_succ', Finset.map_cons, map_map]
8283
rfl
8384
#align finset.nat.antidiagonal_succ_succ' Finset.Nat.antidiagonal_succ_succ'
8485

85-
theorem map_swap_antidiagonal {n : ℕ} :
86+
/-- See also `Finset.map.map_prodComm_antidiagonal`. -/
87+
@[simp] theorem map_swap_antidiagonal {n : ℕ} :
8688
(antidiagonal n).map ⟨Prod.swap, Prod.swap_injective⟩ = antidiagonal n :=
8789
eq_of_veq <| by simp [antidiagonal, Multiset.Nat.map_swap_antidiagonal]
8890
#align finset.nat.map_swap_antidiagonal Finset.Nat.map_swap_antidiagonal
8991

92+
@[simp] theorem map_prodComm_antidiagonal {n : ℕ} :
93+
(antidiagonal n).map (Equiv.prodComm ℕ ℕ) = antidiagonal n :=
94+
map_swap_antidiagonal
95+
9096
/-- A point in the antidiagonal is determined by its first co-ordinate. -/
9197
theorem antidiagonal_congr {n : ℕ} {p q : ℕ × ℕ} (hp : p ∈ antidiagonal n)
9298
(hq : q ∈ antidiagonal n) : p = q ↔ p.fst = q.fst := by
@@ -122,10 +128,61 @@ theorem filter_snd_eq_antidiagonal (n m : ℕ) :
122128
filter (fun x : ℕ × ℕ ↦ x.snd = m) (antidiagonal n) = if m ≤ n then {(n - m, m)} else ∅ := by
123129
have : (fun x : ℕ × ℕ ↦ (x.snd = m)) ∘ Prod.swap = fun x : ℕ × ℕ ↦ x.fst = m := by
124130
ext; simp
125-
rw [← map_swap_antidiagonal]
126-
simp [filter_map, this, filter_fst_eq_antidiagonal, apply_ite (Finset.map _)]
131+
rw [← map_swap_antidiagonal, filter_map]
132+
simp [this, filter_fst_eq_antidiagonal, apply_ite (Finset.map _)]
127133
#align finset.nat.filter_snd_eq_antidiagonal Finset.Nat.filter_snd_eq_antidiagonal
128134

135+
@[simp] lemma antidiagonal_filter_snd_le_of_le {n k : ℕ} (h : k ≤ n) :
136+
(antidiagonal n).filter (fun a ↦ a.snd ≤ k) = (antidiagonal k).map
137+
(Embedding.prodMap ⟨_, add_left_injective (n - k)⟩ (Embedding.refl ℕ)) := by
138+
ext ⟨i, j⟩
139+
suffices : i + j = n ∧ j ≤ k ↔ ∃ a, a + j = k ∧ a + (n - k) = i
140+
· simpa
141+
refine' ⟨fun hi ↦ ⟨k - j, tsub_add_cancel_of_le hi.2, _⟩, _⟩
142+
· rw [add_comm, tsub_add_eq_add_tsub h, ← hi.1, add_assoc, Nat.add_sub_of_le hi.2,
143+
add_tsub_cancel_right]
144+
· rintro ⟨l, hl, rfl⟩
145+
refine' ⟨_, hl ▸ Nat.le_add_left j l⟩
146+
rw [add_assoc, add_comm, add_assoc, add_comm j l, hl]
147+
exact Nat.sub_add_cancel h
148+
149+
@[simp] lemma antidiagonal_filter_fst_le_of_le {n k : ℕ} (h : k ≤ n) :
150+
(antidiagonal n).filter (fun a ↦ a.fst ≤ k) = (antidiagonal k).map
151+
(Embedding.prodMap (Embedding.refl ℕ) ⟨_, add_left_injective (n - k)⟩) := by
152+
have aux₁ : fun a ↦ a.fst ≤ k = (fun a ↦ a.snd ≤ k) ∘ (Equiv.prodComm ℕ ℕ).symm := rfl
153+
have aux₂ : ∀ i j, (∃ a b, a + b = k ∧ b = i ∧ a + (n - k) = j) ↔
154+
∃ a b, a + b = k ∧ a = i ∧ b + (n - k) = j :=
155+
fun i j ↦ by rw [exists_comm]; exact exists₂_congr (fun a b ↦ by rw [add_comm])
156+
rw [← map_prodComm_antidiagonal]
157+
simp_rw [aux₁, ← map_filter, antidiagonal_filter_snd_le_of_le h, map_map]
158+
ext ⟨i, j⟩
159+
simpa using aux₂ i j
160+
161+
@[simp] lemma antidiagonal_filter_le_fst_of_le {n k : ℕ} (h : k ≤ n) :
162+
(antidiagonal n).filter (fun a ↦ k ≤ a.fst) = (antidiagonal (n - k)).map
163+
(Embedding.prodMap ⟨_, add_left_injective k⟩ (Embedding.refl ℕ)) := by
164+
ext ⟨i, j⟩
165+
suffices : i + j = n ∧ k ≤ i ↔ ∃ a, a + j = n - k ∧ a + k = i
166+
· simpa
167+
refine' ⟨fun hi ↦ ⟨i - k, _, tsub_add_cancel_of_le hi.2⟩, _⟩
168+
· rw [← Nat.sub_add_comm hi.2, hi.1]
169+
· rintro ⟨l, hl, rfl⟩
170+
refine' ⟨_, Nat.le_add_left k l⟩
171+
rw [add_right_comm, hl]
172+
exact tsub_add_cancel_of_le h
173+
174+
@[simp] lemma antidiagonal_filter_le_snd_of_le {n k : ℕ} (h : k ≤ n) :
175+
(antidiagonal n).filter (fun a ↦ k ≤ a.snd) = (antidiagonal (n - k)).map
176+
(Embedding.prodMap (Embedding.refl ℕ) ⟨_, add_left_injective k⟩) := by
177+
have aux₁ : fun a ↦ k ≤ a.snd = (fun a ↦ k ≤ a.fst) ∘ (Equiv.prodComm ℕ ℕ).symm := rfl
178+
have aux₂ : ∀ i j, (∃ a b, a + b = n - k ∧ b = i ∧ a + k = j) ↔
179+
∃ a b, a + b = n - k ∧ a = i ∧ b + k = j :=
180+
fun i j ↦ by rw [exists_comm]; exact exists₂_congr (fun a b ↦ by rw [add_comm])
181+
rw [← map_prodComm_antidiagonal]
182+
simp_rw [aux₁, ← map_filter, antidiagonal_filter_le_fst_of_le h, map_map]
183+
ext ⟨i, j⟩
184+
simpa using aux₂ i j
185+
129186
section EquivProd
130187

131188
/-- The disjoint union of antidiagonals `Σ (n : ℕ), antidiagonal n` is equivalent to the product

Mathlib/NumberTheory/Cyclotomic/Discriminant.lean

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ theorem discr_prime_pow [hcycl : IsCyclotomicExtension {p ^ k} K L] [hp : Fact (
153153
minpoly.eq_X_sub_C_of_algebraMap_inj _ (algebraMap K L).injective, natDegree_X_sub_C]
154154
simp only [traceMatrix, map_one, one_pow, Matrix.det_unique, traceForm_apply, mul_one]
155155
rw [← (algebraMap K L).map_one, trace_algebraMap, finrank _ hirr]
156-
simp; norm_num
156+
norm_num
157157
· by_cases hk : p ^ (k + 1) = 2
158158
· have coe_two : 2 = ((2 : ℕ+) : ℕ) := rfl
159159
have hp : p = 2 := by
@@ -167,7 +167,6 @@ theorem discr_prime_pow [hcycl : IsCyclotomicExtension {p ^ k} K L] [hp : Fact (
167167
rw [add_left_eq_self] at hk
168168
rw [hp, hk] at hζ; norm_num at hζ; rw [← coe_two] at hζ
169169
rw [coe_basis, powerBasis_gen]; simp only [hp, hk]; norm_num
170-
rw [← coe_two, totient_two, show 1 / 2 = 0 by rfl, _root_.pow_zero]
171170
-- Porting note: the goal at this point is `(discr K fun i ↦ ζ ^ ↑i) = 1`.
172171
-- This `simp_rw` is needed so the next `rw` can rewrite the type of `i` from
173172
-- `Fin (natDegree (minpoly K ζ))` to `Fin 1`

0 commit comments

Comments
 (0)