Documentation

Mathlib.Data.Finset.Prod

Finsets in product types #

This file defines finset constructions on the product type α × β. Beware not to confuse with the Finset.prod operation which computes the multiplicative product.

Main declarations #

prod #

def Finset.product {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
Finset (α × β)

product s t is the set of pairs (a, b) such that a ∈ s and b ∈ t.

Equations
Instances For
    @[implicit_reducible]
    instance Finset.instSProd {α : Type u_1} {β : Type u_2} :
    SProd (Finset α) (Finset β) (Finset (α × β))
    Equations
    @[simp]
    theorem Finset.product_eq_sprod {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :
    s.product t = s ×ˢ t
    @[simp]
    theorem Finset.product_val {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :
    (s ×ˢ t).val = s.val ×ˢ t.val
    @[simp]
    theorem Finset.mem_product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {p : α × β} :
    p s ×ˢ t p.1 s p.2 t
    theorem Finset.mk_mem_product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {a : α} {b : β} (ha : a s) (hb : b t) :
    (a, b) s ×ˢ t
    @[simp]
    theorem Finset.coe_product {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
    ↑(s ×ˢ t) = s ×ˢ t
    def Equiv.Finset.prod {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
    ↥(s ×ˢ t) s × t

    The product s ×ˢ t of two finsets, viewed as a subtype, is equivalent to the product of the subtypes s × t. The Finset analogue of Equiv.Set.prod.

    Equations
    Instances For
      theorem Finset.subset_product_image_fst {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [DecidableEq α] :
      theorem Finset.subset_product_image_snd {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [DecidableEq β] :
      theorem Finset.product_image_fst {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [DecidableEq α] (ht : t.Nonempty) :
      theorem Finset.product_image_snd {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [DecidableEq β] (ht : s.Nonempty) :
      theorem Finset.subset_product {α : Type u_1} {β : Type u_2} [DecidableEq α] [DecidableEq β] {s : Finset (α × β)} :
      theorem Finset.product_subset_product {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t t' : Finset β} (hs : s s') (ht : t t') :
      s ×ˢ t s' ×ˢ t'
      theorem Finset.product_subset_product_left {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t : Finset β} (hs : s s') :
      s ×ˢ t s' ×ˢ t
      theorem Finset.product_subset_product_right {α : Type u_1} {β : Type u_2} {s : Finset α} {t t' : Finset β} (ht : t t') :
      s ×ˢ t s ×ˢ t'
      theorem Finset.prodMap_image_product {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} [DecidableEq β] [DecidableEq δ] (f : αβ) (g : γδ) (s : Finset α) (t : Finset γ) :
      image (Prod.map f g) (s ×ˢ t) = image f s ×ˢ image g t
      theorem Finset.prodMap_map_product {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} (f : α β) (g : γ δ) (s : Finset α) (t : Finset γ) :
      map (f.prodMap g) (s ×ˢ t) = map f s ×ˢ map g t
      theorem Finset.map_swap_product {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
      map { toFun := Prod.swap, inj' := } (t ×ˢ s) = s ×ˢ t
      @[simp]
      theorem Finset.image_swap_product {α : Type u_1} {β : Type u_2} [DecidableEq (α × β)] (s : Finset α) (t : Finset β) :
      theorem Finset.product_eq_biUnion {α : Type u_1} {β : Type u_2} [DecidableEq (α × β)] (s : Finset α) (t : Finset β) :
      s ×ˢ t = s.biUnion fun (a : α) => image (fun (b : β) => (a, b)) t
      theorem Finset.product_eq_biUnion_right {α : Type u_1} {β : Type u_2} [DecidableEq (α × β)] (s : Finset α) (t : Finset β) :
      s ×ˢ t = t.biUnion fun (b : β) => image (fun (a : α) => (a, b)) s
      @[simp]
      theorem Finset.product_biUnion {α : Type u_1} {β : Type u_2} {γ : Type u_3} [DecidableEq γ] (s : Finset α) (t : Finset β) (f : α × βFinset γ) :
      (s ×ˢ t).biUnion f = s.biUnion fun (a : α) => t.biUnion fun (b : β) => f (a, b)

      See also Finset.sup_product_left.

      @[simp]
      theorem Finset.card_product {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
      (s ×ˢ t).card = s.card * t.card
      theorem Finset.nontrivial_prod_iff {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :

      The product of two Finsets is nontrivial iff both are nonempty at least one of them is nontrivial.

      theorem Finset.filter_product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (p : αProp) (q : βProp) [DecidablePred p] [DecidablePred q] :
      {xs ×ˢ t | p x.1 q x.2} = filter p s ×ˢ filter q t
      theorem Finset.filter_product_left {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (p : αProp) [DecidablePred p] :
      {xs ×ˢ t | p x.1} = filter p s ×ˢ t
      theorem Finset.filter_product_right {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (q : βProp) [DecidablePred q] :
      {xs ×ˢ t | q x.2} = s ×ˢ filter q t
      theorem Finset.filter_product_card {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) (p : αProp) (q : βProp) [DecidablePred p] [DecidablePred q] :
      {xs ×ˢ t | p x.1 = q x.2}.card = (filter p s).card * (filter q t).card + {xs | ¬p x}.card * {xt | ¬q x}.card
      @[simp]
      theorem Finset.empty_product {α : Type u_1} {β : Type u_2} (t : Finset β) :
      @[simp]
      theorem Finset.product_empty {α : Type u_1} {β : Type u_2} (s : Finset α) :
      theorem Finset.Nonempty.product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (hs : s.Nonempty) (ht : t.Nonempty) :
      theorem Finset.Nonempty.fst {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (h : (s ×ˢ t).Nonempty) :
      theorem Finset.Nonempty.snd {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (h : (s ×ˢ t).Nonempty) :
      @[simp]
      theorem Finset.nonempty_product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :
      @[simp]
      theorem Finset.product_eq_empty {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :
      s ×ˢ t = s = t =
      @[simp]
      theorem Finset.singleton_product {α : Type u_1} {β : Type u_2} {t : Finset β} {a : α} :
      {a} ×ˢ t = map { toFun := Prod.mk a, inj' := } t
      @[simp]
      theorem Finset.product_singleton {α : Type u_1} {β : Type u_2} {s : Finset α} {b : β} :
      s ×ˢ {b} = map { toFun := fun (i : α) => (i, b), inj' := } s
      theorem Finset.singleton_product_singleton {α : Type u_1} {β : Type u_2} {a : α} {b : β} :
      @[simp]
      theorem Finset.union_product {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t : Finset β} [DecidableEq α] [DecidableEq β] :
      (s s') ×ˢ t = s ×ˢ t s' ×ˢ t
      @[simp]
      theorem Finset.product_union {α : Type u_1} {β : Type u_2} {s : Finset α} {t t' : Finset β} [DecidableEq α] [DecidableEq β] :
      s ×ˢ (t t') = s ×ˢ t s ×ˢ t'
      theorem Finset.inter_product {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t : Finset β} [DecidableEq α] [DecidableEq β] :
      (s s') ×ˢ t = s ×ˢ t s' ×ˢ t
      theorem Finset.product_inter {α : Type u_1} {β : Type u_2} {s : Finset α} {t t' : Finset β} [DecidableEq α] [DecidableEq β] :
      s ×ˢ (t t') = s ×ˢ t s ×ˢ t'
      theorem Finset.product_inter_product {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t t' : Finset β} [DecidableEq α] [DecidableEq β] :
      s ×ˢ t s' ×ˢ t' = (s s') ×ˢ (t t')
      theorem Finset.disjoint_product {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t t' : Finset β} :
      Disjoint (s ×ˢ t) (s' ×ˢ t') Disjoint s s' Disjoint t t'
      @[simp]
      theorem Finset.disjUnion_product {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t : Finset β} (hs : Disjoint s s') :
      s.disjUnion s' hs ×ˢ t = (s ×ˢ t).disjUnion (s' ×ˢ t)
      @[simp]
      theorem Finset.product_disjUnion {α : Type u_1} {β : Type u_2} {s : Finset α} {t t' : Finset β} (ht : Disjoint t t') :
      s ×ˢ t.disjUnion t' ht = (s ×ˢ t).disjUnion (s ×ˢ t')
      def Finset.diag {α : Type u_1} (s : Finset α) :
      Finset (α × α)

      Given a finite set s, the diagonal, s.diag is the set of pairs of the form (a, a) for a ∈ s.

      Equations
      Instances For
        def Finset.offDiag {α : Type u_1} (s : Finset α) :
        Finset (α × α)

        Given a finite set s, the off-diagonal, s.offDiag is the set of pairs (a, b) with a ≠ b for a, b ∈ s.

        Equations
        Instances For
          @[simp]
          theorem Finset.mem_diag {α : Type u_1} {s : Finset α} {x : α × α} :
          x s.diag x.1 s x.1 = x.2
          @[simp]
          theorem Finset.mem_offDiag {α : Type u_1} {s : Finset α} {x : α × α} :
          x s.offDiag x.1 s x.2 s x.1 x.2
          @[simp]
          theorem Finset.diag_nonempty {α : Type u_1} {s : Finset α} :
          @[simp]
          theorem Finset.diag_eq_empty {α : Type u_1} {s : Finset α} :
          theorem Finset.diag_eq_filter {α : Type u_1} {s : Finset α} [DecidableEq α] :
          s.diag = {as ×ˢ s | a.1 = a.2}
          @[simp]
          theorem Finset.image_diag {α : Type u_1} {β : Type u_2} [DecidableEq β] (f : α × αβ) (s : Finset α) :
          image f s.diag = image (fun (x : α) => f (x, x)) s
          @[simp]
          theorem Finset.coe_offDiag {α : Type u_1} (s : Finset α) :
          s.offDiag = (↑s).offDiag
          @[simp]
          theorem Finset.diag_card {α : Type u_1} (s : Finset α) :
          @[simp]
          theorem Finset.offDiag_card {α : Type u_1} (s : Finset α) :
          @[simp]
          theorem Finset.diag_empty {α : Type u_1} :
          @[simp]
          @[simp]
          theorem Finset.diag_union_offDiag {α : Type u_1} (s : Finset α) [DecidableEq α] :
          @[simp]
          theorem Finset.disjoint_diag_offDiag {α : Type u_1} (s : Finset α) :
          theorem Finset.product_sdiff_diag {α : Type u_1} (s : Finset α) [DecidableEq α] :
          s ×ˢ s \ s.diag = s.offDiag
          theorem Finset.product_sdiff_offDiag {α : Type u_1} (s : Finset α) [DecidableEq α] :
          s ×ˢ s \ s.offDiag = s.diag
          theorem Finset.diag_inter {α : Type u_1} (s t : Finset α) [DecidableEq α] :
          (s t).diag = s.diag t.diag
          theorem Finset.offDiag_inter {α : Type u_1} (s t : Finset α) [DecidableEq α] :
          theorem Finset.diag_union {α : Type u_1} (s t : Finset α) [DecidableEq α] :
          (s t).diag = s.diag t.diag
          theorem Finset.offDiag_union {α : Type u_1} {s t : Finset α} [DecidableEq α] (h : Disjoint s t) :
          @[simp]
          theorem Finset.offDiag_singleton {α : Type u_1} (a : α) :
          theorem Finset.diag_singleton {α : Type u_1} (a : α) :
          theorem Finset.diag_insert {α : Type u_1} {s : Finset α} [DecidableEq α] (a : α) :
          (insert a s).diag = insert (a, a) s.diag
          theorem Finset.offDiag_insert {α : Type u_1} {s : Finset α} [DecidableEq α] {a : α} (has : as) :
          theorem Finset.offDiag_filter_lt_eq_filter_le {ι : Type u_4} [PartialOrder ι] [DecidableLE ι] [DecidableLT ι] (s : Finset ι) :
          {is.offDiag | i.1 < i.2} = {is.offDiag | i.1 i.2}