Documentation

Mathlib.GroupTheory.SemidirectProduct

Semidirect product #

This file defines semidirect products of groups, and the canonical maps in and out of the semidirect product. The semidirect product of N and G given a hom φ from G to the automorphism group of N is the product of sets with the group ⟨n₁, g₁⟩ * ⟨n₂, g₂⟩ = ⟨n₁ * φ g₁ n₂, g₁ * g₂⟩

Key definitions #

There are two homs into the semidirect product inl : N →* N ⋊[φ] G and inr : G →* N ⋊[φ] G, and lift can be used to define maps N ⋊[φ] G →* H out of the semidirect product given maps f₁ : N →* H and f₂ : G →* H that satisfy the condition ∀ n g, f₁ (φ g n) = f₂ g * f₁ n * f₂ g⁻¹

Notation #

This file introduces the global notation N ⋊[φ] G for semidirect_product N G φ

Tags #

group, semidirect product

theorem SemidirectProduct.ext {N : Type u_1} {G : Type u_2} :
∀ {inst : } {inst_1 : } {φ : G →* } (x y : N ⋊[φ] G), x.left = y.leftx.right = y.rightx = y
theorem SemidirectProduct.ext_iff {N : Type u_1} {G : Type u_2} :
∀ {inst : } {inst_1 : } {φ : G →* } (x y : N ⋊[φ] G), x = y x.left = y.left x.right = y.right
structure SemidirectProduct (N : Type u_1) (G : Type u_2) [inst : ] [inst : ] (φ : G →* ) :
Type (maxu_1u_2)
• The element of N

left : N
• The element of G

right : G

The semidirect product of groups N and G, given a map φ from G to the automorphism group of N. It the product of sets with the group operation ⟨n₁, g₁⟩ * ⟨n₂, g₂⟩ = ⟨n₁ * φ g₁ n₂, g₁ * g₂⟩

Instances For
instance instDecidableEqSemidirectProduct :
{N : Type u_1} → {G : Type u_2} → {inst : } → {inst_1 : } → {φ : G →* } → [inst_2 : ] → [inst_3 : ] → DecidableEq (N ⋊[φ] G)
Equations
• instDecidableEqSemidirectProduct = decEqSemidirectProduct✝

The semidirect product of groups N and G, given a map φ from G to the automorphism group of N. It the product of sets with the group operation ⟨n₁, g₁⟩ * ⟨n₂, g₂⟩ = ⟨n₁ * φ g₁ n₂, g₁ * g₂⟩

Equations
• One or more equations did not get rendered due to their size.
instance SemidirectProduct.instMulSemidirectProduct {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
Mul (N ⋊[φ] G)
Equations
• SemidirectProduct.instMulSemidirectProduct = { mul := fun a b => { left := a.left * ↑(φ a.right) b.left, right := a.right * b.right } }
theorem SemidirectProduct.mul_def {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (a : N ⋊[φ] G) (b : N ⋊[φ] G) :
a * b = { left := a.left * ↑(φ a.right) b.left, right := a.right * b.right }
@[simp]
theorem SemidirectProduct.mul_left {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (a : N ⋊[φ] G) (b : N ⋊[φ] G) :
(a * b).left = a.left * ↑(φ a.right) b.left
@[simp]
theorem SemidirectProduct.mul_right {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (a : N ⋊[φ] G) (b : N ⋊[φ] G) :
(a * b).right = a.right * b.right
instance SemidirectProduct.instOneSemidirectProduct {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
One (N ⋊[φ] G)
Equations
• SemidirectProduct.instOneSemidirectProduct = { one := { left := 1, right := 1 } }
@[simp]
theorem SemidirectProduct.one_left {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
1.left = 1
@[simp]
theorem SemidirectProduct.one_right {N : Type u_2} {G : Type u_1} [inst : ] [inst : ] {φ : G →* } :
1.right = 1
instance SemidirectProduct.instInvSemidirectProduct {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
Inv (N ⋊[φ] G)
Equations
• SemidirectProduct.instInvSemidirectProduct = { inv := fun x => { left := ↑(φ x.right⁻¹) x.left⁻¹, right := x.right⁻¹ } }
@[simp]
theorem SemidirectProduct.inv_left {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (a : N ⋊[φ] G) :
a⁻¹.left = ↑(φ a.right⁻¹) a.left⁻¹
@[simp]
theorem SemidirectProduct.inv_right {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (a : N ⋊[φ] G) :
a⁻¹.right = a.right⁻¹
instance SemidirectProduct.instGroupSemidirectProduct {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
Group (N ⋊[φ] G)
Equations
instance SemidirectProduct.instInhabitedSemidirectProduct {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
Equations
• SemidirectProduct.instInhabitedSemidirectProduct = { default := 1 }
def SemidirectProduct.inl {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
N →* N ⋊[φ] G

The canonical map N →* N ⋊[φ] G sending n to ⟨n, 1⟩

Equations
• One or more equations did not get rendered due to their size.
@[simp]
theorem SemidirectProduct.left_inl {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (n : N) :
(SemidirectProduct.inl n).left = n
@[simp]
theorem SemidirectProduct.right_inl {N : Type u_2} {G : Type u_1} [inst : ] [inst : ] {φ : G →* } (n : N) :
(SemidirectProduct.inl n).right = 1
theorem SemidirectProduct.inl_injective {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
Function.Injective SemidirectProduct.inl
@[simp]
theorem SemidirectProduct.inl_inj {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } {n₁ : N} {n₂ : N} :
SemidirectProduct.inl n₁ = SemidirectProduct.inl n₂ n₁ = n₂
def SemidirectProduct.inr {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
G →* N ⋊[φ] G

The canonical map G →* N ⋊[φ] G sending g to ⟨1, g⟩

Equations
• One or more equations did not get rendered due to their size.
@[simp]
theorem SemidirectProduct.left_inr {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (g : G) :
(SemidirectProduct.inr g).left = 1
@[simp]
theorem SemidirectProduct.right_inr {N : Type u_2} {G : Type u_1} [inst : ] [inst : ] {φ : G →* } (g : G) :
(SemidirectProduct.inr g).right = g
theorem SemidirectProduct.inr_injective {N : Type u_2} {G : Type u_1} [inst : ] [inst : ] {φ : G →* } :
Function.Injective SemidirectProduct.inr
@[simp]
theorem SemidirectProduct.inr_inj {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } {g₁ : G} {g₂ : G} :
SemidirectProduct.inr g₁ = SemidirectProduct.inr g₂ g₁ = g₂
theorem SemidirectProduct.inl_aut {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (g : G) (n : N) :
SemidirectProduct.inl (↑(φ g) n) = SemidirectProduct.inr g * SemidirectProduct.inl n * SemidirectProduct.inr g⁻¹
theorem SemidirectProduct.inl_aut_inv {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (g : G) (n : N) :
SemidirectProduct.inl ((φ g)⁻¹ n) = SemidirectProduct.inr g⁻¹ * SemidirectProduct.inl n * SemidirectProduct.inr g
@[simp]
theorem SemidirectProduct.mk_eq_inl_mul_inr {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (g : G) (n : N) :
{ left := n, right := g } = SemidirectProduct.inl n * SemidirectProduct.inr g
@[simp]
theorem SemidirectProduct.inl_left_mul_inr_right {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } (x : N ⋊[φ] G) :
SemidirectProduct.inl x.left * SemidirectProduct.inr x.right = x
def SemidirectProduct.rightHom {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
N ⋊[φ] G →* G

The canonical projection map N ⋊[φ] G →* G, as a group hom.

Equations
• One or more equations did not get rendered due to their size.
@[simp]
theorem SemidirectProduct.rightHom_eq_right {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
SemidirectProduct.rightHom = SemidirectProduct.right
@[simp]
theorem SemidirectProduct.rightHom_comp_inl {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
MonoidHom.comp SemidirectProduct.rightHom SemidirectProduct.inl = 1
@[simp]
theorem SemidirectProduct.rightHom_comp_inr {N : Type u_2} {G : Type u_1} [inst : ] [inst : ] {φ : G →* } :
MonoidHom.comp SemidirectProduct.rightHom SemidirectProduct.inr =
@[simp]
theorem SemidirectProduct.rightHom_inl {N : Type u_2} {G : Type u_1} [inst : ] [inst : ] {φ : G →* } (n : N) :
SemidirectProduct.rightHom (SemidirectProduct.inl n) = 1
@[simp]
theorem SemidirectProduct.rightHom_inr {N : Type u_2} {G : Type u_1} [inst : ] [inst : ] {φ : G →* } (g : G) :
SemidirectProduct.rightHom (SemidirectProduct.inr g) = g
theorem SemidirectProduct.rightHom_surjective {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
Function.Surjective SemidirectProduct.rightHom
theorem SemidirectProduct.range_inl_eq_ker_rightHom {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } :
MonoidHom.range SemidirectProduct.inl = MonoidHom.ker SemidirectProduct.rightHom
def SemidirectProduct.lift {N : Type u_1} {G : Type u_2} {H : Type u_3} [inst : ] [inst : ] [inst : ] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (MulAut.conj (f₂ g))) f₁) :
N ⋊[φ] G →* H

Define a group hom N ⋊[φ] G →* H, by defining maps N →* H and G →* H

Equations
• One or more equations did not get rendered due to their size.
@[simp]
theorem SemidirectProduct.lift_inl {N : Type u_2} {G : Type u_3} {H : Type u_1} [inst : ] [inst : ] [inst : ] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (MulAut.conj (f₂ g))) f₁) (n : N) :
↑() (SemidirectProduct.inl n) = f₁ n
@[simp]
theorem SemidirectProduct.lift_comp_inl {N : Type u_1} {G : Type u_3} {H : Type u_2} [inst : ] [inst : ] [inst : ] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (MulAut.conj (f₂ g))) f₁) :
MonoidHom.comp () SemidirectProduct.inl = f₁
@[simp]
theorem SemidirectProduct.lift_inr {N : Type u_2} {G : Type u_3} {H : Type u_1} [inst : ] [inst : ] [inst : ] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (MulAut.conj (f₂ g))) f₁) (g : G) :
↑() (SemidirectProduct.inr g) = f₂ g
@[simp]
theorem SemidirectProduct.lift_comp_inr {N : Type u_3} {G : Type u_1} {H : Type u_2} [inst : ] [inst : ] [inst : ] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (MulAut.conj (f₂ g))) f₁) :
MonoidHom.comp () SemidirectProduct.inr = f₂
theorem SemidirectProduct.lift_unique {N : Type u_2} {G : Type u_1} {H : Type u_3} [inst : ] [inst : ] [inst : ] {φ : G →* } (F : N ⋊[φ] G →* H) :
F = SemidirectProduct.lift (MonoidHom.comp F SemidirectProduct.inl) (MonoidHom.comp F SemidirectProduct.inr) (_ : ∀ (x : G), MonoidHom.comp (MonoidHom.comp F SemidirectProduct.inl) (MulEquiv.toMonoidHom (φ x)) = MonoidHom.comp (MulEquiv.toMonoidHom (MulAut.conj (↑(MonoidHom.comp F SemidirectProduct.inr) x))) (MonoidHom.comp F SemidirectProduct.inl))
theorem SemidirectProduct.hom_ext {N : Type u_2} {G : Type u_1} {H : Type u_3} [inst : ] [inst : ] [inst : ] {φ : G →* } {f : N ⋊[φ] G →* H} {g : N ⋊[φ] G →* H} (hl : MonoidHom.comp f SemidirectProduct.inl = MonoidHom.comp g SemidirectProduct.inl) (hr : MonoidHom.comp f SemidirectProduct.inr = MonoidHom.comp g SemidirectProduct.inr) :
f = g

Two maps out of the semidirect product are equal if they're equal after composition with both inl and inr

def SemidirectProduct.map {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } {N₁ : Type u_3} {G₁ : Type u_4} [inst : Group N₁] [inst : Group G₁] {φ₁ : G₁ →* MulAut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (φ₁ (f₂ g))) f₁) :
N ⋊[φ] G →* N₁ ⋊[φ₁] G₁

Define a map from N ⋊[φ] G to N₁ ⋊[φ₁] G₁ given maps N →* N₁ and G →* G₁ that satisfy a commutativity condition ∀ n g, f₁ (φ g n) = φ₁ (f₂ g) (f₁ n).

Equations
• One or more equations did not get rendered due to their size.
@[simp]
theorem SemidirectProduct.map_left {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } {N₁ : Type u_3} {G₁ : Type u_4} [inst : Group N₁] [inst : Group G₁] {φ₁ : G₁ →* MulAut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (φ₁ (f₂ g))) f₁) (g : N ⋊[φ] G) :
(↑() g).left = f₁ g.left
@[simp]
theorem SemidirectProduct.map_right {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_3} [inst : Group N₁] [inst : Group G₁] {φ₁ : G₁ →* MulAut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (φ₁ (f₂ g))) f₁) (g : N ⋊[φ] G) :
(↑() g).right = f₂ g.right
@[simp]
theorem SemidirectProduct.rightHom_comp_map {N : Type u_1} {G : Type u_2} [inst : ] [inst : ] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_3} [inst : Group N₁] [inst : Group G₁] {φ₁ : G₁ →* MulAut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (φ₁ (f₂ g))) f₁) :
MonoidHom.comp SemidirectProduct.rightHom () = MonoidHom.comp f₂ SemidirectProduct.rightHom
@[simp]
theorem SemidirectProduct.map_inl {N : Type u_3} {G : Type u_4} [inst : ] [inst : ] {φ : G →* } {N₁ : Type u_1} {G₁ : Type u_2} [inst : Group N₁] [inst : Group G₁] {φ₁ : G₁ →* MulAut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (φ₁ (f₂ g))) f₁) (n : N) :
↑() (SemidirectProduct.inl n) = SemidirectProduct.inl (f₁ n)
@[simp]
theorem SemidirectProduct.map_comp_inl {N : Type u_1} {G : Type u_4} [inst : ] [inst : ] {φ : G →* } {N₁ : Type u_2} {G₁ : Type u_3} [inst : Group N₁] [inst : Group G₁] {φ₁ : G₁ →* MulAut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (φ₁ (f₂ g))) f₁) :
MonoidHom.comp () SemidirectProduct.inl = MonoidHom.comp SemidirectProduct.inl f₁
@[simp]
theorem SemidirectProduct.map_inr {N : Type u_3} {G : Type u_4} [inst : ] [inst : ] {φ : G →* } {N₁ : Type u_1} {G₁ : Type u_2} [inst : Group N₁] [inst : Group G₁] {φ₁ : G₁ →* MulAut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (φ₁ (f₂ g))) f₁) (g : G) :
↑() (SemidirectProduct.inr g) = SemidirectProduct.inr (f₂ g)
@[simp]
theorem SemidirectProduct.map_comp_inr {N : Type u_4} {G : Type u_1} [inst : ] [inst : ] {φ : G →* } {N₁ : Type u_2} {G₁ : Type u_3} [inst : Group N₁] [inst : Group G₁] {φ₁ : G₁ →* MulAut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), MonoidHom.comp f₁ (MulEquiv.toMonoidHom (φ g)) = MonoidHom.comp (MulEquiv.toMonoidHom (φ₁ (f₂ g))) f₁) :
MonoidHom.comp () SemidirectProduct.inr = MonoidHom.comp SemidirectProduct.inr f₂