Double countings #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
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
the size of s
. Similarly for t
. Combining those two yields inequalities between the sizes of s
and t
.
bipartite_below
:s.bipartite_below r b
are the elements ofs
belowb
wrt tor
. Its size is the number of edges ofb
ins
.bipartite_above
: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.bipartite_below
{α : 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.bipartite_below r s b = finset.filter (λ (a : α), r a b) s
def
finset.bipartite_above
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(t : finset β)
(a : α)
[decidable_pred (r a)] :
finset β
Elements of t
which are "above" a
according to relation r
.
Equations
- finset.bipartite_above r t a = finset.filter (r a) t
theorem
finset.bipartite_below_swap
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(t : finset β)
(a : α)
[decidable_pred (r a)] :
finset.bipartite_below (function.swap r) t a = finset.bipartite_above r t a
theorem
finset.bipartite_above_swap
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(s : finset α)
(b : β)
[Π (a : α), decidable (r a b)] :
finset.bipartite_above (function.swap r) s b = finset.bipartite_below r s b
@[simp, norm_cast]
theorem
finset.coe_bipartite_above
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
(t : finset β)
(a : α)
[decidable_pred (r a)] :
↑(finset.bipartite_above r t a) = {b ∈ ↑t | r a b}
@[simp]
theorem
finset.mem_bipartite_above
{α : Type u_1}
{β : Type u_2}
(r : α → β → Prop)
{t : finset β}
{a : α}
[decidable_pred (r a)]
{b : β} :
b ∈ finset.bipartite_above r t a ↔ b ∈ t ∧ r a b
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 : α), a ∈ s → m ≤ (finset.bipartite_above r t a).card)
(hn : ∀ (b : β), b ∈ t → (finset.bipartite_below 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
fintype.card_le_card_of_left_total_unique
{α : Type u_1}
{β : Type u_2}
[fintype α]
[fintype β]
{r : α → β → Prop}
(h₁ : relator.left_total r)
(h₂ : relator.left_unique r) :
theorem
fintype.card_le_card_of_right_total_unique
{α : Type u_1}
{β : Type u_2}
[fintype α]
[fintype β]
{r : α → β → Prop}
(h₁ : relator.right_total r)
(h₂ : relator.right_unique r) :