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.From HoTT Require Import Basics Types.Require Import Algebra.Groups.Group.Require Import Algebra.Groups.Subgroup.Require Import Algebra.Groups.QuotientGroup.Require Import Spaces.Finite.Finite.Require Import Spaces.Nat.Core Spaces.Nat.Division.Require Import Truncations.Core.LocalOpen Scope nat_scope.LocalOpen Scope mc_mult_scope.Set Universe Minimization ToSet.(** * Finite Groups *)(** ** Basic Properties *)(** The order of a group is strictly positive. *)
G: Group fin_G: Finite G
0 < fcard G
G: Group fin_G: Finite G
0 < fcard G
G: Group fin_G: Finite G f: merely (G <~> Fin.Fin (fcard G))
0 < fcard G
G: Group fin_G: Finite G f: G <~> Fin.Fin (fcard G)
0 < fcard G
G: Group fin_G: Finite G f: G <~> Fin.Fin 0
0 < 0
G: Group fin_G: Finite G n: nat f: G <~> Fin.Fin n.+1
0 < n.+1
G: Group fin_G: Finite G f: G <~> Fin.Fin 0
0 < 0
contradiction (f mon_unit).
G: Group fin_G: Finite G n: nat f: G <~> Fin.Fin n.+1
0 < n.+1
exact _.Defined.(** ** Lagrange's theorem *)(** Lagrange's Theorem - Given a finite group [G] and a finite subgroup [H] of [G], the order of [H] divides the order of [G].Note that constructively, a subgroup of a finite group cannot be shown to be finite without excluded middle. We therefore have to assume it is. This in turn implies that the subgroup is decidable. *)
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
(fcard H | fcard G)
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
(fcard H | fcard G)
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
(subgroup_index G H * fcard H)%nat = fcard G
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
fcard G = (subgroup_index G H * fcard H)%nat
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
finadd
(funz : Quotient (in_cosetL H) =>
fcard
{x : G & (funx0 : G => trunctype_type (in_class (in_cosetL H) z x0)) x}) =
(subgroup_index G H * fcard H)%nat
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
finadd
(funz : Quotient (in_cosetL H) =>
fcard
{x : G & (funx0 : G => trunctype_type (in_class (in_cosetL H) z x0)) x}) =
finadd (fun_ : LeftCoset G H => fcard H)
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
(funz : Quotient (in_cosetL H) =>
fcard
{x : G & (funx0 : G => trunctype_type (in_class (in_cosetL H) z x0)) x}) ==
(fun_ : LeftCoset G H => fcard H)
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
foralla : G, fcard {x : G & (funx0 : G => H (a^ * x0)) x} = fcard H
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H x: G
fcard {x0 : G & (funx1 : G => H (x^ * x1)) x0} = fcard H
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H x: G
{x0 : G & H (x^ * x0)} <~> H
apply equiv_sigma_in_cosetL_subgroup.Defined.(** As a corollary, the index of a subgroup is the order of the group divided by the order of the subgroup. *)
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
subgroup_index G H = fcard G / fcard H
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
subgroup_index G H = fcard G / fcard H
U: Univalence G: Group H: Subgroup G fin_G: Finite G fin_H: Finite H
(subgroup_index G H * fcard H)%nat = fcard G
apply divides_fcard_subgroup.Defined.(** Therefore we can show that the order of the quotient group [G / H] is the order of [G] divided by the order of [H]. *)
U: Univalence G: Group H: NormalSubgroup G fin_G: Finite G fin_H: Finite H
fcard (QuotientGroup G H) = fcard G / fcard H
U: Univalence G: Group H: NormalSubgroup G fin_G: Finite G fin_H: Finite H