Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2018 Mitchell Rowett. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mitchell Rowett, Scott Morrison
! This file was ported from Lean 3 source module group_theory.coset
! leanprover-community/mathlib commit f7fc89d5d5ff1db2d1242c7bb0e9062ce47ef47c
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Quotient
import Mathlib.Data.Fintype.Prod
import Mathlib.GroupTheory.GroupAction.Basic
import Mathlib.GroupTheory.Subgroup.MulOpposite
/-!
# Cosets
This file develops the basic theory of left and right cosets.
## Main definitions
* `leftCoset a s`: the left coset `a * s` for an element `a : α` and a subset `s ⊆ α`, for an
`AddGroup` this is `leftAddCoset a s`.
* `rightCoset s a`: the right coset `s * a` for an element `a : α` and a subset `s ⊆ α`, for an
`AddGroup` this is `rightAddCoset s a`.
* `QuotientGroup.quotient s`: the quotient type representing the left cosets with respect to a
subgroup `s`, for an `AddGroup` this is `QuotientAddGroup.quotient s`.
* `QuotientGroup.mk`: the canonical map from `α` to `α/s` for a subgroup `s` of `α`, for an
`AddGroup` this is `QuotientAddGroup.mk`.
* `Subgroup.leftCosetEquivSubgroup`: the natural bijection between a left coset and the subgroup,
for an `AddGroup` this is `AddSubgroup.leftCosetEquivAddSubgroup`.
## Notation
* `a *l s`: for `leftCoset a s`.
* `a +l s`: for `leftAddCoset a s`.
* `s *r a`: for `rightCoset s a`.
* `s +r a`: for `rightAddCoset s a`.
* `G ⧸ H` is the quotient of the (additive) group `G` by the (additive) subgroup `H`
-/
open Set Function
variable { α : Type _ : Type (?u.47374+1) Type _}
/-- The left coset `a * s` for an element `a : α` and a subset `s : Set α` -/
@[ to_additive leftAddCoset : {α : Type u_1} → [inst : Add α ] → α → Set α → Set α leftAddCoset "The left coset `a+s` for an element `a : α` and a subset `s : set α`"]
def leftCoset [ Mul α ] ( a : α ) ( s : Set α ) : Set α :=
( fun x => a * x ) '' s
#align left_coset leftCoset
#align left_add_coset leftAddCoset : {α : Type u_1} → [inst : Add α ] → α → Set α → Set α leftAddCoset
/-- The right coset `s * a` for an element `a : α` and a subset `s : Set α` -/
@[ to_additive rightAddCoset : {α : Type u_1} → [inst : Add α ] → Set α → α → Set α rightAddCoset
"The right coset `s+a` for an element `a : α` and a subset `s : set α`"]
def rightCoset [ Mul α ] ( s : Set α ) ( a : α ) : Set α :=
( fun x => x * a ) '' s
#align right_coset rightCoset
#align right_add_coset rightAddCoset : {α : Type u_1} → [inst : Add α ] → Set α → α → Set α rightAddCoset
@[inherit_doc]
scoped [Coset] infixl :70 " *l " => leftCoset
@[inherit_doc]
scoped [Coset] infixl :70 " +l " => leftAddCoset : {α : Type u_1} → [inst : Add α ] → α → Set α → Set α leftAddCoset
@[inherit_doc]
scoped [Coset] infixl :70 " *r " => rightCoset
@[inherit_doc]
scoped [Coset] infixl :70 " +r " => rightAddCoset : {α : Type u_1} → [inst : Add α ] → Set α → α → Set α rightAddCoset
open Coset
section CosetMul
variable [ Mul α ]
@[ to_additive mem_leftAddCoset : ∀ {α : Type u_1} [inst : Add α ] {s : Set α } {x : α } (a : α ), x ∈ s → a + x ∈ a +l s mem_leftAddCoset]
theorem mem_leftCoset : ∀ {α : Type u_1} [inst : Mul α ] {s : Set α } {x : α } (a : α ), x ∈ s → a * x ∈ a *l s mem_leftCoset { s : Set α } { x : α } ( a : α ) ( hxS : x ∈ s ) : a * x ∈ a *l s :=
mem_image_of_mem : ∀ {α : Type ?u.31627} {β : Type ?u.31628} (f : α → β ) {x : α } {a : Set α }, x ∈ a → f x ∈ f '' a mem_image_of_mem ( fun b : α => a * b ) hxS
#align mem_left_coset mem_leftCoset : ∀ {α : Type u_1} [inst : Mul α ] {s : Set α } {x : α } (a : α ), x ∈ s → a * x ∈ a *l s mem_leftCoset
#align mem_left_add_coset mem_leftAddCoset : ∀ {α : Type u_1} [inst : Add α ] {s : Set α } {x : α } (a : α ), x ∈ s → a + x ∈ a +l s mem_leftAddCoset
@[ to_additive mem_rightAddCoset : ∀ {α : Type u_1} [inst : Add α ] {s : Set α } {x : α } (a : α ), x ∈ s → x + a ∈ s +r a mem_rightAddCoset]
theorem mem_rightCoset : ∀ {s : Set α } {x : α } (a : α ), x ∈ s → x * a ∈ s *r a mem_rightCoset { s : Set α } { x : α } ( a : α ) ( hxS : x ∈ s ) : x * a ∈ s *r a :=
mem_image_of_mem : ∀ {α : Type ?u.31913} {β : Type ?u.31914} (f : α → β ) {x : α } {a : Set α }, x ∈ a → f x ∈ f '' a mem_image_of_mem ( fun b : α => b * a ) hxS
#align mem_right_coset mem_rightCoset : ∀ {α : Type u_1} [inst : Mul α ] {s : Set α } {x : α } (a : α ), x ∈ s → x * a ∈ s *r a mem_rightCoset
#align mem_right_add_coset mem_rightAddCoset : ∀ {α : Type u_1} [inst : Add α ] {s : Set α } {x : α } (a : α ), x ∈ s → x + a ∈ s +r a mem_rightAddCoset
/-- Equality of two left cosets `a * s` and `b * s`. -/
@[ to_additive LeftAddCosetEquivalence : {α : Type u_1} → [inst : Add α ] → Set α → α → α → Prop LeftAddCosetEquivalence "Equality of two left cosets `a + s` and `b + s`."]
def LeftCosetEquivalence : {α : Type u_1} → [inst : Mul α ] → Set α → α → α → Prop LeftCosetEquivalence ( s : Set α ) ( a b : α ) :=
a *l s = b *l s
#align left_coset_equivalence LeftCosetEquivalence : {α : Type u_1} → [inst : Mul α ] → Set α → α → α → Prop LeftCosetEquivalence
#align left_add_coset_equivalence LeftAddCosetEquivalence : {α : Type u_1} → [inst : Add α ] → Set α → α → α → Prop LeftAddCosetEquivalence
@[ to_additive leftAddCosetEquivalence_rel ]
theorem leftCosetEquivalence_rel ( s : Set α ) : Equivalence ( LeftCosetEquivalence : {α : Type ?u.32131} → [inst : Mul α ] → Set α → α → α → Prop LeftCosetEquivalence s ) :=
@ Equivalence.mk : ∀ {α : Sort ?u.32189} {r : α → α → Prop },
(∀ (x : α ), r x x ) → (∀ {x y : α }, r x y → r y x ) → (∀ {x y z : α }, r x y → r y z → r x z ) → Equivalence r Equivalence.mk _ ( LeftCosetEquivalence : {α : Type ?u.32191} → [inst : Mul α ] → Set α → α → α → Prop LeftCosetEquivalence s ) ( fun _ => rfl : ∀ {α : Sort ?u.32254} {a : α }, a = a rfl) Eq.symm : ∀ {α : Sort ?u.32264} {a b : α }, a = b → b = a Eq.symm Eq.trans : ∀ {α : Sort ?u.32279} {a b c : α }, a = b → b = c → a = c Eq.trans
#align left_coset_equivalence_rel leftCosetEquivalence_rel
#align left_add_coset_equivalence_rel leftAddCosetEquivalence_rel
/-- Equality of two right cosets `s * a` and `s * b`. -/
@[ to_additive RightAddCosetEquivalence : {α : Type u_1} → [inst : Add α ] → Set α → α → α → Prop RightAddCosetEquivalence "Equality of two right cosets `s + a` and `s + b`."]
def RightCosetEquivalence : {α : Type u_1} → [inst : Mul α ] → Set α → α → α → Prop RightCosetEquivalence ( s : Set α ) ( a b : α ) :=
s *r a = s *r b
#align right_coset_equivalence RightCosetEquivalence : {α : Type u_1} → [inst : Mul α ] → Set α → α → α → Prop RightCosetEquivalence
#align right_add_coset_equivalence RightAddCosetEquivalence : {α : Type u_1} → [inst : Add α ] → Set α → α → α → Prop RightAddCosetEquivalence
@[ to_additive rightAddCosetEquivalence_rel ]
theorem rightCosetEquivalence_rel ( s : Set α ) : Equivalence ( RightCosetEquivalence : {α : Type ?u.32430} → [inst : Mul α ] → Set α → α → α → Prop RightCosetEquivalence s ) :=
@ Equivalence.mk : ∀ {α : Sort ?u.32488} {r : α → α → Prop },
(∀ (x : α ), r x x ) → (∀ {x y : α }, r x y → r y x ) → (∀ {x y z : α }, r x y → r y z → r x z ) → Equivalence r Equivalence.mk _ ( RightCosetEquivalence : {α : Type ?u.32490} → [inst : Mul α ] → Set α → α → α → Prop RightCosetEquivalence s ) ( fun _a => rfl : ∀ {α : Sort ?u.32553} {a : α }, a = a rfl) Eq.symm : ∀ {α : Sort ?u.32563} {a b : α }, a = b → b = a Eq.symm Eq.trans : ∀ {α : Sort ?u.32578} {a b c : α }, a = b → b = c → a = c Eq.trans
#align right_coset_equivalence_rel rightCosetEquivalence_rel
#align right_add_coset_equivalence_rel rightAddCosetEquivalence_rel
end CosetMul
section CosetSemigroup
variable [ Semigroup : Type ?u.32635 → Type ?u.32635 Semigroup α ]
@[ to_additive ( attr := simp ) leftAddCoset_assoc ]
theorem leftCoset_assoc ( s : Set α ) ( a b : α ) : a *l ( b *l s ) = a * b *l s := by
simp [ leftCoset : {α : Type ?u.34181} → [inst : Mul α ] → α → Set α → Set α leftCoset, rightCoset : {α : Type ?u.34196} → [inst : Mul α ] → Set α → α → Set α rightCoset, ( image_comp : ∀ {α : Type ?u.34212} {β : Type ?u.34214} {γ : Type ?u.34213} (f : β → γ ) (g : α → β ) (a : Set α ),
f ∘ g '' a = f '' (g '' a ) image_comp _ _ _ ). symm : ∀ {α : Sort ?u.34221} {a b : α }, a = b → b = a symm , Function.comp : {α : Sort ?u.34276} → {β : Sort ?u.34275} → {δ : Sort ?u.34274} → (β → δ ) → (α → β ) → α → δ Function.comp, mul_assoc : ∀ {G : Type ?u.34286} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoc]
#align left_coset_assoc leftCoset_assoc
#align left_add_coset_assoc leftAddCoset_assoc
@[ to_additive ( attr := simp ) rightAddCoset_assoc ]
theorem rightCoset_assoc : ∀ (s : Set α ) (a b : α ), s *r a *r b = s *r (a * b ) rightCoset_assoc ( s : Set α ) ( a b : α ) : s *r a *r b = s *r ( a * b ) := by
simp [ leftCoset : {α : Type ?u.37309} → [inst : Mul α ] → α → Set α → Set α leftCoset, rightCoset : {α : Type ?u.37324} → [inst : Mul α ] → Set α → α → Set α rightCoset, ( image_comp : ∀ {α : Type ?u.37340} {β : Type ?u.37342} {γ : Type ?u.37341} (f : β → γ ) (g : α → β ) (a : Set α ),
f ∘ g '' a = f '' (g '' a ) image_comp _ _ _ ). symm : ∀ {α : Sort ?u.37349} {a b : α }, a = b → b = a symm , Function.comp : {α : Sort ?u.37404} → {β : Sort ?u.37403} → {δ : Sort ?u.37402} → (β → δ ) → (α → β ) → α → δ Function.comp, mul_assoc : ∀ {G : Type ?u.37414} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoc]
#align right_coset_assoc rightCoset_assoc
#align right_add_coset_assoc rightAddCoset_assoc
@[ to_additive leftAddCoset_rightAddCoset ]
theorem leftCoset_rightCoset ( s : Set α ) ( a b : α ) : a *l s *r b = a *l ( s *r b ) := by
simp [ leftCoset : {α : Type ?u.39931} → [inst : Mul α ] → α → Set α → Set α leftCoset, rightCoset : {α : Type ?u.39946} → [inst : Mul α ] → Set α → α → Set α rightCoset, ( image_comp : ∀ {α : Type ?u.39962} {β : Type ?u.39964} {γ : Type ?u.39963} (f : β → γ ) (g : α → β ) (a : Set α ),
f ∘ g '' a = f '' (g '' a ) image_comp _ _ _ ). symm : ∀ {α : Sort ?u.39971} {a b : α }, a = b → b = a symm , Function.comp : {α : Sort ?u.40026} → {β : Sort ?u.40025} → {δ : Sort ?u.40024} → (β → δ ) → (α → β ) → α → δ Function.comp, mul_assoc : ∀ {G : Type ?u.40036} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoc]
#align left_coset_right_coset leftCoset_rightCoset
#align left_add_coset_right_add_coset leftAddCoset_rightAddCoset
end CosetSemigroup
section CosetMonoid
variable [ Monoid α ] ( s : Set α )
@[ to_additive ( attr := simp ) zero_leftAddCoset ]
theorem one_leftCoset : 1 *l s = s :=
Set.ext : ∀ {α : Type ?u.42640} {a b : Set α }, (∀ (x : α ), x ∈ a ↔ x ∈ b ) → a = b Set.ext <| by ∀ (x : α ), x ∈ 1 *l s ↔ x ∈ s simp [ leftCoset : {α : Type ?u.42649} → [inst : Mul α ] → α → Set α → Set α leftCoset]
#align one_left_coset one_leftCoset
#align zero_left_add_coset zero_leftAddCoset
@[ to_additive ( attr := simp ) rightAddCoset_zero ]
theorem rightCoset_one : s *r 1 = s :=
Set.ext : ∀ {α : Type ?u.45227} {a b : Set α }, (∀ (x : α ), x ∈ a ↔ x ∈ b ) → a = b Set.ext <| by ∀ (x : α ), x ∈ s *r 1 ↔ x ∈ s simp [ rightCoset : {α : Type ?u.45236} → [inst : Mul α ] → Set α → α → Set α rightCoset]
#align right_coset_one rightCoset_one
#align right_add_coset_zero rightAddCoset_zero
end CosetMonoid
section CosetSubmonoid
open Submonoid
variable [ Monoid α ] ( s : Submonoid α )
@[ to_additive mem_own_leftAddCoset ]
theorem mem_own_leftCoset ( a : α ) : a ∈ a *l s :=
suffices a * 1 ∈ a *l s by simpa
mem_leftCoset : ∀ {α : Type ?u.49430} [inst : Mul α ] {s : Set α } {x : α } (a : α ), x ∈ s → a * x ∈ a *l s mem_leftCoset a ( one_mem s : 1 ∈ s )
#align mem_own_left_coset mem_own_leftCoset
#align mem_own_left_add_coset mem_own_leftAddCoset
@[ to_additive mem_own_rightAddCoset ]
theorem mem_own_rightCoset ( a : α ) : a ∈ ( s : Set α ) *r a :=
suffices 1 * a ∈ ( s : Set α ) *r a by simpa
mem_rightCoset : ∀ {α : Type ?u.52648} [inst : Mul α ] {s : Set α } {x : α } (a : α ), x ∈ s → x * a ∈ s *r a mem_rightCoset a ( one_mem s : 1 ∈ s )
#align mem_own_right_coset mem_own_rightCoset
#align mem_own_right_add_coset mem_own_rightAddCoset
@[ to_additive mem_leftAddCoset_leftAddCoset ]
theorem mem_leftCoset_leftCoset : ∀ {a : α }, a *l ↑s = ↑s → a ∈ s mem_leftCoset_leftCoset { a : α } ( ha : a *l s = s ) : a ∈ s := by
rw [ ← SetLike.mem_coe : ∀ {A : Type ?u.54708} {B : Type ?u.54707} [i : SetLike A B ] {p : A } {x : B }, x ∈ ↑p ↔ x ∈ p SetLike.mem_coe, ← ha ] ; exact mem_own_leftCoset s a
#align mem_left_coset_left_coset mem_leftCoset_leftCoset
#align mem_left_add_coset_left_add_coset mem_leftAddCoset_leftAddCoset
@[ to_additive mem_rightAddCoset_rightAddCoset ]
theorem mem_rightCoset_rightCoset { a : α } ( ha : ( s : Set α ) *r a = s ) : a ∈ s := by
rw [ ← SetLike.mem_coe : ∀ {A : Type ?u.55716} {B : Type ?u.55715} [i : SetLike A B ] {p : A } {x : B }, x ∈ ↑p ↔ x ∈ p SetLike.mem_coe, ← ha ] ; exact mem_own_rightCoset s a
#align mem_right_coset_right_coset mem_rightCoset_rightCoset
#align mem_right_add_coset_right_add_coset mem_rightAddCoset_rightAddCoset
end CosetSubmonoid
section CosetGroup
variable [ Group α ] { s : Set α } { x : α }
@[ to_additive mem_leftAddCoset_iff : ∀ {α : Type u_1} [inst : AddGroup α ] {s : Set α } {x : α } (a : α ), x ∈ a +l s ↔ - a + x ∈ s mem_leftAddCoset_iff]
theorem mem_leftCoset_iff : ∀ (a : α ), x ∈ a *l s ↔ a ⁻¹ * x ∈ s mem_leftCoset_iff ( a : α ) : x ∈ a *l s ↔ a ⁻¹ * x ∈ s :=
Iff.intro : ∀ {a b : Prop }, (a → b ) → (b → a ) → (a ↔ b ) Iff.intro ( fun ⟨ b , hb , Eq : (fun x => a * x ) b = x Eq ⟩ => by α : Type u_1inst✝ : Group α s : Set α x, a : α x✝ : x ∈ a *l s b : α hb : b ∈ s Eq : (fun x => a * x ) b = x simp [ Eq : (fun x => a * x ) b = x Eq . symm : ∀ {α : Sort ?u.58155} {a b : α }, a = b → b = a symm, hb ] ) fun h => ⟨ a ⁻¹ * x , h , by (fun x => a * x ) (a ⁻¹ * x ) = x simp ⟩
#align mem_left_coset_iff mem_leftCoset_iff : ∀ {α : Type u_1} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ a *l s ↔ a ⁻¹ * x ∈ s mem_leftCoset_iff
#align mem_left_add_coset_iff mem_leftAddCoset_iff : ∀ {α : Type u_1} [inst : AddGroup α ] {s : Set α } {x : α } (a : α ), x ∈ a +l s ↔ - a + x ∈ s mem_leftAddCoset_iff
@[ to_additive mem_rightAddCoset_iff : ∀ {α : Type u_1} [inst : AddGroup α ] {s : Set α } {x : α } (a : α ), x ∈ s +r a ↔ x + - a ∈ s mem_rightAddCoset_iff]
theorem mem_rightCoset_iff : ∀ {α : Type u_1} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ s *r a ↔ x * a ⁻¹ ∈ s mem_rightCoset_iff ( a : α ) : x ∈ s *r a ↔ x * a ⁻¹ ∈ s :=
Iff.intro : ∀ {a b : Prop }, (a → b ) → (b → a ) → (a ↔ b ) Iff.intro ( fun ⟨ b , hb , Eq : (fun x => x * a ) b = x Eq ⟩ => by α : Type u_1inst✝ : Group α s : Set α x, a : α x✝ : x ∈ s *r a b : α hb : b ∈ s Eq : (fun x => x * a ) b = x simp [ Eq : (fun x => x * a ) b = x Eq . symm : ∀ {α : Sort ?u.61092} {a b : α }, a = b → b = a symm, hb ] ) fun h => ⟨ x * a ⁻¹, h , by (fun x => x * a ) (x * a ⁻¹ ) = x simp ⟩
#align mem_right_coset_iff mem_rightCoset_iff : ∀ {α : Type u_1} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ s *r a ↔ x * a ⁻¹ ∈ s mem_rightCoset_iff
#align mem_right_add_coset_iff mem_rightAddCoset_iff : ∀ {α : Type u_1} [inst : AddGroup α ] {s : Set α } {x : α } (a : α ), x ∈ s +r a ↔ x + - a ∈ s mem_rightAddCoset_iff
end CosetGroup
section CosetSubgroup
open Subgroup
variable [ Group α ] ( s : Subgroup α )
@[ to_additive leftAddCoset_mem_leftAddCoset ]
theorem leftCoset_mem_leftCoset : ∀ {α : Type u_1} [inst : Group α ] (s : Subgroup α ) {a : α }, a ∈ s → a *l ↑s = ↑s leftCoset_mem_leftCoset { a : α } ( ha : a ∈ s ) : a *l s = s :=
Set.ext : ∀ {α : Type ?u.62185} {a b : Set α }, (∀ (x : α ), x ∈ a ↔ x ∈ b ) → a = b Set.ext <| by ∀ (x : α ), x ∈ a *l ↑s ↔ x ∈ ↑s simp [ mem_leftCoset_iff : ∀ {α : Type ?u.62195} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ a *l s ↔ a ⁻¹ * x ∈ s mem_leftCoset_iff, mul_mem_cancel_left ( s . inv_mem ha )]
#align left_coset_mem_left_coset leftCoset_mem_leftCoset : ∀ {α : Type u_1} [inst : Group α ] (s : Subgroup α ) {a : α }, a ∈ s → a *l ↑s = ↑s leftCoset_mem_leftCoset
#align left_add_coset_mem_left_add_coset leftAddCoset_mem_leftAddCoset
@[ to_additive rightAddCoset_mem_rightAddCoset ]
theorem rightCoset_mem_rightCoset : ∀ {α : Type u_1} [inst : Group α ] (s : Subgroup α ) {a : α }, a ∈ s → ↑s *r a = ↑s rightCoset_mem_rightCoset { a : α } ( ha : a ∈ s ) : ( s : Set α ) *r a = s :=
Set.ext : ∀ {α : Type ?u.64376} {a b : Set α }, (∀ (x : α ), x ∈ a ↔ x ∈ b ) → a = b Set.ext fun b => by simp [ mem_rightCoset_iff : ∀ {α : Type ?u.64394} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ s *r a ↔ x * a ⁻¹ ∈ s mem_rightCoset_iff, mul_mem_cancel_right ( s . inv_mem ha )]
#align right_coset_mem_right_coset rightCoset_mem_rightCoset : ∀ {α : Type u_1} [inst : Group α ] (s : Subgroup α ) {a : α }, a ∈ s → ↑s *r a = ↑s rightCoset_mem_rightCoset
#align right_add_coset_mem_right_add_coset rightAddCoset_mem_rightAddCoset
@[ to_additive ]
theorem orbit_subgroup_eq_rightCoset ( a : α ) : MulAction.orbit s a = s *r a :=
Set.ext : ∀ {α : Type ?u.66584} {a b : Set α }, (∀ (x : α ), x ∈ a ↔ x ∈ b ) → a = b Set.ext fun _b => ⟨ fun ⟨ c , d : (fun x => x • a ) c = _b d ⟩ => ⟨ c , c . 2 , d : (fun x => x • a ) c = _b d ⟩, fun ⟨ c , d , e : (fun x => x * a ) c = _b e ⟩ => ⟨⟨ c , d ⟩, e : (fun x => x * a ) c = _b e ⟩⟩
#align orbit_subgroup_eq_right_coset orbit_subgroup_eq_rightCoset
#align orbit_add_subgroup_eq_right_coset orbit_addSubgroup_eq_rightCoset
@[ to_additive ]
theorem orbit_subgroup_eq_self_of_mem { a : α } ( ha : a ∈ s ) : MulAction.orbit s a = s :=
( orbit_subgroup_eq_rightCoset s a ). trans : ∀ {α : Sort ?u.68623} {a b c : α }, a = b → b = c → a = c trans ( rightCoset_mem_rightCoset : ∀ {α : Type ?u.68637} [inst : Group α ] (s : Subgroup α ) {a : α }, a ∈ s → ↑s *r a = ↑s rightCoset_mem_rightCoset s ha )
#align orbit_subgroup_eq_self_of_mem orbit_subgroup_eq_self_of_mem
#align orbit_add_subgroup_eq_self_of_mem orbit_addSubgroup_eq_self_of_mem
@[ to_additive ]
theorem orbit_subgroup_one_eq_self : MulAction.orbit s ( 1 : α ) = s :=
orbit_subgroup_eq_self_of_mem s s . one_mem
#align orbit_subgroup_one_eq_self orbit_subgroup_one_eq_self
#align orbit_add_subgroup_zero_eq_self orbit_addSubgroup_zero_eq_self
@[ to_additive eq_addCosets_of_normal ]
theorem eq_cosets_of_normal : Normal s → ∀ (g : α ), g *l ↑s = ↑s *r g eq_cosets_of_normal ( N : s . Normal ) ( g : α ) : g *l s = s *r g :=
Set.ext : ∀ {α : Type ?u.70958} {a b : Set α }, (∀ (x : α ), x ∈ a ↔ x ∈ b ) → a = b Set.ext fun a => by simp [ mem_leftCoset_iff : ∀ {α : Type ?u.70976} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ a *l s ↔ a ⁻¹ * x ∈ s mem_leftCoset_iff, mem_rightCoset_iff : ∀ {α : Type ?u.71008} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ s *r a ↔ x * a ⁻¹ ∈ s mem_rightCoset_iff] ; rw [ N . mem_comm_iff ]
#align eq_cosets_of_normal eq_cosets_of_normal
#align eq_add_cosets_of_normal eq_addCosets_of_normal
@[ to_additive normal_of_eq_addCosets ]
theorem normal_of_eq_cosets ( h : ∀ (g : α ), g *l ↑s = ↑s *r g h : ∀ g : α , g *l s = s *r g ) : s . Normal :=
⟨ fun a ha g =>
show g * a * g ⁻¹ ∈ ( s : Set α ) by rw [ ← mem_rightCoset_iff : ∀ {α : Type ?u.73606} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ s *r a ↔ x * a ⁻¹ ∈ s mem_rightCoset_iff, ← h : ∀ (g : α ), g *l ↑s = ↑s *r g h ] ; exact mem_leftCoset : ∀ {α : Type ?u.73694} [inst : Mul α ] {s : Set α } {x : α } (a : α ), x ∈ s → a * x ∈ a *l s mem_leftCoset g ha ⟩
#align normal_of_eq_cosets normal_of_eq_cosets
#align normal_of_eq_add_cosets normal_of_eq_addCosets
@[ to_additive normal_iff_eq_addCosets ]
theorem normal_iff_eq_cosets : s . Normal ↔ ∀ g : α , g *l s = s *r g :=
⟨@ eq_cosets_of_normal _ _ s , normal_of_eq_cosets s ⟩
#align normal_iff_eq_cosets normal_iff_eq_cosets
#align normal_iff_eq_add_cosets normal_iff_eq_addCosets
@[ to_additive leftAddCoset_eq_iff ]
theorem leftCoset_eq_iff { x y : α } : leftCoset : {α : Type ?u.74775} → [inst : Mul α ] → α → Set α → Set α leftCoset x s = leftCoset : {α : Type ?u.75282} → [inst : Mul α ] → α → Set α → Set α leftCoset y s ↔ x ⁻¹ * y ∈ s := by
rw [ Set.ext_iff : ∀ {α : Type ?u.76092} {s t : Set α }, s = t ↔ ∀ (x : α ), x ∈ s ↔ x ∈ t Set.ext_iff]
simp_rw [ mem_leftCoset_iff : ∀ {α : Type ?u.76279} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ a *l s ↔ a ⁻¹ * x ∈ s mem_leftCoset_iff, SetLike.mem_coe ]
constructor
· intro h
apply ( h y ). mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr
rw [ mul_left_inv : ∀ {G : Type ?u.76609} [inst : Group G ] (a : G ), a ⁻¹ * a = 1 mul_left_inv]
exact s . one_mem
· intro h z
rw [ ← mul_inv_cancel_right : ∀ {G : Type ?u.76680} [inst : Group G ] (a b : G ), a * b * b ⁻¹ = a mul_inv_cancel_right x ⁻¹ y ]
rw [ mul_assoc : ∀ {G : Type ?u.76856} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoc]
exact s . mul_mem_cancel_left : ∀ {G : Type ?u.77240} [inst : Group G ] (H : Subgroup G ) {x y : G }, x ∈ H → (x * y ∈ H ↔ y ∈ H ) mul_mem_cancel_left h
#align left_coset_eq_iff leftCoset_eq_iff
#align left_add_coset_eq_iff leftAddCoset_eq_iff
@[ to_additive rightAddCoset_eq_iff ]
theorem rightCoset_eq_iff { x y : α } : rightCoset : {α : Type ?u.77368} → [inst : Mul α ] → Set α → α → Set α rightCoset (↑ s ) x = rightCoset : {α : Type ?u.77958} → [inst : Mul α ] → Set α → α → Set α rightCoset s y ↔ y * x ⁻¹ ∈ s := by
rw [ Set.ext_iff : ∀ {α : Type ?u.78852} {s t : Set α }, s = t ↔ ∀ (x : α ), x ∈ s ↔ x ∈ t Set.ext_iff]
simp_rw [ mem_rightCoset_iff : ∀ {α : Type ?u.79039} [inst : Group α ] {s : Set α } {x : α } (a : α ), x ∈ s *r a ↔ x * a ⁻¹ ∈ s mem_rightCoset_iff, SetLike.mem_coe ]
constructor
· intro h
apply ( h y ). mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr
rw [ mul_right_inv : ∀ {G : Type ?u.79227} [inst : Group G ] (a : G ), a * a ⁻¹ = 1 mul_right_inv]
exact s . one_mem
· intro h z
rw [ ← inv_mul_cancel_left : ∀ {G : Type ?u.79296} [inst : Group G ] (a b : G ), a ⁻¹ * (a * b ) = b inv_mul_cancel_left y x ⁻¹ ]
rw [ ← mul_assoc : ∀ {G : Type ?u.79472} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoc]
exact s . mul_mem_cancel_right : ∀ {G : Type ?u.79856} [inst : Group G ] (H : Subgroup G ) {x y : G }, x ∈ H → (y * x ∈ H ↔ y ∈ H ) mul_mem_cancel_right h
#align right_coset_eq_iff rightCoset_eq_iff
#align right_add_coset_eq_iff rightAddCoset_eq_iff
end CosetSubgroup
-- porting note: see https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/.E2.9C.94.20to_additive.2Emap_namespace
run_cmd Lean.Elab.Command.liftCoreM <| ToAdditive.insertTranslation `QuotientGroup `QuotientAddGroup
namespace QuotientGroup
variable [ Group α ] ( s : Subgroup α )
/-- The equivalence relation corresponding to the partition of a group by left cosets
of a subgroup.-/
@[ to_additive "The equivalence relation corresponding to the partition of a group by left cosets
of a subgroup."]
def leftRel : Setoid : Sort ?u.80240 → Sort (max1?u.80240) Setoid α :=
MulAction.orbitRel ( Subgroup.opposite s ) α
#align quotient_group.left_rel QuotientGroup.leftRel
#align quotient_add_group.left_rel QuotientAddGroup.leftRel
variable { s }
@[ to_additive ]
theorem leftRel_apply { x y : α } : @ Setoid.r _ ( leftRel s ) x y ↔ x ⁻¹ * y ∈ s :=
calc
(∃ a : { x // x ∈ ↑Subgroup.opposite s } a : Subgroup.opposite s , y * MulOpposite.unop : {α : Type ?u.82027} → α ᵐᵒᵖ → α MulOpposite.unop a : { x // x ∈ ↑Subgroup.opposite s } a = x ) ↔ ∃ a : s , y * a = x :=
s . oppositeEquiv : {G : Type ?u.83593} → [inst : Group G ] → (H : Subgroup G ) → { x // x ∈ H } ≃ { x // x ∈ ↑Subgroup.opposite H } oppositeEquiv. symm : {α : Sort ?u.83597} → {β : Sort ?u.83596} → α ≃ β → β ≃ α symm. exists_congr_left : ∀ {α : Sort ?u.83602} {β : Sort ?u.83603} (f : α ≃ β ) {p : α → Prop }, (∃ a , p a ) ↔ ∃ b , p (↑f .symm b ) exists_congr_left
_ ↔ ∃ a : s , x ⁻¹ * y = a ⁻¹ :=
by simp only [ inv_mul_eq_iff_eq_mul : ∀ {G : Type ?u.84746} [inst : Group G ] {a b c : G }, a ⁻¹ * b = c ↔ b = a * c inv_mul_eq_iff_eq_mul, Subgroup.coe_inv , eq_mul_inv_iff_mul_eq : ∀ {G : Type ?u.84790} [inst : Group G ] {a b c : G }, a = b * c ⁻¹ ↔ a * c = b eq_mul_inv_iff_mul_eq]
_ ↔ x ⁻¹ * y ∈ s := by simp [ exists_inv_mem_iff_exists_mem ]
#align quotient_group.left_rel_apply QuotientGroup.leftRel_apply
#align quotient_add_group.left_rel_apply QuotientAddGroup.leftRel_apply
variable ( s )
@[ to_additive ]
theorem leftRel_eq : Setoid.r = fun x y => x ⁻¹ * y ∈ s leftRel_eq : @ Setoid.r _ ( leftRel s ) = fun x y => x ⁻¹ * y ∈ s :=
funext₂ : ∀ {α : Sort ?u.91531} {β : α → Sort ?u.91532 } {γ : (a : α ) → β a → Sort ?u.91530 } {f g : (a : α ) → (b : β a ) → γ a b },
(∀ (a : α ) (b : β a ), f a b = g a b ) → f = g funext₂ <| by
simp only [ eq_iff_iff : ∀ {p q : Prop }, p = q ↔ (p ↔ q ) eq_iff_iff]
apply leftRel_apply
#align quotient_group.left_rel_eq QuotientGroup.leftRel_eq : ∀ {α : Type u_1} [inst : Group α ] (s : Subgroup α ), Setoid.r = fun x y => x ⁻¹ * y ∈ s QuotientGroup.leftRel_eq
#align quotient_add_group.left_rel_eq QuotientAddGroup.leftRel_eq
theorem leftRel_r_eq_leftCosetEquivalence :
@ Setoid.r _ ( QuotientGroup.leftRel s ) = LeftCosetEquivalence : {α : Type ?u.91900} → [inst : Mul α ] → Set α → α → α → Prop LeftCosetEquivalence s := by
ext
rw [ leftRel_eq ]
exact ( leftCoset_eq_iff s ). symm : ∀ {a b : Prop }, (a ↔ b ) → (b ↔ a ) symm
#align quotient_group.left_rel_r_eq_left_coset_equivalence QuotientGroup.leftRel_r_eq_leftCosetEquivalence
@[ to_additive ]
instance leftRelDecidable [ DecidablePred : {α : Sort ?u.92878} → (α → Prop ) → Sort (max1?u.92878) DecidablePred (· ∈ s )] : DecidableRel : {α : Sort ?u.92923} → (α → α → Prop ) → Sort (max1?u.92923) DecidableRel ( leftRel s ). r := fun x y => by
rw [ leftRel_eq ]
exact ‹DecidablePred (· ∈ s)› _
#align quotient_group.left_rel_decidable QuotientGroup.leftRelDecidable
#align quotient_add_group.left_rel_decidable QuotientAddGroup.leftRelDecidable
/-- `α ⧸ s` is the quotient type representing the left cosets of `s`.
If `s` is a normal subgroup, `α ⧸ s` is a group -/
@[ to_additive "`α ⧸ s` is the quotient type representing the left cosets of `s`. If `s` is a normal
subgroup, `α ⧸ s` is a group"]
instance : HasQuotient α ( Subgroup α ) :=
⟨ fun s => Quotient ( leftRel s )⟩
/-- The equivalence relation corresponding to the partition of a group by right cosets of a
subgroup. -/
@[ to_additive "The equivalence relation corresponding to the partition of a group by right cosets
of a subgroup."]
def rightRel : Setoid : Sort ?u.93730 → Sort (max1?u.93730) Setoid α :=
MulAction.orbitRel s α
#align quotient_group.right_rel QuotientGroup.rightRel
#align quotient_add_group.right_rel QuotientAddGroup.rightRel
variable { s }
@[ to_additive ]
theorem rightRel_apply { x y : α } : @ Setoid.r _ ( rightRel s ) x y ↔ y * x ⁻¹ ∈ s :=
calc
(∃ a : s , ( a : α ) * y = x ) ↔ ∃ a : s , y * x ⁻¹ = a ⁻¹ :=
by simp only [ mul_inv_eq_iff_eq_mul : ∀ {G : Type ?u.97996} [inst : Group G ] {a b c : G }, a * b ⁻¹ = c ↔ a = c * b mul_inv_eq_iff_eq_mul, Subgroup.coe_inv , eq_inv_mul_iff_mul_eq : ∀ {G : Type ?u.98040} [inst : Group G ] {a b c : G }, a = b ⁻¹ * c ↔ b * a = c eq_inv_mul_iff_mul_eq]
_ ↔ y * x ⁻¹ ∈ s := by simp [ exists_inv_mem_iff_exists_mem ]
#align quotient_group.right_rel_apply QuotientGroup.rightRel_apply
#align quotient_add_group.right_rel_apply QuotientAddGroup.rightRel_apply
variable ( s )
@[ to_additive ]
theorem rightRel_eq : Setoid.r = fun x y => y * x ⁻¹ ∈ s rightRel_eq : @ Setoid.r _ ( rightRel s ) = fun x y => y * x ⁻¹ ∈ s :=
funext₂ : ∀ {α : Sort ?u.104509} {β : α → Sort ?u.104510 } {γ : (a : α ) → β a → Sort ?u.104508 }
{f g : (a : α ) → (b : β a ) → γ a b }, (∀ (a : α ) (b : β a ), f a b = g a b ) → f = g funext₂ <| by
simp only [ eq_iff_iff : ∀ {p q : Prop }, p = q ↔ (p ↔ q ) eq_iff_iff]
apply rightRel_apply
#align quotient_group.right_rel_eq QuotientGroup.rightRel_eq : ∀ {α : Type u_1} [inst : Group α ] (s : Subgroup α ), Setoid.r = fun x y => y * x ⁻¹ ∈ s QuotientGroup.rightRel_eq
#align quotient_add_group.right_rel_eq QuotientAddGroup.rightRel_eq
theorem rightRel_r_eq_rightCosetEquivalence :
@ Setoid.r _ ( QuotientGroup.rightRel s ) = RightCosetEquivalence : {α : Type ?u.104870} → [inst : Mul α ] → Set α → α → α → Prop RightCosetEquivalence s := by
ext
rw [ rightRel_eq ]
exact ( rightCoset_eq_iff s ). symm : ∀ {a b : Prop }, (a ↔ b ) → (b ↔ a ) symm
#align quotient_group.right_rel_r_eq_right_coset_equivalence QuotientGroup.rightRel_r_eq_rightCosetEquivalence
@[ to_additive ]
instance rightRelDecidable [ DecidablePred : {α : Sort ?u.105848} → (α → Prop ) → Sort (max1?u.105848) DecidablePred (· ∈ s )] : DecidableRel : {α : Sort ?u.105893} → (α → α → Prop ) → Sort (max1?u.105893) DecidableRel ( rightRel s ). r := fun x y => by
rw [ rightRel_eq ]
exact ‹DecidablePred (· ∈ s)› _
#align quotient_group.right_rel_decidable QuotientGroup.rightRelDecidable
#align quotient_add_group.right_rel_decidable QuotientAddGroup.rightRelDecidable
/-- Right cosets are in bijection with left cosets. -/
@[ to_additive "Right cosets are in bijection with left cosets."]
def quotientRightRelEquivQuotientLeftRel : Quotient ( QuotientGroup.rightRel s ) ≃ α ⧸ s
where
toFun :=
Quotient.map' ( fun g => g ⁻¹) fun a b => by
rw [ leftRel_apply , rightRel_apply b * a ⁻¹ ∈ s → ((fun g => g ⁻¹ ) a )⁻¹ * (fun g => g ⁻¹ ) b ∈ s ] b * a ⁻¹ ∈ s → ((fun g => g ⁻¹ ) a )⁻¹ * (fun g => g ⁻¹ ) b ∈ s
exact fun h => ( congr_arg : ∀ {α : Sort ?u.107134} {β : Sort ?u.107133} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congr_arg (· ∈ s ) ( b * a ⁻¹ ∈ s → ((fun g => g ⁻¹ ) a )⁻¹ * (fun g => g ⁻¹ ) b ∈ s by simp [ mul_assoc : ∀ {G : Type ?u.107206} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoc] )). mp : ∀ {α β : Sort ?u.107186}, α = β → α → β mp ( s . inv_mem h )
-- porting note: replace with `by group`
invFun :=
Quotient.map' ( fun g =>