Documentation

Mathlib.Logic.Equiv.Fin

Equivalences for Fin n #

Equivalence between Fin 0 and Empty.

Equations
Instances For

    Equivalence between Fin 0 and PEmpty.

    Equations
    Instances For

      Equivalence between Fin 1 and Unit.

      Equations
      Instances For

        Equivalence between Fin 2 and Bool.

        Equations
        Instances For
          @[simp]
          theorem piFinTwoEquiv_apply (α : Fin 2Type u) :
          (piFinTwoEquiv α) = fun (f : (i : Fin 2) → α i) => (f 0, f 1)
          @[simp]
          theorem piFinTwoEquiv_symm_apply (α : Fin 2Type u) :
          (piFinTwoEquiv α).symm = fun (p : α 0 × α 1) => Fin.cons p.1 (Fin.cons p.2 finZeroElim)
          def piFinTwoEquiv (α : Fin 2Type u) :
          ((i : Fin 2) → α i) α 0 × α 1

          Π i : Fin 2, α i is equivalent to α 0 × α 1. See also finTwoArrowEquiv for a non-dependent version and prodEquivPiFinTwo for a version with inputs α β : Type u.

          Equations
          • piFinTwoEquiv α = { toFun := fun (f : (i : Fin 2) → α i) => (f 0, f 1), invFun := fun (p : α 0 × α 1) => Fin.cons p.1 (Fin.cons p.2 finZeroElim), left_inv := , right_inv := }
          Instances For
            theorem Fin.preimage_apply_01_prod {α : Fin 2Type u} (s : Set (α 0)) (t : Set (α 1)) :
            (fun (f : (i : Fin 2) → α i) => (f 0, f 1)) ⁻¹' s ×ˢ t = Set.pi Set.univ (Fin.cons s (Fin.cons t finZeroElim))
            theorem Fin.preimage_apply_01_prod' {α : Type u} (s : Set α) (t : Set α) :
            (fun (f : Fin 2α) => (f 0, f 1)) ⁻¹' s ×ˢ t = Set.pi Set.univ ![s, t]
            @[simp]
            theorem prodEquivPiFinTwo_symm_apply (α : Type u) (β : Type u) :
            (prodEquivPiFinTwo α β).symm = fun (f : (i : Fin 2) → Fin.cons α (Fin.cons β finZeroElim) i) => (f 0, f 1)
            @[simp]
            theorem prodEquivPiFinTwo_apply (α : Type u) (β : Type u) :
            (prodEquivPiFinTwo α β) = fun (p : Fin.cons α (Fin.cons β finZeroElim) 0 × Fin.cons α (Fin.cons β finZeroElim) 1) => Fin.cons p.1 (Fin.cons p.2 finZeroElim)
            def prodEquivPiFinTwo (α : Type u) (β : Type u) :
            α × β ((i : Fin 2) → ![α, β] i)

            A product space α × β is equivalent to the space Π i : Fin 2, γ i, where γ = Fin.cons α (Fin.cons β finZeroElim). See also piFinTwoEquiv and finTwoArrowEquiv.

            Equations
            Instances For
              @[simp]
              theorem finTwoArrowEquiv_apply (α : Type u_1) :
              (finTwoArrowEquiv α) = (piFinTwoEquiv fun (x : Fin 2) => α).toFun
              @[simp]
              theorem finTwoArrowEquiv_symm_apply (α : Type u_1) :
              (finTwoArrowEquiv α).symm = fun (x : α × α) => ![x.1, x.2]
              def finTwoArrowEquiv (α : Type u_1) :
              (Fin 2α) α × α

              The space of functions Fin 2 → α is equivalent to α × α. See also piFinTwoEquiv and prodEquivPiFinTwo.

              Equations
              • finTwoArrowEquiv α = let __src := piFinTwoEquiv fun (x : Fin 2) => α; { toFun := __src.toFun, invFun := fun (x : α × α) => ![x.1, x.2], left_inv := , right_inv := }
              Instances For
                def OrderIso.piFinTwoIso (α : Fin 2Type u) [(i : Fin 2) → Preorder (α i)] :
                ((i : Fin 2) → α i) ≃o α 0 × α 1

                Π i : Fin 2, α i is order equivalent to α 0 × α 1. See also OrderIso.finTwoArrowEquiv for a non-dependent version.

                Equations
                Instances For
                  def OrderIso.finTwoArrowIso (α : Type u_1) [Preorder α] :
                  (Fin 2α) ≃o α × α

                  The space of functions Fin 2 → α is order equivalent to α × α. See also OrderIso.piFinTwoIso.

                  Equations
                  Instances For
                    def finCongr {m : } {n : } (h : m = n) :
                    Fin m Fin n

                    The 'identity' equivalence between Fin n and Fin m when n = m.

                    Equations
                    Instances For
                      @[simp]
                      theorem finCongr_apply_mk {m : } {n : } (h : m = n) (k : ) (w : k < m) :
                      (finCongr h) { val := k, isLt := w } = { val := k, isLt := }
                      @[simp]
                      theorem finCongr_symm {m : } {n : } (h : m = n) :
                      (finCongr h).symm = finCongr
                      @[simp]
                      theorem finCongr_apply_coe {m : } {n : } (h : m = n) (k : Fin m) :
                      ((finCongr h) k) = k
                      theorem finCongr_symm_apply_coe {m : } {n : } (h : m = n) (k : Fin n) :
                      ((finCongr h).symm k) = k
                      def finSuccEquiv' {n : } (i : Fin (n + 1)) :
                      Fin (n + 1) Option (Fin n)

                      An equivalence that removes i and maps it to none. This is a version of Fin.predAbove that produces Option (Fin n) instead of mapping both i.cast_succ and i.succ to i.

                      Equations
                      Instances For
                        @[simp]
                        theorem finSuccEquiv'_at {n : } (i : Fin (n + 1)) :
                        (finSuccEquiv' i) i = none
                        @[simp]
                        theorem finSuccEquiv'_succAbove {n : } (i : Fin (n + 1)) (j : Fin n) :
                        theorem finSuccEquiv'_below {n : } {i : Fin (n + 1)} {m : Fin n} (h : Fin.castSucc m < i) :
                        theorem finSuccEquiv'_above {n : } {i : Fin (n + 1)} {m : Fin n} (h : i Fin.castSucc m) :
                        @[simp]
                        theorem finSuccEquiv'_symm_none {n : } (i : Fin (n + 1)) :
                        (finSuccEquiv' i).symm none = i
                        @[simp]
                        theorem finSuccEquiv'_symm_some {n : } (i : Fin (n + 1)) (j : Fin n) :
                        theorem finSuccEquiv'_symm_some_below {n : } {i : Fin (n + 1)} {m : Fin n} (h : Fin.castSucc m < i) :
                        theorem finSuccEquiv'_symm_some_above {n : } {i : Fin (n + 1)} {m : Fin n} (h : i Fin.castSucc m) :
                        (finSuccEquiv' i).symm (some m) = Fin.succ m
                        theorem finSuccEquiv'_symm_coe_below {n : } {i : Fin (n + 1)} {m : Fin n} (h : Fin.castSucc m < i) :
                        theorem finSuccEquiv'_symm_coe_above {n : } {i : Fin (n + 1)} {m : Fin n} (h : i Fin.castSucc m) :
                        (finSuccEquiv' i).symm (some m) = Fin.succ m
                        def finSuccEquiv (n : ) :
                        Fin (n + 1) Option (Fin n)

                        Equivalence between Fin (n + 1) and Option (Fin n). This is a version of Fin.pred that produces Option (Fin n) instead of requiring a proof that the input is not 0.

                        Equations
                        Instances For
                          @[simp]
                          theorem finSuccEquiv_zero {n : } :
                          (finSuccEquiv n) 0 = none
                          @[simp]
                          theorem finSuccEquiv_succ {n : } (m : Fin n) :
                          @[simp]
                          theorem finSuccEquiv_symm_none {n : } :
                          (finSuccEquiv n).symm none = 0
                          @[simp]
                          theorem finSuccEquiv_symm_some {n : } (m : Fin n) :
                          (finSuccEquiv n).symm (some m) = Fin.succ m
                          theorem finSuccEquiv'_last_apply {n : } {i : Fin (n + 1)} (h : i Fin.last n) :
                          theorem finSuccEquiv'_ne_last_apply {n : } {i : Fin (n + 1)} {j : Fin (n + 1)} (hi : i Fin.last n) (hj : j i) :
                          def finSuccAboveEquiv {n : } (p : Fin (n + 1)) :
                          Fin n ≃o { x : Fin (n + 1) // x p }

                          Fin.succAbove as an order isomorphism between Fin n and {x : Fin (n + 1) // x ≠ p}.

                          Equations
                          Instances For
                            theorem finSuccAboveEquiv_apply {n : } (p : Fin (n + 1)) (i : Fin n) :
                            (finSuccAboveEquiv p) i = { val := Fin.succAbove p i, property := }
                            theorem finSuccAboveEquiv_symm_apply_last {n : } (x : { x : Fin (n + 1) // x Fin.last n }) :
                            theorem finSuccAboveEquiv_symm_apply_ne_last {n : } {p : Fin (n + 1)} (h : p Fin.last n) (x : { x : Fin (n + 1) // x p }) :
                            def finSuccEquivLast {n : } :
                            Fin (n + 1) Option (Fin n)

                            Equiv between Fin (n + 1) and Option (Fin n) sending Fin.last n to none

                            Equations
                            Instances For
                              @[simp]
                              theorem finSuccEquivLast_castSucc {n : } (i : Fin n) :
                              finSuccEquivLast (Fin.castSucc i) = some i
                              @[simp]
                              theorem finSuccEquivLast_last {n : } :
                              finSuccEquivLast (Fin.last n) = none
                              @[simp]
                              theorem finSuccEquivLast_symm_some {n : } (i : Fin n) :
                              finSuccEquivLast.symm (some i) = Fin.castSucc i
                              @[simp]
                              theorem finSuccEquivLast_symm_none {n : } :
                              finSuccEquivLast.symm none = Fin.last n
                              @[simp]
                              theorem Equiv.piFinSuccAbove_apply {n : } (α : Fin (n + 1)Type u) (i : Fin (n + 1)) :
                              (Equiv.piFinSuccAbove α i) = fun (f : (j : Fin (n + 1)) → α j) => Fin.extractNth i f
                              @[simp]
                              theorem Equiv.piFinSuccAbove_symm_apply {n : } (α : Fin (n + 1)Type u) (i : Fin (n + 1)) :
                              (Equiv.piFinSuccAbove α i).symm = fun (f : α i × ((j : Fin n) → α (Fin.succAbove i j))) => Fin.insertNth i f.1 f.2
                              def Equiv.piFinSuccAbove {n : } (α : Fin (n + 1)Type u) (i : Fin (n + 1)) :
                              ((j : Fin (n + 1)) → α j) α i × ((j : Fin n) → α (Fin.succAbove i j))

                              Equivalence between Π j : Fin (n + 1), α j and α i × Π j : Fin n, α (Fin.succAbove i j).

                              Equations
                              • One or more equations did not get rendered due to their size.
                              Instances For
                                def OrderIso.piFinSuccAboveIso {n : } (α : Fin (n + 1)Type u) [(i : Fin (n + 1)) → LE (α i)] (i : Fin (n + 1)) :
                                ((j : Fin (n + 1)) → α j) ≃o α i × ((j : Fin n) → α (Fin.succAbove i j))

                                Order isomorphism between Π j : Fin (n + 1), α j and α i × Π j : Fin n, α (Fin.succAbove i j).

                                Equations
                                Instances For
                                  @[simp]
                                  theorem Equiv.piFinSucc_symm_apply (n : ) (β : Type u) :
                                  (Equiv.piFinSucc n β).symm = fun (f : β × (Fin nβ)) => Fin.cons f.1 f.2
                                  @[simp]
                                  theorem Equiv.piFinSucc_apply (n : ) (β : Type u) :
                                  (Equiv.piFinSucc n β) = fun (f : Fin (n + 1)β) => Fin.extractNth 0 f
                                  def Equiv.piFinSucc (n : ) (β : Type u) :
                                  (Fin (n + 1)β) β × (Fin nβ)

                                  Equivalence between Fin (n + 1) → β and β × (Fin n → β).

                                  Equations
                                  Instances For
                                    def Equiv.embeddingFinSucc (n : ) (ι : Type u_1) :
                                    (Fin (n + 1) ι) (e : Fin n ι) × { i : ι // iSet.range e }

                                    An embedding e : Fin (n+1) ↪ ι corresponds to an embedding f : Fin n ↪ ι (corresponding the last n coordinates of e) together with a value not taken by f (corresponding to e 0).

                                    Equations
                                    Instances For
                                      @[simp]
                                      theorem Equiv.embeddingFinSucc_fst {n : } {ι : Type u_1} (e : Fin (n + 1) ι) :
                                      ((Equiv.embeddingFinSucc n ι) e).fst = e Fin.succ
                                      @[simp]
                                      theorem Equiv.embeddingFinSucc_snd {n : } {ι : Type u_1} (e : Fin (n + 1) ι) :
                                      ((Equiv.embeddingFinSucc n ι) e).snd = e 0
                                      @[simp]
                                      theorem Equiv.coe_embeddingFinSucc_symm {n : } {ι : Type u_1} (f : (e : Fin n ι) × { i : ι // iSet.range e }) :
                                      ((Equiv.embeddingFinSucc n ι).symm f) = Fin.cons f.snd f.fst
                                      @[simp]
                                      theorem Equiv.piFinCastSucc_symm_apply (n : ) (β : Type u) :
                                      (Equiv.piFinCastSucc n β).symm = fun (f : β × (Fin nβ)) => Fin.snoc f.2 f.1
                                      @[simp]
                                      theorem Equiv.piFinCastSucc_apply (n : ) (β : Type u) :
                                      (Equiv.piFinCastSucc n β) = fun (f : Fin (n + 1)β) => Fin.extractNth (Fin.last n) f
                                      def Equiv.piFinCastSucc (n : ) (β : Type u) :
                                      (Fin (n + 1)β) β × (Fin nβ)

                                      Equivalence between Fin (n + 1) → β and β × (Fin n → β) which separates out the last element of the tuple.

                                      Equations
                                      Instances For
                                        def finSumFinEquiv {m : } {n : } :
                                        Fin m Fin n Fin (m + n)

                                        Equivalence between Fin m ⊕ Fin n and Fin (m + n)

                                        Equations
                                        Instances For
                                          @[simp]
                                          theorem finSumFinEquiv_apply_left {m : } {n : } (i : Fin m) :
                                          finSumFinEquiv (Sum.inl i) = Fin.castAdd n i
                                          @[simp]
                                          theorem finSumFinEquiv_apply_right {m : } {n : } (i : Fin n) :
                                          finSumFinEquiv (Sum.inr i) = Fin.natAdd m i
                                          @[simp]
                                          theorem finSumFinEquiv_symm_apply_castAdd {m : } {n : } (x : Fin m) :
                                          finSumFinEquiv.symm (Fin.castAdd n x) = Sum.inl x
                                          @[simp]
                                          theorem finSumFinEquiv_symm_apply_natAdd {m : } {n : } (x : Fin n) :
                                          finSumFinEquiv.symm (Fin.natAdd m x) = Sum.inr x
                                          @[simp]
                                          theorem finSumFinEquiv_symm_last {n : } :
                                          finSumFinEquiv.symm (Fin.last n) = Sum.inr 0
                                          def finAddFlip {m : } {n : } :
                                          Fin (m + n) Fin (n + m)

                                          The equivalence between Fin (m + n) and Fin (n + m) which rotates by n.

                                          Equations
                                          Instances For
                                            @[simp]
                                            theorem finAddFlip_apply_castAdd {m : } (k : Fin m) (n : ) :
                                            finAddFlip (Fin.castAdd n k) = Fin.natAdd n k
                                            @[simp]
                                            theorem finAddFlip_apply_natAdd {n : } (k : Fin n) (m : ) :
                                            finAddFlip (Fin.natAdd m k) = Fin.castAdd m k
                                            @[simp]
                                            theorem finAddFlip_apply_mk_left {m : } {n : } {k : } (h : k < m) (hk : optParam (k < m + n) ) (hnk : optParam (n + k < n + m) ) :
                                            finAddFlip { val := k, isLt := hk } = { val := n + k, isLt := hnk }
                                            @[simp]
                                            theorem finAddFlip_apply_mk_right {m : } {n : } {k : } (h₁ : m k) (h₂ : k < m + n) :
                                            finAddFlip { val := k, isLt := h₂ } = { val := k - m, isLt := }
                                            def finRotate (n : ) :

                                            Rotate Fin n one step to the right.

                                            Equations
                                            Instances For
                                              theorem finRotate_succ (n : ) :
                                              finRotate (n + 1) = finAddFlip.trans (finCongr )
                                              theorem finRotate_of_lt {n : } {k : } (h : k < n) :
                                              (finRotate (n + 1)) { val := k, isLt := } = { val := k + 1, isLt := }
                                              theorem finRotate_last' {n : } :
                                              (finRotate (n + 1)) { val := n, isLt := } = { val := 0, isLt := }
                                              theorem finRotate_last {n : } :
                                              (finRotate (n + 1)) (Fin.last n) = 0
                                              theorem Fin.snoc_eq_cons_rotate {n : } {α : Type u_1} (v : Fin nα) (a : α) :
                                              Fin.snoc v a = fun (i : Fin (n + 1)) => Fin.cons a v ((finRotate (n + 1)) i)
                                              @[simp]
                                              theorem finRotate_succ_apply {n : } (i : Fin (n + 1)) :
                                              (finRotate (n + 1)) i = i + 1
                                              theorem coe_finRotate_of_ne_last {n : } {i : Fin (Nat.succ n)} (h : i Fin.last n) :
                                              ((finRotate (n + 1)) i) = i + 1
                                              theorem coe_finRotate {n : } (i : Fin (Nat.succ n)) :
                                              ((finRotate (Nat.succ n)) i) = if i = Fin.last n then 0 else i + 1
                                              @[simp]
                                              theorem finProdFinEquiv_symm_apply {m : } {n : } (x : Fin (m * n)) :
                                              finProdFinEquiv.symm x = (Fin.divNat x, Fin.modNat x)
                                              @[simp]
                                              theorem finProdFinEquiv_apply_val {m : } {n : } (x : Fin m × Fin n) :
                                              (finProdFinEquiv x) = x.2 + n * x.1
                                              def finProdFinEquiv {m : } {n : } :
                                              Fin m × Fin n Fin (m * n)

                                              Equivalence between Fin m × Fin n and Fin (m * n)

                                              Equations
                                              • One or more equations did not get rendered due to their size.
                                              Instances For
                                                @[simp]
                                                theorem Nat.divModEquiv_apply (n : ) [NeZero n] (a : ) :
                                                (Nat.divModEquiv n) a = (a / n, a)
                                                @[simp]
                                                theorem Nat.divModEquiv_symm_apply (n : ) [NeZero n] (p : × Fin n) :
                                                (Nat.divModEquiv n).symm p = p.1 * n + p.2

                                                The equivalence induced by a ↦ (a / n, a % n) for nonzero n. This is like finProdFinEquiv.symm but with m infinite. See Nat.div_mod_unique for a similar propositional statement.

                                                Equations
                                                • Nat.divModEquiv n = { toFun := fun (a : ) => (a / n, a), invFun := fun (p : × Fin n) => p.1 * n + p.2, left_inv := , right_inv := }
                                                Instances For
                                                  @[simp]
                                                  theorem Int.divModEquiv_apply (n : ) [NeZero n] (a : ) :
                                                  (Int.divModEquiv n) a = (a / n, (Int.natMod a n))
                                                  @[simp]
                                                  theorem Int.divModEquiv_symm_apply (n : ) [NeZero n] (p : × Fin n) :
                                                  (Int.divModEquiv n).symm p = p.1 * n + p.2

                                                  The equivalence induced by a ↦ (a / n, a % n) for nonzero n. See Int.ediv_emod_unique for a similar propositional statement.

                                                  Equations
                                                  Instances For
                                                    @[simp]
                                                    theorem Fin.castLEOrderIso_apply {n : } {m : } (h : n m) (i : Fin n) :
                                                    (Fin.castLEOrderIso h) i = { val := Fin.castLE h i, property := }
                                                    @[simp]
                                                    theorem Fin.castLEOrderIso_symm_apply {n : } {m : } (h : n m) (i : { i : Fin m // i < n }) :
                                                    (RelIso.symm (Fin.castLEOrderIso h)) i = { val := i, isLt := }
                                                    def Fin.castLEOrderIso {n : } {m : } (h : n m) :
                                                    Fin n ≃o { i : Fin m // i < n }

                                                    Promote a Fin n into a larger Fin m, as a subtype where the underlying values are retained. This is the OrderIso version of Fin.castLE.

                                                    Equations
                                                    • One or more equations did not get rendered due to their size.
                                                    Instances For

                                                      Fin 0 is a subsingleton.

                                                      Equations

                                                      Fin 1 is a subsingleton.

                                                      Equations