Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 40f582b

Browse files
committed
feat(data/*/nat_antidiagonal): induction lemmas about antidiagonals (#4193)
Adds a `nat.antidiagonal_succ` lemma for `list`, `multiset`, and `finset`, useful for proving facts about power series derivatives Co-authored-by: Aaron Anderson <65780815+awainverse@users.noreply.github.com>
1 parent d8e7bb5 commit 40f582b

File tree

5 files changed

+78
-1
lines changed

5 files changed

+78
-1
lines changed

src/algebra/big_operators/default.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
import algebra.big_operators.order
44
import algebra.big_operators.intervals
55
import algebra.big_operators.ring
6+
import algebra.big_operators.nat_antidiagonal
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/-
2+
Copyright (c) 2020 Aaron Anderson. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Aaron Anderson
5+
-/
6+
7+
import data.finset.nat_antidiagonal
8+
import algebra.big_operators.basic
9+
10+
/-!
11+
# Big operators for `nat_antidiagonal`
12+
13+
This file contains theorems relevant to big operators over `finset.nat.antidiagonal`.
14+
-/
15+
16+
open_locale big_operators
17+
18+
variables {α : Type*} [add_comm_monoid α]
19+
20+
namespace finset
21+
namespace nat
22+
23+
lemma sum_antidiagonal_succ {n : ℕ} {f : ℕ × ℕ → α} :
24+
(antidiagonal (n + 1)).sum f = f (0, n + 1) + ((antidiagonal n).map
25+
(function.embedding.prod_map ⟨nat.succ, nat.succ_injective⟩ (function.embedding.refl _))).sum f :=
26+
begin
27+
rw [antidiagonal_succ, sum_insert],
28+
intro con, rcases mem_map.1 con with ⟨⟨a,b⟩, ⟨h1, h2⟩⟩,
29+
simp only [prod.mk.inj_iff, function.embedding.coe_fn_mk, function.embedding.refl_apply,
30+
function.embedding.coe_prod_map, prod.map_mk] at h2,
31+
apply nat.succ_ne_zero a h2.1,
32+
end
33+
34+
end nat
35+
end finset

src/data/finset/nat_antidiagonal.lean

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def antidiagonal (n : ℕ) : finset (ℕ × ℕ) :=
2222
/-- A pair (i,j) is contained in the antidiagonal of `n` if and only if `i+j=n`. -/
2323
@[simp] lemma mem_antidiagonal {n : ℕ} {x : ℕ × ℕ} :
2424
x ∈ antidiagonal n ↔ x.1 + x.2 = n :=
25-
by rw [antidiagonal, finset.mem_def, multiset.nat.mem_antidiagonal]
25+
by rw [antidiagonal, mem_def, multiset.nat.mem_antidiagonal]
2626

2727
/-- The cardinality of the antidiagonal of `n` is `n+1`. -/
2828
@[simp] lemma card_antidiagonal (n : ℕ) : (antidiagonal n).card = n+1 :=
@@ -32,6 +32,34 @@ by simp [antidiagonal]
3232
@[simp] lemma antidiagonal_zero : antidiagonal 0 = {(0, 0)} :=
3333
rfl
3434

35+
lemma antidiagonal_succ {n : ℕ} :
36+
antidiagonal (n + 1) = insert (0, n + 1) ((antidiagonal n).map
37+
(function.embedding.prod_map ⟨nat.succ, nat.succ_injective⟩ (function.embedding.refl _))) :=
38+
begin
39+
apply eq_of_veq,
40+
rw [insert_val_of_not_mem, map_val],
41+
{apply multiset.nat.antidiagonal_succ},
42+
{ intro con, rcases mem_map.1 con with ⟨⟨a,b⟩, ⟨h1, h2⟩⟩,
43+
simp only [prod.mk.inj_iff, function.embedding.coe_fn_mk, function.embedding.refl_apply,
44+
function.embedding.coe_prod_map, prod.map_mk] at h2,
45+
apply nat.succ_ne_zero a h2.1, }
46+
end
47+
48+
lemma map_swap_antidiagonal {n : ℕ} :
49+
(antidiagonal n).map ⟨prod.swap, prod.swap_right_inverse.injective⟩ = antidiagonal n :=
50+
begin
51+
ext,
52+
simp only [exists_prop, mem_map, mem_antidiagonal,
53+
function.embedding.coe_fn_mk, prod.swap_prod_mk, prod.exists],
54+
rw add_comm,
55+
split,
56+
{ rintro ⟨b, c, ⟨rfl, rfl⟩⟩,
57+
simp },
58+
{ rintro rfl,
59+
use [a.snd, a.fst],
60+
simp }
61+
end
62+
3563
end nat
3664

3765
end finset

src/data/list/nat_antidiagonal.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,14 @@ rfl
3737
lemma nodup_antidiagonal (n : ℕ) : nodup (antidiagonal n) :=
3838
nodup_map (@left_inverse.injective ℕ (ℕ × ℕ) prod.fst (λ i, (i, n-i)) $ λ i, rfl) (nodup_range _)
3939

40+
@[simp] lemma antidiagonal_succ {n : ℕ} :
41+
antidiagonal (n + 1) = (0, n + 1) :: ((antidiagonal n).map (prod.map nat.succ id) ) :=
42+
begin
43+
simp only [antidiagonal, range_succ_eq_map, map_cons, true_and, nat.add_succ_sub_one, add_zero,
44+
id.def, eq_self_iff_true, nat.sub_zero, map_map, prod.map_mk],
45+
apply congr (congr rfl _) rfl,
46+
ext; simp,
47+
end
48+
4049
end nat
4150
end list

src/data/multiset/nat_antidiagonal.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,9 @@ rfl
3535
@[simp] lemma nodup_antidiagonal (n : ℕ) : nodup (antidiagonal n) :=
3636
coe_nodup.2 $ list.nat.nodup_antidiagonal n
3737

38+
@[simp] lemma antidiagonal_succ {n : ℕ} :
39+
antidiagonal (n + 1) = (0, n + 1) :: ((antidiagonal n).map (prod.map nat.succ id)) :=
40+
by simp only [antidiagonal, list.nat.antidiagonal_succ, coe_map, cons_coe]
41+
3842
end nat
3943
end multiset

0 commit comments

Comments
 (0)