The group of permutations (self-equivalences) of a type α#

This file defines the Group structure on Equiv.Perm α.

instance Equiv.Perm.instOne {α : Type u} :
Equations
• Equiv.Perm.instOne = { one := }
instance Equiv.Perm.instMul {α : Type u} :
Equations
• Equiv.Perm.instMul = { mul := fun (f g : ) => }
instance Equiv.Perm.instInv {α : Type u} :
Equations
• Equiv.Perm.instInv = { inv := Equiv.symm }
instance Equiv.Perm.instPowNat {α : Type u} :
Equations
• Equiv.Perm.instPowNat = { pow := fun (f : ) (n : ) => { toFun := (⇑f)^[n], invFun := (⇑(Equiv.symm f))^[n], left_inv := , right_inv := } }
instance Equiv.Perm.permGroup {α : Type u} :
Equations
• Equiv.Perm.permGroup =
@[simp]
theorem Equiv.Perm.default_eq {α : Type u} :
default = 1
@[simp]
theorem Equiv.Perm.val_inv_equivUnitsEnd_apply {α : Type u} (e : ) :
∀ (a : α), (Equiv.Perm.equivUnitsEnd e)⁻¹ a = (Equiv.symm e).toFun a
@[simp]
theorem Equiv.Perm.equivUnitsEnd_symm_apply_symm_apply {α : Type u} (u : (Function.End α)ˣ) :
(Equiv.symm (Equiv.Perm.equivUnitsEnd.symm u)) = u⁻¹
@[simp]
theorem Equiv.Perm.equivUnitsEnd_symm_apply_apply {α : Type u} (u : (Function.End α)ˣ) :
(Equiv.Perm.equivUnitsEnd.symm u) = u
@[simp]
theorem Equiv.Perm.val_equivUnitsEnd_apply {α : Type u} (e : ) :
∀ (a : α), (Equiv.Perm.equivUnitsEnd e) a = e.toFun a

The permutation of a type is equivalent to the units group of the endomorphisms monoid of this type.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem MonoidHom.toHomPerm_apply_symm_apply {α : Type u} {G : Type u_1} [] (f : ) :
∀ (a : G), (Equiv.symm (f.toHomPerm a)) = (f.toHomUnits a)⁻¹
@[simp]
theorem MonoidHom.toHomPerm_apply_apply {α : Type u} {G : Type u_1} [] (f : ) :
∀ (a : G), (f.toHomPerm a) = f a
def MonoidHom.toHomPerm {α : Type u} {G : Type u_1} [] (f : ) :
G →*

Lift a monoid homomorphism f : G →* Function.End α to a monoid homomorphism f : G →* Equiv.Perm α.

Equations
• f.toHomPerm = Equiv.Perm.equivUnitsEnd.symm.toMonoidHom.comp f.toHomUnits
Instances For
theorem Equiv.Perm.mul_apply {α : Type u} (f : ) (g : ) (x : α) :
(f * g) x = f (g x)
theorem Equiv.Perm.one_apply {α : Type u} (x : α) :
1 x = x
@[simp]
theorem Equiv.Perm.inv_apply_self {α : Type u} (f : ) (x : α) :
f⁻¹ (f x) = x
@[simp]
theorem Equiv.Perm.apply_inv_self {α : Type u} (f : ) (x : α) :
f (f⁻¹ x) = x
theorem Equiv.Perm.one_def {α : Type u} :
1 =
theorem Equiv.Perm.mul_def {α : Type u} (f : ) (g : ) :
f * g =
theorem Equiv.Perm.inv_def {α : Type u} (f : ) :
@[simp]
theorem Equiv.Perm.coe_one {α : Type u} :
1 = id
@[simp]
theorem Equiv.Perm.coe_mul {α : Type u} (f : ) (g : ) :
(f * g) = f g
theorem Equiv.Perm.coe_pow {α : Type u} (f : ) (n : ) :
(f ^ n) = (⇑f)^[n]
@[simp]
theorem Equiv.Perm.iterate_eq_pow {α : Type u} (f : ) (n : ) :
(⇑f)^[n] = (f ^ n)
theorem Equiv.Perm.eq_inv_iff_eq {α : Type u} {f : } {x : α} {y : α} :
x = f⁻¹ y f x = y
theorem Equiv.Perm.inv_eq_iff_eq {α : Type u} {f : } {x : α} {y : α} :
f⁻¹ x = y x = f y
theorem Equiv.Perm.zpow_apply_comm {α : Type u_1} (σ : ) (m : ) (n : ) {x : α} :
(σ ^ m) ((σ ^ n) x) = (σ ^ n) ((σ ^ m) x)
@[simp]
theorem Equiv.Perm.image_inv {α : Type u} (f : ) (s : Set α) :
f⁻¹ '' s = f ⁻¹' s
@[simp]
theorem Equiv.Perm.preimage_inv {α : Type u} (f : ) (s : Set α) :
f⁻¹ ⁻¹' s = f '' s

Lemmas about mixing Perm with Equiv. Because we have multiple ways to express Equiv.refl, Equiv.symm, and Equiv.trans, we want simp lemmas for every combination. The assumption made here is that if you're using the group structure, you want to preserve it after simp.

@[simp]
theorem Equiv.Perm.trans_one {α : Sort u_1} {β : Type u_2} (e : α β) :
e.trans 1 = e
@[simp]
theorem Equiv.Perm.mul_refl {α : Type u} (e : ) :
e * = e
@[simp]
theorem Equiv.Perm.one_symm {α : Type u} :
= 1
@[simp]
theorem Equiv.Perm.refl_inv {α : Type u} :
@[simp]
theorem Equiv.Perm.one_trans {α : Type u_1} {β : Sort u_2} (e : α β) :
= e
@[simp]
theorem Equiv.Perm.refl_mul {α : Type u} (e : ) :
* e = e
@[simp]
theorem Equiv.Perm.inv_trans_self {α : Type u} (e : ) :
= 1
@[simp]
theorem Equiv.Perm.mul_symm {α : Type u} (e : ) :
e * = 1
@[simp]
theorem Equiv.Perm.self_trans_inv {α : Type u} (e : ) :
= 1
@[simp]
theorem Equiv.Perm.symm_mul {α : Type u} (e : ) :
* e = 1

Lemmas about Equiv.Perm.sumCongr re-expressed via the group structure.

@[simp]
theorem Equiv.Perm.sumCongr_mul {α : Type u_1} {β : Type u_2} (e : ) (f : ) (g : ) (h : ) :
e.sumCongr f * g.sumCongr h = (e * g).sumCongr (f * h)
@[simp]
theorem Equiv.Perm.sumCongr_inv {α : Type u_1} {β : Type u_2} (e : ) (f : ) :
(e.sumCongr f)⁻¹ = e⁻¹.sumCongr f⁻¹
@[simp]
theorem Equiv.Perm.sumCongr_one {α : Type u_1} {β : Type u_2} :
= 1
@[simp]
theorem Equiv.Perm.sumCongrHom_apply (α : Type u_1) (β : Type u_2) (a : ) :
a = a.1.sumCongr a.2
def Equiv.Perm.sumCongrHom (α : Type u_1) (β : Type u_2) :

Equiv.Perm.sumCongr as a MonoidHom, with its two arguments bundled into a single Prod.

This is particularly useful for its MonoidHom.range projection, which is the subgroup of permutations which do not exchange elements between α and β.

Equations
• = { toFun := fun (a : ) => a.1.sumCongr a.2, map_one' := , map_mul' := }
Instances For
theorem Equiv.Perm.sumCongrHom_injective {α : Type u_1} {β : Type u_2} :
@[simp]
theorem Equiv.Perm.sumCongr_swap_one {α : Type u_1} {β : Type u_2} [] [] (i : α) (j : α) :
(Equiv.swap i j).sumCongr 1 = Equiv.swap (Sum.inl i) (Sum.inl j)
@[simp]
theorem Equiv.Perm.sumCongr_one_swap {α : Type u_1} {β : Type u_2} [] [] (i : β) (j : β) :

Lemmas about Equiv.Perm.sigmaCongrRight re-expressed via the group structure.

@[simp]
theorem Equiv.Perm.sigmaCongrRight_mul {α : Type u_1} {β : αType u_2} (F : (a : α) → Equiv.Perm (β a)) (G : (a : α) → Equiv.Perm (β a)) :
@[simp]
theorem Equiv.Perm.sigmaCongrRight_inv {α : Type u_1} {β : αType u_2} (F : (a : α) → Equiv.Perm (β a)) :
= Equiv.Perm.sigmaCongrRight fun (a : α) => (F a)⁻¹
@[simp]
theorem Equiv.Perm.sigmaCongrRight_one {α : Type u_1} {β : αType u_2} :
@[simp]
theorem Equiv.Perm.sigmaCongrRightHom_apply {α : Type u_1} (β : αType u_2) (F : (a : α) → Equiv.Perm (β a)) :
def Equiv.Perm.sigmaCongrRightHom {α : Type u_1} (β : αType u_2) :
((a : α) → Equiv.Perm (β a)) →* Equiv.Perm ((a : α) × β a)

Equiv.Perm.sigmaCongrRight as a MonoidHom.

This is particularly useful for its MonoidHom.range projection, which is the subgroup of permutations which do not exchange elements between fibers.

Equations
• = { toFun := Equiv.Perm.sigmaCongrRight, map_one' := , map_mul' := }
Instances For
theorem Equiv.Perm.sigmaCongrRightHom_injective {α : Type u_1} {β : αType u_2} :
@[simp]
theorem Equiv.Perm.subtypeCongrHom_apply {α : Type u} (p : αProp) [] (pair : Equiv.Perm { a : α // p a } × Equiv.Perm { a : α // ¬p a }) :
pair = pair.1.subtypeCongr pair.2
def Equiv.Perm.subtypeCongrHom {α : Type u} (p : αProp) [] :
Equiv.Perm { a : α // p a } × Equiv.Perm { a : α // ¬p a } →*

Equiv.Perm.subtypeCongr as a MonoidHom.

Equations
• = { toFun := fun (pair : Equiv.Perm { a : α // p a } × Equiv.Perm { a : α // ¬p a }) => pair.1.subtypeCongr pair.2, map_one' := , map_mul' := }
Instances For
theorem Equiv.Perm.subtypeCongrHom_injective {α : Type u} (p : αProp) [] :
@[simp]
theorem Equiv.Perm.permCongr_eq_mul {α : Type u} (e : ) (p : ) :
p = e * p * e⁻¹

If e is also a permutation, we can write permCongr completely in terms of the group structure.

Lemmas about Equiv.Perm.extendDomain re-expressed via the group structure.

@[simp]
theorem Equiv.Perm.extendDomain_one {α : Type u} {β : Type v} {p : βProp} [] (f : α ) :
@[simp]
theorem Equiv.Perm.extendDomain_inv {α : Type u} {β : Type v} (e : ) {p : βProp} [] (f : α ) :
(e.extendDomain f)⁻¹ = e⁻¹.extendDomain f
@[simp]
theorem Equiv.Perm.extendDomain_mul {α : Type u} {β : Type v} {p : βProp} [] (f : α ) (e : ) (e' : ) :
e.extendDomain f * e'.extendDomain f = (e * e').extendDomain f
@[simp]
theorem Equiv.Perm.extendDomainHom_apply {α : Type u} {β : Type v} {p : βProp} [] (f : α ) (e : ) :
= e.extendDomain f
def Equiv.Perm.extendDomainHom {α : Type u} {β : Type v} {p : βProp} [] (f : α ) :

extendDomain as a group homomorphism

Equations
• = { toFun := fun (e : ) => e.extendDomain f, map_one' := , map_mul' := }
Instances For
theorem Equiv.Perm.extendDomainHom_injective {α : Type u} {β : Type v} {p : βProp} [] (f : α ) :
@[simp]
theorem Equiv.Perm.extendDomain_eq_one_iff {α : Type u} {β : Type v} {p : βProp} [] {e : } {f : α } :
e.extendDomain f = 1 e = 1
@[simp]
theorem Equiv.Perm.extendDomain_pow {α : Type u} {β : Type v} (e : ) {p : βProp} [] (f : α ) (n : ) :
(e ^ n).extendDomain f = e.extendDomain f ^ n
@[simp]
theorem Equiv.Perm.extendDomain_zpow {α : Type u} {β : Type v} (e : ) {p : βProp} [] (f : α ) (n : ) :
(e ^ n).extendDomain f = e.extendDomain f ^ n
def Equiv.Perm.subtypePerm {α : Type u} {p : αProp} (f : ) (h : ∀ (x : α), p x p (f x)) :
Equiv.Perm { x : α // p x }

If the permutation f fixes the subtype {x // p x}, then this returns the permutation on {x // p x} induced by f.

Equations
• f.subtypePerm h = { toFun := fun (x : { x : α // p x }) => f x, , invFun := fun (x : { x : α // p x }) => f⁻¹ x, , left_inv := , right_inv := }
Instances For
@[simp]
theorem Equiv.Perm.subtypePerm_apply {α : Type u} {p : αProp} (f : ) (h : ∀ (x : α), p x p (f x)) (x : { x : α // p x }) :
(f.subtypePerm h) x = f x,
@[simp]
theorem Equiv.Perm.subtypePerm_one {α : Type u} (p : αProp) (h : optParam (∀ (x : α), p x p x) ) :
@[simp]
theorem Equiv.Perm.subtypePerm_mul {α : Type u} {p : αProp} (f : ) (g : ) (hf : ∀ (x : α), p x p (f x)) (hg : ∀ (x : α), p x p (g x)) :
f.subtypePerm hf * g.subtypePerm hg = (f * g).subtypePerm
theorem Equiv.Perm.subtypePerm_inv {α : Type u} {p : αProp} (f : ) (hf : ∀ (x : α), p x p (f⁻¹ x)) :
f⁻¹.subtypePerm hf = (f.subtypePerm )⁻¹

See Equiv.Perm.inv_subtypePerm

@[simp]
theorem Equiv.Perm.inv_subtypePerm {α : Type u} {p : αProp} (f : ) (hf : ∀ (x : α), p x p (f x)) :
(f.subtypePerm hf)⁻¹ = f⁻¹.subtypePerm

See Equiv.Perm.subtypePerm_inv

@[simp]
theorem Equiv.Perm.subtypePerm_pow {α : Type u} {p : αProp} (f : ) (n : ) (hf : ∀ (x : α), p x p (f x)) :
f.subtypePerm hf ^ n = (f ^ n).subtypePerm
@[simp]
theorem Equiv.Perm.subtypePerm_zpow {α : Type u} {p : αProp} (f : ) (n : ) (hf : ∀ (x : α), p x p (f x)) :
f.subtypePerm hf ^ n = (f ^ n).subtypePerm
def Equiv.Perm.ofSubtype {α : Type u} {p : αProp} [] :

The inclusion map of permutations on a subtype of α into permutations of α, fixing the other points.

Equations
• Equiv.Perm.ofSubtype = { toFun := fun (f : ) => f.extendDomain (Equiv.refl (Subtype p)), map_one' := , map_mul' := }
Instances For
theorem Equiv.Perm.ofSubtype_subtypePerm {α : Type u} {p : αProp} [] {f : } (h₁ : ∀ (x : α), p x p (f x)) (h₂ : ∀ (x : α), f x xp x) :
Equiv.Perm.ofSubtype (f.subtypePerm h₁) = f
theorem Equiv.Perm.ofSubtype_apply_of_mem {α : Type u} {p : αProp} [] {a : α} (f : ) (ha : p a) :
(Equiv.Perm.ofSubtype f) a = (f a, ha)
@[simp]
theorem Equiv.Perm.ofSubtype_apply_coe {α : Type u} {p : αProp} [] (f : ) (x : ) :
(Equiv.Perm.ofSubtype f) x = (f x)
theorem Equiv.Perm.ofSubtype_apply_of_not_mem {α : Type u} {p : αProp} [] {a : α} (f : ) (ha : ¬p a) :
(Equiv.Perm.ofSubtype f) a = a
theorem Equiv.Perm.mem_iff_ofSubtype_apply_mem {α : Type u} {p : αProp} [] (f : ) (x : α) :
p x p ((Equiv.Perm.ofSubtype f) x)
@[simp]
theorem Equiv.Perm.subtypePerm_ofSubtype {α : Type u} {p : αProp} [] (f : ) :
(Equiv.Perm.ofSubtype f).subtypePerm = f
theorem Equiv.Perm.ofSubtype_subtypePerm_of_mem {α : Type u} {p : αProp} [] {g : } (hg : ∀ (x : α), p x p (g x)) {a : α} (ha : p a) :
(Equiv.Perm.ofSubtype (g.subtypePerm hg)) a = g a
theorem Equiv.Perm.ofSubtype_subtypePerm_of_not_mem {α : Type u} {p : αProp} [] {g : } (hg : ∀ (x : α), p x p (g x)) {a : α} (ha : ¬p a) :
(Equiv.Perm.ofSubtype (g.subtypePerm hg)) a = a
@[simp]
theorem Equiv.Perm.subtypeEquivSubtypePerm_apply_coe {α : Type u} (p : αProp) [] (f : ) :
= Equiv.Perm.ofSubtype f
@[simp]
theorem Equiv.Perm.subtypeEquivSubtypePerm_symm_apply {α : Type u} (p : αProp) [] (f : { f : // ∀ (a : α), ¬p af a = a }) :
.symm f = (↑f).subtypePerm
def Equiv.Perm.subtypeEquivSubtypePerm {α : Type u} (p : αProp) [] :
{ f : // ∀ (a : α), ¬p af a = a }

Permutations on a subtype are equivalent to permutations on the original type that fix pointwise the rest.

Equations
• One or more equations did not get rendered due to their size.
Instances For
theorem Equiv.Perm.subtypeEquivSubtypePerm_apply_of_mem {α : Type u} {p : αProp} [] {a : α} (f : ) (h : p a) :
(.toFun f) a = (f a, h)
theorem Equiv.Perm.subtypeEquivSubtypePerm_apply_of_not_mem {α : Type u} {p : αProp} [] {a : α} (f : ) (h : ¬p a) :
(.toFun f) a = a
@[simp]
theorem Equiv.swap_inv {α : Type u} [] (x : α) (y : α) :
@[simp]
theorem Equiv.swap_mul_self {α : Type u} [] (i : α) (j : α) :
* = 1
theorem Equiv.swap_mul_eq_mul_swap {α : Type u} [] (f : ) (x : α) (y : α) :
* f = f * Equiv.swap (f⁻¹ x) (f⁻¹ y)
theorem Equiv.mul_swap_eq_swap_mul {α : Type u} [] (f : ) (x : α) (y : α) :
f * = Equiv.swap (f x) (f y) * f
theorem Equiv.swap_apply_apply {α : Type u} [] (f : ) (x : α) (y : α) :
Equiv.swap (f x) (f y) = f * * f⁻¹
@[simp]
theorem Equiv.swap_smul_self_smul {α : Type u} {β : Type v} [] [MulAction (Equiv.Perm α) β] (i : α) (j : α) (x : β) :
x = x
theorem Equiv.swap_smul_involutive {α : Type u} {β : Type v} [] [MulAction (Equiv.Perm α) β] (i : α) (j : α) :
Function.Involutive fun (x : β) => x
@[simp]
theorem Equiv.swap_mul_self_mul {α : Type u} [] (i : α) (j : α) (σ : ) :
* ( * σ) = σ

Left-multiplying a permutation with swap i j twice gives the original permutation.

This specialization of swap_mul_self is useful when using cosets of permutations.

@[simp]
theorem Equiv.mul_swap_mul_self {α : Type u} [] (i : α) (j : α) (σ : ) :
σ * * = σ

Right-multiplying a permutation with swap i j twice gives the original permutation.

This specialization of swap_mul_self is useful when using cosets of permutations.

@[simp]
theorem Equiv.swap_mul_involutive {α : Type u} [] (i : α) (j : α) :
Function.Involutive fun (x : ) => * x

A stronger version of mul_right_injective

@[simp]
theorem Equiv.mul_swap_involutive {α : Type u} [] (i : α) (j : α) :
Function.Involutive fun (x : ) => x *

A stronger version of mul_left_injective

@[simp]
theorem Equiv.swap_eq_one_iff {α : Type u} [] {i : α} {j : α} :
= 1 i = j
theorem Equiv.swap_mul_eq_iff {α : Type u} [] {i : α} {j : α} {σ : } :
* σ = σ i = j
theorem Equiv.mul_swap_eq_iff {α : Type u} [] {i : α} {j : α} {σ : } :
σ * = σ i = j
theorem Equiv.swap_mul_swap_mul_swap {α : Type u} [] {x : α} {y : α} {z : α} (hxy : x y) (hxz : x z) :
* * =
@[simp]
theorem Equiv.addLeft_zero {α : Type u} [] :
@[simp]
theorem Equiv.addRight_zero {α : Type u} [] :
@[simp]
theorem Equiv.addLeft_add {α : Type u} [] (a : α) (b : α) :
@[simp]
theorem Equiv.addRight_add {α : Type u} [] (a : α) (b : α) :
@[simp]
theorem Equiv.inv_addLeft {α : Type u} [] (a : α) :
@[simp]
theorem Equiv.inv_addRight {α : Type u} [] (a : α) :
@[simp]
theorem Equiv.pow_addLeft {α : Type u} [] (a : α) (n : ) :
@[simp]
theorem Equiv.pow_addRight {α : Type u} [] (a : α) (n : ) :
@[simp]
theorem Equiv.zpow_addLeft {α : Type u} [] (a : α) (n : ) :
@[simp]
theorem Equiv.zpow_addRight {α : Type u} [] (a : α) (n : ) :
@[simp]
theorem Equiv.mulLeft_one {α : Type u} [] :
@[simp]
theorem Equiv.mulRight_one {α : Type u} [] :
@[simp]
theorem Equiv.mulLeft_mul {α : Type u} [] (a : α) (b : α) :
@[simp]
theorem Equiv.mulRight_mul {α : Type u} [] (a : α) (b : α) :
@[simp]
theorem Equiv.inv_mulLeft {α : Type u} [] (a : α) :
@[simp]
theorem Equiv.inv_mulRight {α : Type u} [] (a : α) :
@[simp]
theorem Equiv.pow_mulLeft {α : Type u} [] (a : α) (n : ) :
@[simp]
theorem Equiv.pow_mulRight {α : Type u} [] (a : α) (n : ) :
@[simp]
theorem Equiv.zpow_mulLeft {α : Type u} [] (a : α) (n : ) :
@[simp]
theorem Equiv.zpow_mulRight {α : Type u} [] (a : α) (n : ) :
theorem Set.BijOn.perm_inv {α : Type u_1} {f : } {s : Set α} (hf : Set.BijOn (⇑f) s s) :
Set.BijOn (⇑f⁻¹) s s
theorem Set.MapsTo.perm_pow {α : Type u_1} {f : } {s : Set α} :
Set.MapsTo (⇑f) s s∀ (n : ), Set.MapsTo (⇑(f ^ n)) s s
theorem Set.SurjOn.perm_pow {α : Type u_1} {f : } {s : Set α} :
Set.SurjOn (⇑f) s s∀ (n : ), Set.SurjOn (⇑(f ^ n)) s s
theorem Set.BijOn.perm_pow {α : Type u_1} {f : } {s : Set α} :
Set.BijOn (⇑f) s s∀ (n : ), Set.BijOn (⇑(f ^ n)) s s
theorem Set.BijOn.perm_zpow {α : Type u_1} {f : } {s : Set α} (hf : Set.BijOn (⇑f) s s) (n : ) :
Set.BijOn (⇑(f ^ n)) s s