# mathlibdocumentation

group_theory.semidirect_product

# 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 φ 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 semidirect_product.ext {N : Type u_1} {G : Type u_2} {_inst_1 : group N} {_inst_2 : group G} {φ : G →* } (x y : N ⋊[φ] G) :
x.left = y.leftx.right = y.rightx = y

@[ext]
structure semidirect_product (N : Type u_1) (G : Type u_2) [group N] [group G] :
(G →* mul_aut N)Type (max u_1 u_2)
• left : N
• 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₂⟩

@[instance]
def semidirect_product.decidable_eq (N : Type u_1) [a : decidable_eq N] (G : Type u_2) [a_1 : decidable_eq G] [group N] [group G] (φ : G →* ) :

theorem semidirect_product.ext_iff {N : Type u_1} {G : Type u_2} {_inst_1 : group N} {_inst_2 : group G} {φ : G →* } (x y : N ⋊[φ] G) :
x = y x.left = y.left x.right = y.right

@[instance]
def semidirect_product.group {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :
group (N ⋊[φ] G)

Equations
@[instance]
def semidirect_product.inhabited {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :

Equations
@[simp]
theorem semidirect_product.one_left {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :
1.left = 1

@[simp]
theorem semidirect_product.one_right {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :
1.right = 1

@[simp]
theorem semidirect_product.inv_left {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (a : N ⋊[φ] G) :

@[simp]
theorem semidirect_product.inv_right {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (a : N ⋊[φ] G) :

@[simp]
theorem semidirect_product.mul_left {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (a b : N ⋊[φ] G) :
(a * b).left = (a.left) * (φ a.right) b.left

@[simp]
theorem semidirect_product.mul_right {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (a b : N ⋊[φ] G) :
(a * b).right = (a.right) * b.right

def semidirect_product.inl {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :
N →* N ⋊[φ] G

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

Equations
@[simp]
theorem semidirect_product.left_inl {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (n : N) :

@[simp]
theorem semidirect_product.right_inl {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (n : N) :

theorem semidirect_product.inl_injective {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :

@[simp]
theorem semidirect_product.inl_inj {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {n₁ n₂ : N} :
n₁ = n₂

def semidirect_product.inr {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :
G →* N ⋊[φ] G

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

Equations
@[simp]
theorem semidirect_product.left_inr {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (g : G) :

@[simp]
theorem semidirect_product.right_inr {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (g : G) :

theorem semidirect_product.inr_injective {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :

@[simp]
theorem semidirect_product.inr_inj {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {g₁ g₂ : G} :
g₁ = g₂

theorem semidirect_product.inl_aut {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (g : G) (n : N) :

theorem semidirect_product.inl_aut_inv {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (g : G) (n : N) :

@[simp]
theorem semidirect_product.mk_eq_inl_mul_inr {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (g : G) (n : N) :
n, g⟩ =

@[simp]
theorem semidirect_product.inl_left_mul_inr_right {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (x : N ⋊[φ] G) :

def semidirect_product.right_hom {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :
N ⋊[φ] G →* G

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

Equations
@[simp]
theorem semidirect_product.right_hom_eq_right {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :

@[simp]
theorem semidirect_product.right_hom_comp_inl {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :

@[simp]
theorem semidirect_product.right_hom_comp_inr {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :

@[simp]
theorem semidirect_product.right_hom_inl {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (n : N) :

@[simp]
theorem semidirect_product.right_hom_inr {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } (g : G) :

theorem semidirect_product.right_hom_surjective {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :

theorem semidirect_product.range_inl_eq_ker_right_hom {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } :

def semidirect_product.lift {N : Type u_1} {G : Type u_2} {H : Type u_3} [group N] [group G] [group H] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) :
(∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (mul_aut.conj (f₂ g))).comp f₁)N ⋊[φ] G →* H

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

Equations
@[simp]
theorem semidirect_product.lift_inl {N : Type u_1} {G : Type u_2} {H : Type u_3} [group N] [group G] [group H] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (mul_aut.conj (f₂ g))).comp f₁) (n : N) :
f₂ h) = f₁ n

@[simp]
theorem semidirect_product.lift_comp_inl {N : Type u_1} {G : Type u_2} {H : Type u_3} [group N] [group G] [group H] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (mul_aut.conj (f₂ g))).comp f₁) :
= f₁

@[simp]
theorem semidirect_product.lift_inr {N : Type u_1} {G : Type u_2} {H : Type u_3} [group N] [group G] [group H] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (mul_aut.conj (f₂ g))).comp f₁) (g : G) :
f₂ h) = f₂ g

@[simp]
theorem semidirect_product.lift_comp_inr {N : Type u_1} {G : Type u_2} {H : Type u_3} [group N] [group G] [group H] {φ : G →* } (f₁ : N →* H) (f₂ : G →* H) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (mul_aut.conj (f₂ g))).comp f₁) :
= f₂

theorem semidirect_product.lift_unique {N : Type u_1} {G : Type u_2} {H : Type u_3} [group N] [group G] [group H] {φ : G →* } (F : N ⋊[φ] G →* H) :

theorem semidirect_product.hom_ext {N : Type u_1} {G : Type u_2} {H : Type u_3} [group N] [group G] [group H] {φ : G →* } {f g : N ⋊[φ] G →* H} :

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

def semidirect_product.map {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_5} [group N₁] [group G₁] {φ₁ : G₁ →* mul_aut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) :
(∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (φ₁ (f₂ g))).comp 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
@[simp]
theorem semidirect_product.map_left {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_5} [group N₁] [group G₁] {φ₁ : G₁ →* mul_aut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (φ₁ (f₂ g))).comp f₁) (g : N ⋊[φ] G) :
( f₂ h) g).left = f₁ g.left

@[simp]
theorem semidirect_product.map_right {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_5} [group N₁] [group G₁] {φ₁ : G₁ →* mul_aut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (φ₁ (f₂ g))).comp f₁) (g : N ⋊[φ] G) :
( f₂ h) g).right = f₂ g.right

@[simp]
theorem semidirect_product.right_hom_comp_map {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_5} [group N₁] [group G₁] {φ₁ : G₁ →* mul_aut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (φ₁ (f₂ g))).comp f₁) :

@[simp]
theorem semidirect_product.map_inl {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_5} [group N₁] [group G₁] {φ₁ : G₁ →* mul_aut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (φ₁ (f₂ g))).comp f₁) (n : N) :

@[simp]
theorem semidirect_product.map_comp_inl {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_5} [group N₁] [group G₁] {φ₁ : G₁ →* mul_aut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (φ₁ (f₂ g))).comp f₁) :

@[simp]
theorem semidirect_product.map_inr {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_5} [group N₁] [group G₁] {φ₁ : G₁ →* mul_aut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (φ₁ (f₂ g))).comp f₁) (g : G) :

@[simp]
theorem semidirect_product.map_comp_inr {N : Type u_1} {G : Type u_2} [group N] [group G] {φ : G →* } {N₁ : Type u_4} {G₁ : Type u_5} [group N₁] [group G₁] {φ₁ : G₁ →* mul_aut N₁} (f₁ : N →* N₁) (f₂ : G →* G₁) (h : ∀ (g : G), f₁.comp (mul_equiv.to_monoid_hom (φ g)) = (mul_equiv.to_monoid_hom (φ₁ (f₂ g))).comp f₁) :