Double countings #
This file gathers a few double counting arguments.
Bipartite graphs #
In a bipartite graph (considered as a relation r : α → β → Prop
), we can bound the number of edges
between s : Finset α
and t : Finset β
by the minimum/maximum of edges over all a ∈ s
times the
size of s
. Similarly for t
. Combining those two yields inequalities between the sizes of s
and t
.
bipartiteBelow
:s.bipartiteBelow r b
are the elements ofs
belowb
wrt tor
. Its size is the number of edges ofb
ins
.bipartiteAbove
:t.bipartite_Above r a
are the elements oft
abovea
wrt tor
. Its size is the number of edges ofa
int
.card_mul_le_card_mul
,card_mul_le_card_mul'
: Double counting the edges of a bipartite graph from below and from above.card_mul_eq_card_mul
: Equality combination of the previous.
Bipartite graph #
def
Finset.bipartiteBelow
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(s : Finset α)
(b : β)
[(a : α) → Decidable (r a b)]
:
Finset α
Elements of s
which are "below" b
according to relation r
.
Equations
- Finset.bipartiteBelow r s b = Finset.filter (fun (a : α) => r a b) s
Instances For
def
Finset.bipartiteAbove
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(t : Finset β)
(a : α)
[DecidablePred (r a)]
:
Finset β
Elements of t
which are "above" a
according to relation r
.
Equations
- Finset.bipartiteAbove r t a = Finset.filter (r a) t
Instances For
theorem
Finset.bipartiteBelow_swap
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(t : Finset β)
(a : α)
[DecidablePred (r a)]
:
Finset.bipartiteBelow (Function.swap r) t a = Finset.bipartiteAbove r t a
theorem
Finset.bipartiteAbove_swap
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(s : Finset α)
(b : β)
[(a : α) → Decidable (r a b)]
:
Finset.bipartiteAbove (Function.swap r) s b = Finset.bipartiteBelow r s b
@[simp]
theorem
Finset.coe_bipartiteAbove
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(t : Finset β)
(a : α)
[DecidablePred (r a)]
:
↑(Finset.bipartiteAbove r t a) = {b : β | b ∈ t ∧ r a b}
@[simp]
theorem
Finset.mem_bipartiteAbove
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
{t : Finset β}
{a : α}
[DecidablePred (r a)]
{b : β}
:
b ∈ Finset.bipartiteAbove r t a ↔ b ∈ t ∧ r a b
theorem
Finset.sum_card_bipartiteAbove_eq_sum_card_bipartiteBelow
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
{s : Finset α}
{t : Finset β}
[(a : α) → (b : β) → Decidable (r a b)]
:
(Finset.sum s fun (a : α) => (Finset.bipartiteAbove r t a).card) = Finset.sum t fun (b : β) => (Finset.bipartiteBelow r s b).card
theorem
Finset.card_mul_le_card_mul
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
{s : Finset α}
{t : Finset β}
{m : ℕ}
{n : ℕ}
[(a : α) → (b : β) → Decidable (r a b)]
(hm : ∀ a ∈ s, m ≤ (Finset.bipartiteAbove r t a).card)
(hn : ∀ b ∈ t, (Finset.bipartiteBelow r s b).card ≤ n)
:
Double counting argument. Considering r
as a bipartite graph, the LHS is a lower bound on the
number of edges while the RHS is an upper bound.
theorem
Finset.card_mul_le_card_mul'
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
{s : Finset α}
{t : Finset β}
{m : ℕ}
{n : ℕ}
[(a : α) → (b : β) → Decidable (r a b)]
(hn : ∀ b ∈ t, n ≤ (Finset.bipartiteBelow r s b).card)
(hm : ∀ a ∈ s, (Finset.bipartiteAbove r t a).card ≤ m)
:
theorem
Finset.card_mul_eq_card_mul
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
{s : Finset α}
{t : Finset β}
{m : ℕ}
{n : ℕ}
[(a : α) → (b : β) → Decidable (r a b)]
(hm : ∀ a ∈ s, (Finset.bipartiteAbove r t a).card = m)
(hn : ∀ b ∈ t, (Finset.bipartiteBelow r s b).card = n)
:
theorem
Fintype.card_le_card_of_leftTotal_unique
{α : Type u_1}
{β : Type u_2}
[Fintype α]
[Fintype β]
{r : α → β → Prop}
(h₁ : Relator.LeftTotal r)
(h₂ : Relator.LeftUnique r)
:
theorem
Fintype.card_le_card_of_rightTotal_unique
{α : Type u_1}
{β : Type u_2}
[Fintype α]
[Fintype β]
{r : α → β → Prop}
(h₁ : Relator.RightTotal r)
(h₂ : Relator.RightUnique r)
: