Documentation

Mathlib.Order.JordanHolder

Jordan-Hölder Theorem #

This file proves the Jordan Hölder theorem for a JordanHolderLattice, a class also defined in this file. Examples of JordanHolderLattice include Subgroup G if G is a group, and Submodule R M if M is an R-module. Using this approach the theorem need not be proved separately for both groups and modules, the proof in this file can be applied to both.

Main definitions #

The main definitions in this file are JordanHolderLattice and CompositionSeries, and the relation Equivalent on CompositionSeries

A JordanHolderLattice is the class for which the Jordan Hölder theorem is proved. A Jordan Hölder lattice is a lattice equipped with a notion of maximality, IsMaximal, and a notion of isomorphism of pairs Iso. In the example of subgroups of a group, IsMaximal H K means that H is a maximal normal subgroup of K, and Iso (H₁, K₁) (H₂, K₂) means that the quotient H₁ / K₁ is isomorphic to the quotient H₂ / K₂. Iso must be symmetric and transitive and must satisfy the second isomorphism theorem Iso (H, H ⊔ K) (H ⊓ K, K).

A CompositionSeries X is a finite nonempty series of elements of the lattice X such that each element is maximal inside the next. The length of a CompositionSeries X is one less than the number of elements in the series. Note that there is no stipulation that a series start from the bottom of the lattice and finish at the top. For a composition series s, s.top is the largest element of the series, and s.bot is the least element.

Two CompositionSeries X, s₁ and s₂ are equivalent if there is a bijection e : Fin s₁.lengthFin s₂.length such that for any i, Iso (s₁ i, s₁ i.succ) (s₂ (e i), s₂ (e i.succ))

Main theorems #

The main theorem is CompositionSeries.jordan_holder, which says that if two composition series have the same least element and the same largest element, then they are Equivalent.

TODO #

Provide instances of JordanHolderLattice for both submodules and subgroups, and potentially for modular lattices.

It is not entirely clear how this should be done. Possibly there should be no global instances of JordanHolderLattice, and the instances should only be defined locally in order to prove the Jordan-Hölder theorem for modules/groups and the API should be transferred because many of the theorems in this file will have stronger versions for modules. There will also need to be an API for mapping composition series across homomorphisms. It is also probably possible to provide an instance of JordanHolderLattice for any ModularLattice, and in this case the Jordan-Hölder theorem will say that there is a well defined notion of length of a modular lattice. However an instance of JordanHolderLattice for a modular lattice will not be able to contain the correct notion of isomorphism for modules, so a separate instance for modules will still be required and this will clash with the instance for modular lattices, and so at least one of these instances should not be a global instance.

class JordanHolderLattice (X : Type u) [Lattice X] :

A JordanHolderLattice is the class for which the Jordan Hölder theorem is proved. A Jordan Hölder lattice is a lattice equipped with a notion of maximality, IsMaximal, and a notion of isomorphism of pairs Iso. In the example of subgroups of a group, IsMaximal H K means that H is a maximal normal subgroup of K, and Iso (H₁, K₁) (H₂, K₂) means that the quotient H₁ / K₁ is isomorphic to the quotient H₂ / K₂. Iso must be symmetric and transitive and must satisfy the second isomorphism theorem Iso (H, H ⊔ K) (H ⊓ K, K). Examples include Subgroup G if G is a group, and Submodule R M if M is an R-module.

Instances
    theorem JordanHolderLattice.isMaximal_of_eq_inf {X : Type u} [Lattice X] [JordanHolderLattice X] (x : X) (b : X) {a : X} {y : X} (ha : x y = a) (hxy : x y) (hxb : JordanHolderLattice.IsMaximal x b) (hyb : JordanHolderLattice.IsMaximal y b) :
    theorem JordanHolderLattice.second_iso_of_eq {X : Type u} [Lattice X] [JordanHolderLattice X] {x : X} {y : X} {a : X} {b : X} (hm : JordanHolderLattice.IsMaximal x a) (ha : x y = a) (hb : x y = b) :

    A CompositionSeries X is a finite nonempty series of elements of a JordanHolderLattice such that each element is maximal inside the next. The length of a CompositionSeries X is one less than the number of elements in the series. Note that there is no stipulation that a series start from the bottom of the lattice and finish at the top. For a composition series s, s.top is the largest element of the series, and s.bot is the least element.

    Instances For
      instance CompositionSeries.coeFun {X : Type u} [Lattice X] [JordanHolderLattice X] :
      CoeFun (CompositionSeries X) fun (x : CompositionSeries X) => Fin (x.length + 1)X
      Equations
      • CompositionSeries.coeFun = { coe := CompositionSeries.series }
      Equations
      • CompositionSeries.inhabited = { default := { length := 0, series := default, step' := } }
      theorem CompositionSeries.step {X : Type u} [Lattice X] [JordanHolderLattice X] (s : CompositionSeries X) (i : Fin s.length) :
      theorem CompositionSeries.coeFn_mk {X : Type u} [Lattice X] [JordanHolderLattice X] (length : ) (series : Fin (length + 1)X) (step : ∀ (i : Fin length), JordanHolderLattice.IsMaximal (series (Fin.castSucc i)) (series (Fin.succ i))) :
      { length := length, series := series, step' := step }.series = series
      theorem CompositionSeries.lt_succ {X : Type u} [Lattice X] [JordanHolderLattice X] (s : CompositionSeries X) (i : Fin s.length) :
      s.series (Fin.castSucc i) < s.series (Fin.succ i)
      @[simp]
      theorem CompositionSeries.inj {X : Type u} [Lattice X] [JordanHolderLattice X] (s : CompositionSeries X) {i : Fin (Nat.succ s.length)} {j : Fin (Nat.succ s.length)} :
      s.series i = s.series j i = j
      Equations
      theorem CompositionSeries.mem_def {X : Type u} [Lattice X] [JordanHolderLattice X] {x : X} {s : CompositionSeries X} :
      x s x Set.range s.series
      theorem CompositionSeries.total {X : Type u} [Lattice X] [JordanHolderLattice X] {s : CompositionSeries X} {x : X} {y : X} (hx : x s) (hy : y s) :
      x y y x

      The ordered List X of elements of a CompositionSeries X.

      Equations
      Instances For
        theorem CompositionSeries.ext_fun {X : Type u} [Lattice X] [JordanHolderLattice X] {s₁ : CompositionSeries X} {s₂ : CompositionSeries X} (hl : s₁.length = s₂.length) (h : ∀ (i : Fin (s₁.length + 1)), s₁.series i = s₂.series (Fin.cast i)) :
        s₁ = s₂

        Two CompositionSeries are equal if they are the same length and have the same ith element for every i

        def CompositionSeries.ofList {X : Type u} [Lattice X] [JordanHolderLattice X] (l : List X) (hl : l []) (hc : List.Chain' JordanHolderLattice.IsMaximal l) :

        Make a CompositionSeries X from the ordered list of its elements.

        Equations
        Instances For
          theorem CompositionSeries.length_ofList {X : Type u} [Lattice X] [JordanHolderLattice X] (l : List X) (hl : l []) (hc : List.Chain' JordanHolderLattice.IsMaximal l) :
          @[simp]
          theorem CompositionSeries.toList_ofList {X : Type u} [Lattice X] [JordanHolderLattice X] (l : List X) (hl : l []) (hc : List.Chain' JordanHolderLattice.IsMaximal l) :
          theorem CompositionSeries.ext {X : Type u} [Lattice X] [JordanHolderLattice X] {s₁ : CompositionSeries X} {s₂ : CompositionSeries X} (h : ∀ (x : X), x s₁ x s₂) :
          s₁ = s₂

          Two CompositionSeries are equal if they have the same elements. See also ext_fun.

          The largest element of a CompositionSeries

          Equations
          Instances For
            @[simp]
            theorem CompositionSeries.le_top {X : Type u} [Lattice X] [JordanHolderLattice X] {s : CompositionSeries X} (i : Fin (s.length + 1)) :

            The smallest element of a CompositionSeries

            Equations
            Instances For
              @[simp]
              theorem CompositionSeries.bot_le {X : Type u} [Lattice X] [JordanHolderLattice X] {s : CompositionSeries X} (i : Fin (s.length + 1)) :
              theorem CompositionSeries.length_pos_of_mem_ne {X : Type u} [Lattice X] [JordanHolderLattice X] {s : CompositionSeries X} {x : X} {y : X} (hx : x s) (hy : y s) (hxy : x y) :
              0 < s.length
              theorem CompositionSeries.forall_mem_eq_of_length_eq_zero {X : Type u} [Lattice X] [JordanHolderLattice X] {s : CompositionSeries X} (hs : s.length = 0) {x : X} {y : X} (hx : x s) (hy : y s) :
              x = y
              @[simp]
              theorem CompositionSeries.eraseTop_series {X : Type u} [Lattice X] [JordanHolderLattice X] (s : CompositionSeries X) (i : Fin (s.length - 1 + 1)) :
              (CompositionSeries.eraseTop s).series i = s.series { val := i, isLt := }

              Remove the largest element from a CompositionSeries. If the series s has length zero, then s.eraseTop = s

              Equations
              Instances For
                theorem CompositionSeries.top_eraseTop {X : Type u} [Lattice X] [JordanHolderLattice X] (s : CompositionSeries X) :
                CompositionSeries.top (CompositionSeries.eraseTop s) = s.series { val := s.length - 1, isLt := }
                theorem CompositionSeries.append_castAdd_aux {α : Type u_1} {m : } {n : } (a : Fin (Nat.succ m)α) (b : Fin (Nat.succ n)α) (i : Fin m) :
                Matrix.vecAppend (a Fin.castSucc) b (Fin.castSucc (Fin.castAdd n i)) = a (Fin.castSucc i)
                theorem CompositionSeries.append_succ_castAdd_aux {α : Type u_1} {m : } {n : } (a : Fin (Nat.succ m)α) (b : Fin (Nat.succ n)α) (i : Fin m) (h : a (Fin.last m) = b 0) :
                Matrix.vecAppend (a Fin.castSucc) b (Fin.succ (Fin.castAdd n i)) = a (Fin.succ i)
                theorem CompositionSeries.append_natAdd_aux {α : Type u_1} {m : } {n : } (a : Fin (Nat.succ m)α) (b : Fin (Nat.succ n)α) (i : Fin n) :
                Matrix.vecAppend (a Fin.castSucc) b (Fin.castSucc (Fin.natAdd m i)) = b (Fin.castSucc i)
                theorem CompositionSeries.append_succ_natAdd_aux {α : Type u_1} {m : } {n : } (a : Fin (Nat.succ m)α) (b : Fin (Nat.succ n)α) (i : Fin n) :
                Matrix.vecAppend (a Fin.castSucc) b (Fin.succ (Fin.natAdd m i)) = b (Fin.succ i)
                @[simp]
                theorem CompositionSeries.append_length {X : Type u} [Lattice X] [JordanHolderLattice X] (s₁ : CompositionSeries X) (s₂ : CompositionSeries X) (h : CompositionSeries.top s₁ = CompositionSeries.bot s₂) :
                (CompositionSeries.append s₁ s₂ h).length = s₁.length + s₂.length

                Append two composition series s₁ and s₂ such that the least element of s₁ is the maximum element of s₂.

                Equations
                Instances For
                  theorem CompositionSeries.coe_append {X : Type u} [Lattice X] [JordanHolderLattice X] (s₁ : CompositionSeries X) (s₂ : CompositionSeries X) (h : CompositionSeries.top s₁ = CompositionSeries.bot s₂) :
                  (CompositionSeries.append s₁ s₂ h).series = Matrix.vecAppend (s₁.series Fin.castSucc) s₂.series
                  @[simp]
                  theorem CompositionSeries.append_castAdd {X : Type u} [Lattice X] [JordanHolderLattice X] {s₁ : CompositionSeries X} {s₂ : CompositionSeries X} (h : CompositionSeries.top s₁ = CompositionSeries.bot s₂) (i : Fin s₁.length) :
                  (CompositionSeries.append s₁ s₂ h).series (Fin.castSucc (Fin.castAdd s₂.length i)) = s₁.series (Fin.castSucc i)
                  @[simp]
                  theorem CompositionSeries.append_succ_castAdd {X : Type u} [Lattice X] [JordanHolderLattice X] {s₁ : CompositionSeries X} {s₂ : CompositionSeries X} (h : CompositionSeries.top s₁ = CompositionSeries.bot s₂) (i : Fin s₁.length) :
                  (CompositionSeries.append s₁ s₂ h).series (Fin.succ (Fin.castAdd s₂.length i)) = s₁.series (Fin.succ i)
                  @[simp]
                  theorem CompositionSeries.append_natAdd {X : Type u} [Lattice X] [JordanHolderLattice X] {s₁ : CompositionSeries X} {s₂ : CompositionSeries X} (h : CompositionSeries.top s₁ = CompositionSeries.bot s₂) (i : Fin s₂.length) :
                  (CompositionSeries.append s₁ s₂ h).series (Fin.castSucc (Fin.natAdd s₁.length i)) = s₂.series (Fin.castSucc i)
                  @[simp]
                  theorem CompositionSeries.append_succ_natAdd {X : Type u} [Lattice X] [JordanHolderLattice X] {s₁ : CompositionSeries X} {s₂ : CompositionSeries X} (h : CompositionSeries.top s₁ = CompositionSeries.bot s₂) (i : Fin s₂.length) :
                  (CompositionSeries.append s₁ s₂ h).series (Fin.succ (Fin.natAdd s₁.length i)) = s₂.series (Fin.succ i)

                  Add an element to the top of a CompositionSeries

                  Equations
                  Instances For
                    @[simp]
                    @[simp]
                    theorem CompositionSeries.snoc_castSucc {X : Type u} [Lattice X] [JordanHolderLattice X] (s : CompositionSeries X) (x : X) (hsat : JordanHolderLattice.IsMaximal (CompositionSeries.top s) x) (i : Fin (s.length + 1)) :
                    (CompositionSeries.snoc s x hsat).series (Fin.castSucc i) = s.series i

                    Two CompositionSeries X, s₁ and s₂ are equivalent if there is a bijection e : Fin s₁.lengthFin s₂.length such that for any i, Iso (s₁ i) (s₁ i.succ) (s₂ (e i), s₂ (e i.succ))

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      theorem CompositionSeries.Equivalent.length_eq {X : Type u} [Lattice X] [JordanHolderLattice X] {s₁ : CompositionSeries X} {s₂ : CompositionSeries X} (h : CompositionSeries.Equivalent s₁ s₂) :
                      s₁.length = s₂.length

                      Given a CompositionSeries, s, and an element x such that x is maximal inside s.top there is a series, t, such that t.top = x, t.bot = s.bot and snoc t s.top _ is equivalent to s.

                      The Jordan-Hölder theorem, stated for any JordanHolderLattice. If two composition series start and finish at the same place, they are equivalent.