Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
From HoTT Require Import Basics Types Truncations.Core.From HoTT Require Import Basics Types Truncations.Core.
Require Import HFiber AbelianGroup.

(* Given a group [G], we define the centralizer of an element [g : G] as a subgroup and use this to show that the cyclic subgroup generated by [g] is abelian. *)

Local Open Scope mc_scope.
Local Open Scope mc_mult_scope.

(* First we show that the collection of elements that commute with a fixed element [g] is a subgroup. *)

Definition centralizer {G : Group} (g : G)
  := fun h => g * h = h * g.

Definition centralizer_unit {G : Group} (g : G) : centralizer g mon_unit
  := grp_g1_1g _ _ idpath.

G: Group
g, h, k: G
p: centralizer g h
q: centralizer g k

centralizer g (h * k)
G: Group
g, h, k: G
p: centralizer g h
q: centralizer g k

centralizer g (h * k)
G: Group
g, h, k: G
p: centralizer g h
q: centralizer g k

g * h * k = h * k * g
G: Group
g, h, k: G
p: centralizer g h
q: centralizer g k

h * g * k = h * k * g
G: Group
g, h, k: G
p: centralizer g h
q: centralizer g k

h * (g * k) = h * k * g
G: Group
g, h, k: G
p: centralizer g h
q: centralizer g k

h * (k * g) = h * k * g
apply grp_assoc. Defined.
G: Group
g, h: G
p: centralizer g h

centralizer g h^
G: Group
g, h: G
p: centralizer g h

centralizer g h^
G: Group
g, h: G
p: g * h = h * g

g * h^ = h^ * g
G: Group
g, h: G
p: g * h = h * g

h^ * g = g * h^
G: Group
g, h: G
p: g * h = h * g

h^ * g * 1 = 1 * (g * h^)
G: Group
g, h: G
p: g * h = h * g

h^ * g * (h * h^) = h^ * h * (g * h^)
G: Group
g, h: G
p: g * h = h * g

h^ * g * h * h^ = h^ * h * g * h^
G: Group
g, h: G
p: g * h = h * g

h^ * g * h = h^ * h * g
G: Group
g, h: G
p: g * h = h * g

h^ * (g * h) = h^ * (h * g)
exact (ap (h^ *.) p). Defined.
G: Group
g: G

IsSubgroup (centralizer g)
G: Group
g: G

IsSubgroup (centralizer g)
G: Group
g: G

centralizer g 1
G: Group
g: G
forall x y : G, centralizer g x -> centralizer g y -> centralizer g (x * y)
G: Group
g: G
forall x : G, centralizer g x -> centralizer g x^
G: Group
g: G

centralizer g 1
apply centralizer_unit.
G: Group
g: G

forall x y : G, centralizer g x -> centralizer g y -> centralizer g (x * y)
apply centralizer_sgop.
G: Group
g: G

forall x : G, centralizer g x -> centralizer g x^
apply centralizer_inverse. Defined. Definition centralizer_subgroup {G : Group} (g : G) := Build_Subgroup G (centralizer g) _. (** Homomorphisms preserve centralizers. *)
G, H: Group
f: GroupHomomorphism G H
g, g': G

centralizer g g' -> centralizer (f g) (f g')
G, H: Group
f: GroupHomomorphism G H
g, g': G

centralizer g g' -> centralizer (f g) (f g')
G, H: Group
f: GroupHomomorphism G H
g, g': G

g * g' = g' * g -> f g * f g' = f g' * f g
G, H: Group
f: GroupHomomorphism G H
g, g': G
p: g * g' = g' * g

f g * f g' = f g' * f g
G, H: Group
f: GroupHomomorphism G H
g, g': G
p: g * g' = g' * g

f (g * g') = f (g' * g)
exact (ap f p). Defined. (** Isomorphisms reflect centralizers. *)
G, H: Group
f: GroupIsomorphism G H
g, g': G

centralizer (f g) (f g') -> centralizer g g'
G, H: Group
f: GroupIsomorphism G H
g, g': G

centralizer (f g) (f g') -> centralizer g g'
G, H: Group
f: GroupIsomorphism G H
g, g': G
p: centralizer (f g) (f g')

centralizer g g'
G, H: Group
f: GroupIsomorphism G H
g, g': G
p: centralizer (f g) (f g')

centralizer (f^-1 (f g)) (f^-1 (f g'))
exact (centralizer_hom (grp_iso_inverse f) _ _ p). Defined. (* Now we define cyclic subgroups. We allow any map [Unit -> G] in this definition, because in applications (such as [Z_commutative]) we have no control over the map. *) Definition cyclic_subgroup_from_unit {G : Group} (gen : Unit -> G) := subgroup_generated (hfiber gen). (* When we have a particular element [g] of [G], we could choose the predicate to be [fun h => h = g], but to fit into the above definition, we use [unit_name g], which gives the predicate [fun h => hfiber (unit_name g) h]. *) Definition cyclic_subgroup {G : Group} (g : G) := cyclic_subgroup_from_unit (unit_name g). (* Any cyclic subgroup is commutative. *)
G: Group
gen: Unit -> G

Commutative group_sgop
G: Group
gen: Unit -> G

Commutative group_sgop
G: Group
gen: Unit -> G
h, k: cyclic_subgroup_from_unit gen

group_sgop h k = group_sgop k h
G: Group
gen: Unit -> G
h: G
H: Trunc (-1) (subgroup_generated_type (hfiber gen) h)
k: cyclic_subgroup_from_unit gen

group_sgop (h; H) k = group_sgop k (h; H)
G: Group
gen: Unit -> G
h: G
H: Trunc (-1) (subgroup_generated_type (hfiber gen) h)
k: G
K: Trunc (-1) (subgroup_generated_type (hfiber gen) k)

group_sgop (h; H) (k; K) = group_sgop (k; K) (h; H)
G: Group
gen: Unit -> G
h, k: G
K: subgroup_generated_type (hfiber gen) k
H: subgroup_generated_type (hfiber gen) h

group_sgop (h; tr H) (k; tr K) = group_sgop (k; tr K) (h; tr H)
(* It's enough to check equality after including into [G]: *)
G: Group
gen: Unit -> G
h, k: G
K: subgroup_generated_type (hfiber gen) k
H: subgroup_generated_type (hfiber gen) h

subgroup_incl (cyclic_subgroup_from_unit gen) (group_sgop (h; tr H) (k; tr K)) = subgroup_incl (cyclic_subgroup_from_unit gen) (group_sgop (k; tr K) (h; tr H))
G: Group
gen: Unit -> G
h, k: G
K: subgroup_generated_type (hfiber gen) k
H: subgroup_generated_type (hfiber gen) h

h * k = k * h
G: Group
gen: Unit -> G
k: G
K: subgroup_generated_type (hfiber gen) k
h: G
p: gen tt = h

h * k = k * h
G: Group
gen: Unit -> G
k: G
K: subgroup_generated_type (hfiber gen) k
1 * k = k * 1
G: Group
gen: Unit -> G
k: G
K: subgroup_generated_type (hfiber gen) k
h1, h2: G
H1: subgroup_generated_type (hfiber gen) h1
IHH1: subgroup_generated_type (hfiber gen) h2
H2: h1 * k = k * h1
IHH2: h2 * k = k * h2
h1 * h2^ * k = k * (h1 * h2^)
G: Group
gen: Unit -> G
k: G
K: subgroup_generated_type (hfiber gen) k
h: G
p: gen tt = h

h * k = k * h
G: Group
gen: Unit -> G
k: G
K: subgroup_generated_type (hfiber gen) k

gen tt * k = k * gen tt
G: Group
gen: Unit -> G
k: G
q: gen tt = k

gen tt * k = k * gen tt
G: Group
gen: Unit -> G
gen tt * 1 = 1 * gen tt
G: Group
gen: Unit -> G
k1, k2: G
K1: subgroup_generated_type (hfiber gen) k1
IHK1: subgroup_generated_type (hfiber gen) k2
K2: gen tt * k1 = k1 * gen tt
IHK2: gen tt * k2 = k2 * gen tt
gen tt * (k1 * k2^) = k1 * k2^ * gen tt
G: Group
gen: Unit -> G
k: G
q: gen tt = k

gen tt * k = k * gen tt
G: Group
gen: Unit -> G

gen tt * gen tt = gen tt * gen tt
reflexivity.
G: Group
gen: Unit -> G

gen tt * 1 = 1 * gen tt
apply centralizer_unit.
G: Group
gen: Unit -> G
k1, k2: G
K1: subgroup_generated_type (hfiber gen) k1
IHK1: subgroup_generated_type (hfiber gen) k2
K2: gen tt * k1 = k1 * gen tt
IHK2: gen tt * k2 = k2 * gen tt

gen tt * (k1 * k2^) = k1 * k2^ * gen tt
srapply (issubgroup_in_op_inv (H:=centralizer (gen tt))); assumption.
G: Group
gen: Unit -> G
k: G
K: subgroup_generated_type (hfiber gen) k

1 * k = k * 1
symmetry; apply centralizer_unit.
G: Group
gen: Unit -> G
k: G
K: subgroup_generated_type (hfiber gen) k
h1, h2: G
H1: subgroup_generated_type (hfiber gen) h1
IHH1: subgroup_generated_type (hfiber gen) h2
H2: h1 * k = k * h1
IHH2: h2 * k = k * h2

h1 * h2^ * k = k * (h1 * h2^)
G: Group
gen: Unit -> G
k: G
K: subgroup_generated_type (hfiber gen) k
h1, h2: G
H1: subgroup_generated_type (hfiber gen) h1
IHH1: subgroup_generated_type (hfiber gen) h2
H2: h1 * k = k * h1
IHH2: h2 * k = k * h2

k * (h1 * h2^) = h1 * h2^ * k
srapply (issubgroup_in_op_inv (H:=centralizer k)); unfold centralizer; symmetry; assumption. Defined. Definition abgroup_cyclic_subgroup {G : Group} (g : G) : AbGroup := Build_AbGroup (cyclic_subgroup g) _. (** ** Centralizers of general subsets *) (** The centralizer of the elements of [G] for which [H] holds. *) Definition subtype_centralizer {G : Group} (H : G -> Type) : G -> Type (* Note the order of operations here. We do this to match the original proofs for the centraliser of an element. *) := fun g => merely (forall h : G, H h -> centralizer h g). (** The centralizer of any subset of [G] is a subgroup of [G]. *)
G: Group
H: G -> Type

IsSubgroup (subtype_centralizer H)
G: Group
H: G -> Type

IsSubgroup (subtype_centralizer H)
G: Group
H: G -> Type

subtype_centralizer H 1
G: Group
H: G -> Type
forall x y : G, subtype_centralizer H x -> subtype_centralizer H y -> subtype_centralizer H (x * y)
G: Group
H: G -> Type
forall x : G, subtype_centralizer H x -> subtype_centralizer H x^
G: Group
H: G -> Type

subtype_centralizer H 1
G: Group
H: G -> Type

forall h : G, H h -> centralizer h 1
G: Group
H: G -> Type
h: G
Hh: H h

centralizer h 1
exact (centralizer_unit h).
G: Group
H: G -> Type

forall x y : G, subtype_centralizer H x -> subtype_centralizer H y -> subtype_centralizer H (x * y)
G: Group
H: G -> Type
x, y: G
cx: subtype_centralizer H x
cy: subtype_centralizer H y

subtype_centralizer H (x * y)
G: Group
H: G -> Type
x, y: G
cy: forall h : G, H h -> centralizer h y
cx: forall h : G, H h -> centralizer h x

forall h : G, H h -> centralizer h (x * y)
G: Group
H: G -> Type
x, y: G
cy: forall h0 : G, H h0 -> centralizer h0 y
cx: forall h0 : G, H h0 -> centralizer h0 x
h: G
Hh: H h

centralizer h (x * y)
exact (centralizer_sgop _ _ _ (cx h Hh) (cy h Hh)).
G: Group
H: G -> Type

forall x : G, subtype_centralizer H x -> subtype_centralizer H x^
G: Group
H: G -> Type
x: G
Hx: subtype_centralizer H x

subtype_centralizer H x^
G: Group
H: G -> Type
x: G
Hx: forall h : G, H h -> centralizer h x

forall h : G, H h -> centralizer h x^
G: Group
H: G -> Type
x: G
Hx: forall h0 : G, H h0 -> centralizer h0 x
h: G
Hh: H h

centralizer h x^
exact (centralizer_inverse h x (Hx h Hh)). Defined. Definition subtype_centralizer_subgroup {G : Group} (H : G -> Type) := Build_Subgroup G (subtype_centralizer H) _.