Skip to content

Commit 9dc25c2

Browse files
committed
chore(Data/Nat/Choose/Sum): clean up (#15935)
1 parent 93828f4 commit 9dc25c2

File tree

1 file changed

+56
-62
lines changed

1 file changed

+56
-62
lines changed

Mathlib/Data/Nat/Choose/Sum.lean

Lines changed: 56 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,9 @@ import Mathlib.Tactic.Ring
1717
This file includes variants of the binomial theorem and other results on sums of binomial
1818
coefficients. Theorems whose proofs depend on such sums may also go in this file for import
1919
reasons.
20-
2120
-/
2221

23-
24-
open Nat
25-
26-
open Finset
22+
open Nat Finset
2723

2824
variable {R : Type*}
2925

@@ -33,114 +29,116 @@ variable [Semiring R] {x y : R}
3329

3430
/-- A version of the **binomial theorem** for commuting elements in noncommutative semirings. -/
3531
theorem add_pow (h : Commute x y) (n : ℕ) :
36-
(x + y) ^ n = ∑ m ∈ range (n + 1), x ^ m * y ^ (n - m) * choose n m := by
37-
let t : ℕ → ℕ → R := fun n m ↦ x ^ m * y ^ (n - m) * choose n m
32+
(x + y) ^ n = ∑ m ∈ range (n + 1), x ^ m * y ^ (n - m) * n.choose m := by
33+
let t : ℕ → ℕ → R := fun n m ↦ x ^ m * y ^ (n - m) * n.choose m
3834
change (x + y) ^ n = ∑ m ∈ range (n + 1), t n m
3935
have h_first : ∀ n, t n 0 = y ^ n := fun n ↦ by
40-
simp only [t, choose_zero_right, _root_.pow_zero, Nat.cast_one, mul_one, one_mul, tsub_zero]
36+
simp only [t, choose_zero_right, pow_zero, cast_one, mul_one, one_mul, tsub_zero]
4137
have h_last : ∀ n, t n n.succ = 0 := fun n ↦ by
4238
simp only [t, choose_succ_self, cast_zero, mul_zero]
4339
have h_middle :
44-
∀ n i : ℕ, i ∈ range n.succ → (t n.succ (Nat.succ i)) =
45-
x * t n i + y * t n i.succ := by
40+
∀ n i : ℕ, i ∈ range n.succ → (t n.succ i.succ) = x * t n i + y * t n i.succ := by
4641
intro n i h_mem
47-
have h_le : i ≤ n := Nat.le_of_lt_succ (mem_range.mp h_mem)
42+
have h_le : i ≤ n := le_of_lt_succ (mem_range.mp h_mem)
4843
dsimp only [t]
49-
rw [choose_succ_succ, Nat.cast_add, mul_add]
44+
rw [choose_succ_succ, cast_add, mul_add]
5045
congr 1
5146
· rw [pow_succ' x, succ_sub_succ, mul_assoc, mul_assoc, mul_assoc]
5247
· rw [← mul_assoc y, ← mul_assoc y, (h.symm.pow_right i.succ).eq]
5348
by_cases h_eq : i = n
54-
· rw [h_eq, choose_succ_self, Nat.cast_zero, mul_zero, mul_zero]
49+
· rw [h_eq, choose_succ_self, cast_zero, mul_zero, mul_zero]
5550
· rw [succ_sub (lt_of_le_of_ne h_le h_eq)]
5651
rw [pow_succ' y, mul_assoc, mul_assoc, mul_assoc, mul_assoc]
57-
induction' n with n ih
58-
· rw [_root_.pow_zero, sum_range_succ, range_zero, sum_empty, zero_add]
52+
induction n with
53+
| zero =>
54+
rw [pow_zero, sum_range_succ, range_zero, sum_empty, zero_add]
5955
dsimp only [t]
60-
rw [_root_.pow_zero, _root_.pow_zero, choose_self, Nat.cast_one, mul_one, mul_one]
61-
· rw [sum_range_succ', h_first, sum_congr rfl (h_middle n), sum_add_distrib, add_assoc,
56+
rw [pow_zero, pow_zero, choose_self, cast_one, mul_one, mul_one]
57+
| succ n ih =>
58+
rw [sum_range_succ', h_first, sum_congr rfl (h_middle n), sum_add_distrib, add_assoc,
6259
pow_succ' (x + y), ih, add_mul, mul_sum, mul_sum]
6360
congr 1
6461
rw [sum_range_succ', sum_range_succ, h_first, h_last, mul_zero, add_zero, _root_.pow_succ']
6562

6663
/-- A version of `Commute.add_pow` that avoids ℕ-subtraction by summing over the antidiagonal and
6764
also with the binomial coefficient applied via scalar action of ℕ. -/
6865
theorem add_pow' (h : Commute x y) (n : ℕ) :
69-
(x + y) ^ n = ∑ m ∈ antidiagonal n, choose n m.fst • (x ^ m.fst * y ^ m.snd) := by
70-
simp_rw [Finset.Nat.sum_antidiagonal_eq_sum_range_succ fun m p ↦ choose n m • (x ^ m * y ^ p),
71-
_root_.nsmul_eq_mul, cast_comm, h.add_pow]
66+
(x + y) ^ n = ∑ m ∈ antidiagonal n, n.choose m.1 • (x ^ m.1 * y ^ m.2) := by
67+
simp_rw [Nat.sum_antidiagonal_eq_sum_range_succ fun m p ↦ n.choose m • (x ^ m * y ^ p),
68+
nsmul_eq_mul, cast_comm, h.add_pow]
7269

7370
end Commute
7471

7572
/-- The **binomial theorem** -/
7673
theorem add_pow [CommSemiring R] (x y : R) (n : ℕ) :
77-
(x + y) ^ n = ∑ m ∈ range (n + 1), x ^ m * y ^ (n - m) * choose n m :=
74+
(x + y) ^ n = ∑ m ∈ range (n + 1), x ^ m * y ^ (n - m) * n.choose m :=
7875
(Commute.all x y).add_pow n
7976

8077
namespace Nat
8178

8279
/-- The sum of entries in a row of Pascal's triangle -/
83-
theorem sum_range_choose (n : ℕ) : (∑ m ∈ range (n + 1), choose n m) = 2 ^ n := by
80+
theorem sum_range_choose (n : ℕ) : (∑ m ∈ range (n + 1), n.choose m) = 2 ^ n := by
8481
have := (add_pow 1 1 n).symm
8582
simpa [one_add_one_eq_two] using this
8683

87-
theorem sum_range_choose_halfway (m : Nat) : (∑ i ∈ range (m + 1), choose (2 * m + 1) i) = 4 ^ m :=
88-
have : (∑ i ∈ range (m + 1), choose (2 * m + 1) (2 * m + 1 - i)) =
89-
∑ i ∈ range (m + 1), choose (2 * m + 1) i :=
84+
theorem sum_range_choose_halfway (m : ) : (∑ i ∈ range (m + 1), (2 * m + 1).choose i) = 4 ^ m :=
85+
have : (∑ i ∈ range (m + 1), (2 * m + 1).choose (2 * m + 1 - i)) =
86+
∑ i ∈ range (m + 1), (2 * m + 1).choose i :=
9087
sum_congr rfl fun i hi ↦ choose_symm <| by linarith [mem_range.1 hi]
9188
mul_right_injective₀ two_ne_zero <|
9289
calc
93-
(2 * ∑ i ∈ range (m + 1), choose (2 * m + 1) i) =
94-
(∑ i ∈ range (m + 1), choose (2 * m + 1) i) +
95-
∑ i ∈ range (m + 1), choose (2 * m + 1) (2 * m + 1 - i) := by rw [two_mul, this]
96-
_ = (∑ i ∈ range (m + 1), choose (2 * m + 1) i) +
97-
∑ i ∈ Ico (m + 1) (2 * m + 2), choose (2 * m + 1) i := by
98-
{ rw [range_eq_Ico, sum_Ico_reflect]
99-
· congr
100-
have A : m + 12 * m + 1 := by omega
101-
rw [add_comm, add_tsub_assoc_of_le A, ← add_comm]
102-
congr
103-
rw [tsub_eq_iff_eq_add_of_le A]
104-
ring
105-
· omega }
106-
_ = ∑ i ∈ range (2 * m + 2), choose (2 * m + 1) i := sum_range_add_sum_Ico _ (by omega)
90+
(2 * ∑ i ∈ range (m + 1), (2 * m + 1).choose i) =
91+
(∑ i ∈ range (m + 1), (2 * m + 1).choose i) +
92+
∑ i ∈ range (m + 1), (2 * m + 1).choose (2 * m + 1 - i) := by rw [two_mul, this]
93+
_ = (∑ i ∈ range (m + 1), (2 * m + 1).choose i) +
94+
∑ i ∈ Ico (m + 1) (2 * m + 2), (2 * m + 1).choose i := by
95+
rw [range_eq_Ico, sum_Ico_reflect _ _ (by omega)]
96+
congr
97+
have A : m + 12 * m + 1 := by omega
98+
rw [add_comm, add_tsub_assoc_of_le A, ← add_comm]
99+
congr
100+
rw [tsub_eq_iff_eq_add_of_le A]
101+
ring
102+
_ = ∑ i ∈ range (2 * m + 2), (2 * m + 1).choose i := sum_range_add_sum_Ico _ (by omega)
107103
_ = 2 ^ (2 * m + 1) := sum_range_choose (2 * m + 1)
108-
_ = 2 * 4 ^ m := by rw [Nat.pow_succ, pow_mul, mul_comm]; rfl
104+
_ = 2 * 4 ^ m := by rw [pow_succ, pow_mul, mul_comm]; rfl
109105

110-
theorem choose_middle_le_pow (n : ℕ) : choose (2 * n + 1) n ≤ 4 ^ n := by
111-
have t : choose (2 * n + 1) n ≤ ∑ i ∈ range (n + 1), choose (2 * n + 1) i :=
106+
theorem choose_middle_le_pow (n : ℕ) : (2 * n + 1).choose n ≤ 4 ^ n := by
107+
have t : (2 * n + 1).choose n ≤ ∑ i ∈ range (n + 1), (2 * n + 1).choose i :=
112108
single_le_sum (fun x _ ↦ by omega) (self_mem_range_succ n)
113109
simpa [sum_range_choose_halfway n] using t
114110

115111
theorem four_pow_le_two_mul_add_one_mul_central_binom (n : ℕ) :
116-
4 ^ n ≤ (2 * n + 1) * choose (2 * n) n :=
112+
4 ^ n ≤ (2 * n + 1) * (2 * n).choose n :=
117113
calc
118114
4 ^ n = (1 + 1) ^ (2 * n) := by norm_num [pow_mul]
119-
_ = ∑ m ∈ range (2 * n + 1), choose (2 * n) m := by set_option simprocs false in simp [add_pow]
120-
_ ≤ ∑ m ∈ range (2 * n + 1), choose (2 * n) (2 * n / 2) := by gcongr; apply choose_le_middle
115+
_ = ∑ m ∈ range (2 * n + 1), (2 * n).choose m := by set_option simprocs false in simp [add_pow]
116+
_ ≤ ∑ m ∈ range (2 * n + 1), (2 * n).choose (2 * n / 2) := by gcongr; apply choose_le_middle
121117
_ = (2 * n + 1) * choose (2 * n) n := by simp
122118

123119
/-- **Zhu Shijie's identity** aka hockey-stick identity. -/
124120
theorem sum_Icc_choose (n k : ℕ) : ∑ m ∈ Icc k n, m.choose k = (n + 1).choose (k + 1) := by
125-
cases' le_or_gt k n with h h
126-
· induction' n, h using le_induction with n _ ih; · simp
127-
rw [← Ico_insert_right (by omega), sum_insert (by simp),
128-
show Ico k (n + 1) = Icc k n by rfl, ih, choose_succ_succ' (n + 1)]
121+
rcases lt_or_le n k with h | h
129122
· rw [choose_eq_zero_of_lt (by omega), Icc_eq_empty_of_lt h, sum_empty]
123+
· induction n, h using le_induction with
124+
| base => simp
125+
| succ n _ ih =>
126+
rw [← Ico_insert_right (by omega), sum_insert (by simp),
127+
show Ico k (n + 1) = Icc k n by rfl, ih, choose_succ_succ' (n + 1)]
130128

131129
end Nat
132130

133131
theorem Int.alternating_sum_range_choose {n : ℕ} :
134-
(∑ m ∈ range (n + 1), ((-1) ^ m * ↑(choose n m) : ℤ)) = if n = 0 then 1 else 0 := by
132+
(∑ m ∈ range (n + 1), ((-1) ^ m * n.choose m : ℤ)) = if n = 0 then 1 else 0 := by
135133
cases n with
136134
| zero => simp
137135
| succ n =>
138136
have h := add_pow (-1 : ℤ) 1 n.succ
139137
simp only [one_pow, mul_one, neg_add_cancel] at h
140-
rw [← h, zero_pow n.succ_ne_zero, if_neg (Nat.succ_ne_zero n)]
138+
rw [← h, zero_pow n.succ_ne_zero, if_neg n.succ_ne_zero]
141139

142140
theorem Int.alternating_sum_range_choose_of_ne {n : ℕ} (h0 : n ≠ 0) :
143-
(∑ m ∈ range (n + 1), ((-1) ^ m * ↑(choose n m) : ℤ)) = 0 := by
141+
(∑ m ∈ range (n + 1), ((-1) ^ m * n.choose m : ℤ)) = 0 := by
144142
rw [Int.alternating_sum_range_choose, if_neg h0]
145143

146144
namespace Finset
@@ -166,9 +164,8 @@ theorem sum_powerset_neg_one_pow_card {α : Type*} [DecidableEq α] {x : Finset
166164
theorem sum_powerset_neg_one_pow_card_of_nonempty {α : Type*} {x : Finset α} (h0 : x.Nonempty) :
167165
(∑ m ∈ x.powerset, (-1 : ℤ) ^ m.card) = 0 := by
168166
classical
169-
rw [sum_powerset_neg_one_pow_card, if_neg]
170-
rw [← Ne, ← nonempty_iff_ne_empty]
171-
apply h0
167+
rw [sum_powerset_neg_one_pow_card]
168+
exact if_neg (nonempty_iff_ne_empty.mp h0)
172169

173170
variable {M R : Type*} [CommMonoid M] [NonAssocSemiring R]
174171

@@ -179,10 +176,9 @@ theorem prod_pow_choose_succ {M : Type*} [CommMonoid M] (f : ℕ → ℕ → M)
179176
∏ i ∈ range (n + 1), f (i + 1) (n - i) ^ n.choose i := by
180177
have A : (∏ i ∈ range (n + 1), f (i + 1) (n - i) ^ (n.choose (i + 1))) * f 0 (n + 1) =
181178
∏ i ∈ range (n + 1), f i (n + 1 - i) ^ (n.choose i) := by
182-
rw [prod_range_succ, prod_range_succ']
183-
simp
179+
rw [prod_range_succ, prod_range_succ']; simp
184180
rw [prod_range_succ']
185-
simpa [Nat.choose_succ_succ, pow_add, prod_mul_distrib, A, mul_assoc] using mul_comm _ _
181+
simpa [choose_succ_succ, pow_add, prod_mul_distrib, A, mul_assoc] using mul_comm _ _
186182

187183
@[to_additive sum_antidiagonal_choose_succ_nsmul]
188184
theorem prod_antidiagonal_pow_choose_succ {M : Type*} [CommMonoid M] (f : ℕ → ℕ → M) (n : ℕ) :
@@ -195,9 +191,8 @@ theorem prod_antidiagonal_pow_choose_succ {M : Type*} [CommMonoid M] (f : ℕ
195191
· refine prod_congr rfl fun i hi ↦ ?_
196192
rw [tsub_add_eq_add_tsub (this _ hi)]
197193
· refine prod_congr rfl fun i hi ↦ ?_
198-
rw [Nat.choose_symm (this _ hi)]
194+
rw [choose_symm (this _ hi)]
199195

200-
-- Porting note: moved from `Mathlib.Analysis.Calculus.ContDiff`
201196
/-- The sum of `(n+1).choose i * f i (n+1-i)` can be split into two sums at rank `n`,
202197
respectively of `n.choose i * f i (n+1-i)` and `n.choose i * f (i+1) (n-i)`. -/
203198
theorem sum_choose_succ_mul (f : ℕ → ℕ → R) (n : ℕ) :
@@ -215,8 +210,7 @@ theorem sum_antidiagonal_choose_succ_mul (f : ℕ → ℕ → R) (n : ℕ) :
215210
simpa only [nsmul_eq_mul] using sum_antidiagonal_choose_succ_nsmul f n
216211

217212
theorem sum_antidiagonal_choose_add (d n : ℕ) :
218-
(Finset.sum (antidiagonal n) fun ij => (d + ij.2).choose d) =
219-
(d + n).choose d + (d + n).choose (succ d) := by
213+
(∑ ij ∈ antidiagonal n, (d + ij.2).choose d) = (d + n).choose d + (d + n).choose (d + 1) := by
220214
induction n with
221215
| zero => simp
222216
| succ n hn => simpa [Nat.sum_antidiagonal_succ] using hn

0 commit comments

Comments
 (0)