Antidiagonals in ℕ × ℕ as finsets #
This file defines the antidiagonals of ℕ × ℕ as finsets: the n
-th antidiagonal is the finset of
pairs (i, j)
such that i + j = n
. This is useful for polynomial multiplication and more
generally for sums going from 0
to n
.
Notes #
This refines files Data.List.NatAntidiagonal
and Data.Multiset.NatAntidiagonal
, providing an
instance enabling Finset.antidiagonal
on Nat
.
The antidiagonal of a natural number n
is
the finset of pairs (i, j)
such that i + j = n
.
Equations
- Finset.Nat.instHasAntidiagonal = { antidiagonal := fun (n : ℕ) => { val := Multiset.Nat.antidiagonal n, nodup := ⋯ }, mem_antidiagonal := @Finset.Nat.instHasAntidiagonal.proof_1 }
@[simp]
The cardinality of the antidiagonal of n
is n + 1
.
@[simp]
The antidiagonal of 0
is the list [(0, 0)]
theorem
Finset.Nat.antidiagonal_succ
(n : ℕ)
:
antidiagonal (n + 1) = cons (0, n + 1)
(map ({ toFun := Nat.succ, inj' := Nat.succ_injective }.prodMap (Function.Embedding.refl ℕ)) (antidiagonal n)) ⋯
theorem
Finset.Nat.antidiagonal_succ'
(n : ℕ)
:
antidiagonal (n + 1) = cons (n + 1, 0)
(map ((Function.Embedding.refl ℕ).prodMap { toFun := Nat.succ, inj' := Nat.succ_injective }) (antidiagonal n)) ⋯
theorem
Finset.Nat.antidiagonal_succ_succ'
{n : ℕ}
:
antidiagonal (n + 2) = cons (0, n + 2)
(cons (n + 2, 0)
(map ({ toFun := Nat.succ, inj' := Nat.succ_injective }.prodMap { toFun := Nat.succ, inj' := Nat.succ_injective })
(antidiagonal n))
⋯)
⋯
@[simp]
theorem
Finset.Nat.antidiagonal_filter_snd_le_of_le
{n k : ℕ}
(h : k ≤ n)
:
filter (fun (a : ℕ × ℕ) => a.2 ≤ k) (antidiagonal n) = map ({ toFun := fun (x : ℕ) => x + (n - k), inj' := ⋯ }.prodMap (Function.Embedding.refl ℕ)) (antidiagonal k)
@[simp]
theorem
Finset.Nat.antidiagonal_filter_fst_le_of_le
{n k : ℕ}
(h : k ≤ n)
:
filter (fun (a : ℕ × ℕ) => a.1 ≤ k) (antidiagonal n) = map ((Function.Embedding.refl ℕ).prodMap { toFun := fun (x : ℕ) => x + (n - k), inj' := ⋯ }) (antidiagonal k)
@[simp]
theorem
Finset.Nat.antidiagonal_filter_le_fst_of_le
{n k : ℕ}
(h : k ≤ n)
:
filter (fun (a : ℕ × ℕ) => k ≤ a.1) (antidiagonal n) = map ({ toFun := fun (x : ℕ) => x + k, inj' := ⋯ }.prodMap (Function.Embedding.refl ℕ)) (antidiagonal (n - k))
@[simp]
theorem
Finset.Nat.antidiagonal_filter_le_snd_of_le
{n k : ℕ}
(h : k ≤ n)
:
filter (fun (a : ℕ × ℕ) => k ≤ a.2) (antidiagonal n) = map ((Function.Embedding.refl ℕ).prodMap { toFun := fun (x : ℕ) => x + k, inj' := ⋯ }) (antidiagonal (n - k))
@[simp]
theorem
Finset.Nat.antidiagonalEquivFin_apply_val
(n : ℕ)
(x✝ : { x : ℕ × ℕ // x ∈ antidiagonal n })
:
↑((antidiagonalEquivFin n) x✝) = x✝.1.1
@[simp]
theorem
Finset.Nat.antidiagonalEquivFin_symm_apply_coe
(n : ℕ)
(x✝ : Fin (n + 1))
:
↑((antidiagonalEquivFin n).symm x✝) = (↑x✝, n - ↑x✝)