Zulip Chat Archive

Stream: Is there code for X?

Topic: Third isomorphism theorem


Anne Baanen (Jul 05 2021 at 13:22):

I can't find the third isomorphism theorem for submodules or subgroups anywhere, do we not have this yet? (I need to show that |M / S| * |S / T| = |M / T|, assuming all these cardinalities are finite.)

Oliver Nash (Jul 05 2021 at 13:31):

Aren't we supposed to do this from lattice theory or something using https://github.com/leanprover-community/mathlib/blob/8ba94ab79b5d75bbb562665326666ea675c8ff88/src/linear_algebra/basic.lean#L2825 ?

Oliver Nash (Jul 05 2021 at 13:32):

Oh wait, maybe that's the second.

Anne Baanen (Jul 05 2021 at 13:36):

I believe that's the second :(

Anne Baanen (Jul 05 2021 at 13:57):

For subgroups:

namespace quotient_group

@[simp, to_additive quotient_add_group.map_coe] lemma map_coe {G H : Type*} [group G] [group H]
  (S : subgroup G) (T : subgroup H) [hS : S.normal] [hT : T.normal] (f h) (x : G) :
  quotient_group.map S T f h x = (f x) :=
quotient_group.lift_mk' S _ x

@[simp, to_additive quotient_add_group.map_mk'] lemma map_mk' {G H : Type*} [group G] [group H]
  (S : subgroup G) (T : subgroup H) [hS : S.normal] [hT : T.normal] (f h) (x : G) :
  quotient_group.map S T f h (quotient_group.mk' _ x) = (f x) :=
quotient_group.lift_mk' S _ x

variables {G : Type*} [group G] (S T : subgroup G) [hS : S.normal] [hT : T.normal] (h : S  T)

include hS hT

@[to_additive quotient_add_group.map_normal]
instance map_normal : (T.map (quotient_group.mk' S)).normal :=
{ conj_mem := begin
    rintro _ x, hx, rfl y,
    refine induction_on' y (λ y, y * x * y⁻¹, subgroup.normal.conj_mem hT x hx y, _⟩),
    simp only [mk'_apply, coe_mul, coe_inv]
  end }

/-- The map from the isomorphism theorem for groups: `(G / S) / (T / S) → G / T`. -/
@[to_additive quotient_add_group.quotient_quotient_equiv_quotient_aux]
def quotient_quotient_equiv_quotient_aux :
  quotient (T.map (mk' S)) →* quotient T :=
lift (T.map (mk' S))
  (map S T (monoid_hom.id G) h)
  (by { rintro _ x, hx, rfl⟩, rw map_mk' S T _ _ x,
        exact (quotient_group.eq_one_iff _).mpr hx })

@[simp, to_additive quotient_add_group.quotient_quotient_equiv_quotient_aux_coe]
lemma quotient_quotient_equiv_quotient_aux_coe (x : quotient_group.quotient S) :
  quotient_quotient_equiv_quotient_aux S T h x = quotient_group.map S T (monoid_hom.id G) h x :=
quotient_group.lift_mk' _ _ x

@[to_additive quotient_add_group.quotient_quotient_equiv_quotient_aux_coe_coe]
lemma quotient_quotient_equiv_quotient_aux_coe_coe (x : G) :
  quotient_quotient_equiv_quotient_aux S T h (x : quotient_group.quotient S) =
    x :=
quotient_group.lift_mk' _ _ x

/-- Third isomorphism theorem for groups: `(G / S) / (T / S) ≃ G / T`. -/
@[to_additive quotient_add_group.quotient_quotient_equiv_quotient]
def quotient_quotient_equiv_quotient :
  quotient_group.quotient (T.map (quotient_group.mk' S)) ≃* quotient_group.quotient T :=
{ to_fun := quotient_quotient_equiv_quotient_aux S T h,
  inv_fun := quotient_group.map _ _ (quotient_group.mk' S) (subgroup.le_comap_map _ _),
  left_inv := λ x, quotient_group.induction_on' x $ λ x, quotient_group.induction_on' x $
    λ x, by rw [quotient_quotient_equiv_quotient_aux_coe_coe, quotient_group.map_coe,
                quotient_group.mk'_apply],
  right_inv := λ x, quotient_group.induction_on' x $ λ x,
    by rw [quotient_group.map_coe, quotient_group.mk'_apply, quotient_quotient_equiv_quotient_aux_coe_coe],
  map_mul' := monoid_hom.map_mul _ }

end quotient_group

Anne Baanen (Jul 05 2021 at 14:10):

For submodules, the simp lemmas seem to work a lot better:

namespace submodule

variables {R M : Type*} [ring R] [add_comm_group M] [module R M] (S T : submodule R M) (h : S  T)

/-- The map from the third isomorphism theorem for modules: `(M / S) / (T / S) → M / T`. -/
def quotient_quotient_equiv_quotient_aux :
  quotient (T.map S.mkq) →ₗ[R] quotient T :=
liftq _ (mapq S T linear_map.id h)
  (by { rintro _ x, hx, rfl⟩, rw [linear_map.mem_ker, mkq_apply, mapq_apply],
        exact (quotient.mk_eq_zero _).mpr hx })

@[simp] lemma quotient_quotient_equiv_quotient_aux_mk (x : S.quotient) :
  quotient_quotient_equiv_quotient_aux S T h (quotient.mk x) = mapq S T linear_map.id h x :=
liftq_apply _ _ _

/-- Third isomorphism theorem for modules: `(M / S) / (T / S) ≃ M / T`. -/
def quotient_quotient_equiv_quotient :
  quotient (T.map S.mkq) ≃ₗ[R] quotient T :=
{ to_fun := quotient_quotient_equiv_quotient_aux S T h,
  inv_fun := mapq _ _ (mkq S) (le_comap_map _ _),
  left_inv := λ x, quotient.induction_on' x $ λ x, quotient.induction_on' x $ λ x, by simp,
  right_inv := λ x, quotient.induction_on' x $ λ x, by simp,
  .. quotient_quotient_equiv_quotient_aux S T h }


end submodule

Anne Baanen (Jul 05 2021 at 14:30):

#8203


Last updated: Dec 20 2023 at 11:08 UTC