# Multiplicative and additive equivs #

In this file we define two extensions of equiv called add_equiv and mul_equiv, which are datatypes representing isomorphisms of add_monoids/add_groups and monoids/groups.

## Notations #

• infix  ≃* :25 := mul_equiv
• infix  ≃+ :25 := add_equiv

The extended equivs all have coercions to functions, and the coercions are the canonical notation when treating the isomorphisms as maps.

## Implementation notes #

The fields for mul_equiv, add_equiv now avoid the unbundled is_mul_hom and is_add_hom, as these are deprecated.

## Tags #

def add_hom.inverse {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (f : N) (g : N → M) (h₁ : f) (h₂ : f) :
M

def mul_hom.inverse {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (f : N) (g : N → M) (h₁ : f) (h₂ : f) :
M

Makes a multiplicative inverse from a bijection which preserves multiplication.

Equations
def add_equiv.to_equiv {A : Type u_9} {B : Type u_10} [has_add A] [has_add B] (self : A ≃+ B) :
A B

The equiv underlying an add_equiv.

Type (max u_10 u_9)
• to_fun : A → B
• inv_fun : B → A
• left_inv :
• right_inv :
• map_add' : ∀ (x y : A), c.to_fun (x + y) = c.to_fun x + c.to_fun y

add_equiv α β is the type of an equiv α ≃ β which preserves addition.

B

The add_hom underlying a add_equiv.

def mul_equiv.to_mul_hom {M : Type u_9} {N : Type u_10} [has_mul M] [has_mul N] (self : M ≃* N) :
N

The mul_hom underlying a mul_equiv.

def mul_equiv.to_equiv {M : Type u_9} {N : Type u_10} [has_mul M] [has_mul N] (self : M ≃* N) :
M N

The equiv underlying a mul_equiv.

structure mul_equiv (M : Type u_9) (N : Type u_10) [has_mul M] [has_mul N] :
Type (max u_10 u_9)
• to_fun : M → N
• inv_fun : N → M
• left_inv :
• right_inv :
• map_mul' : ∀ (x y : M), c.to_fun (x * y) = (c.to_fun x) * c.to_fun y

mul_equiv α β is the type of an equiv α ≃ β which preserves multiplication.

@[protected, instance]
@[protected, instance]
def mul_equiv.has_coe_to_fun {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] :
Equations
@[simp]
theorem mul_equiv.to_fun_eq_coe {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] {f : M ≃* N} :
@[simp]
theorem add_equiv.to_fun_eq_coe {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] {f : M ≃+ N} :
@[simp]
theorem mul_equiv.coe_to_equiv {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] {f : M ≃* N} :
@[simp]
theorem add_equiv.coe_to_equiv {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] {f : M ≃+ N} :
@[simp]
theorem mul_equiv.coe_to_mul_hom {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] {f : M ≃* N} :
@[simp]
@[simp]
theorem add_equiv.map_add {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (f : M ≃+ N) (x y : M) :
f (x + y) = f x + f y
@[simp]
theorem mul_equiv.map_mul {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (f : M ≃* N) (x y : M) :
f (x * y) = (f x) * f y

A multiplicative isomorphism preserves multiplication (canonical form).

def add_equiv.mk' {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (f : M N) (h : ∀ (x y : M), f (x + y) = f x + f y) :
M ≃+ N

def mul_equiv.mk' {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (f : M N) (h : ∀ (x y : M), f (x * y) = (f x) * f y) :
M ≃* N

Makes a multiplicative isomorphism from a bijection which preserves multiplication.

Equations
@[protected]
theorem add_equiv.bijective {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) :
@[protected]
theorem mul_equiv.bijective {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) :
@[protected]
theorem mul_equiv.injective {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) :
@[protected]
theorem add_equiv.injective {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) :
@[protected]
theorem mul_equiv.surjective {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) :
@[protected]
theorem add_equiv.surjective {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) :
M ≃+ M

The identity map is an additive isomorphism.

def mul_equiv.refl (M : Type u_1) [has_mul M] :
M ≃* M

The identity map is a multiplicative isomorphism.

Equations
@[protected, instance]
@[protected, instance]
def mul_equiv.inhabited {M : Type u_3} [has_mul M] :
Equations
def add_equiv.symm {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (h : M ≃+ N) :
N ≃+ M

The inverse of an isomorphism is an isomorphism.

def mul_equiv.symm {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (h : M ≃* N) :
N ≃* M

The inverse of an isomorphism is an isomorphism.

Equations
def add_equiv.simps.symm_apply {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) :
N → M

See Note custom simps projection

def mul_equiv.simps.symm_apply {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) :
N → M
Equations
@[simp]
theorem mul_equiv.to_equiv_symm {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (f : M ≃* N) :
@[simp]
theorem add_equiv.to_equiv_symm {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (f : M ≃+ N) :
@[simp]
theorem mul_equiv.coe_mk {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (f : M → N) (g : N → M) (h₁ : f) (h₂ : f) (h₃ : ∀ (x y : M), f (x * y) = (f x) * f y) :
{to_fun := f, inv_fun := g, left_inv := h₁, right_inv := h₂, map_mul' := h₃} = f
@[simp]
theorem add_equiv.coe_mk {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (f : M → N) (g : N → M) (h₁ : f) (h₂ : f) (h₃ : ∀ (x y : M), f (x + y) = f x + f y) :
{to_fun := f, inv_fun := g, left_inv := h₁, right_inv := h₂, map_add' := h₃} = f
@[simp]
theorem mul_equiv.symm_symm {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (f : M ≃* N) :
f.symm.symm = f
@[simp]
theorem add_equiv.symm_symm {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (f : M ≃+ N) :
f.symm.symm = f
theorem mul_equiv.symm_bijective {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] :
@[simp]
theorem mul_equiv.symm_mk {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (f : M → N) (g : N → M) (h₁ : f) (h₂ : f) (h₃ : ∀ (x y : M), f (x * y) = (f x) * f y) :
{to_fun := f, inv_fun := g, left_inv := h₁, right_inv := h₂, map_mul' := h₃}.symm = {to_fun := g, inv_fun := f, left_inv := _, right_inv := _, map_mul' := _}
@[simp]
theorem add_equiv.symm_mk {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (f : M → N) (g : N → M) (h₁ : f) (h₂ : f) (h₃ : ∀ (x y : M), f (x + y) = f x + f y) :
{to_fun := f, inv_fun := g, left_inv := h₁, right_inv := h₂, map_add' := h₃}.symm = {to_fun := g, inv_fun := f, left_inv := _, right_inv := _, map_add' := _}
def mul_equiv.trans {M : Type u_3} {N : Type u_4} {P : Type u_5} [has_mul M] [has_mul N] [has_mul P] (h1 : M ≃* N) (h2 : N ≃* P) :
M ≃* P

Transitivity of multiplication-preserving isomorphisms

Equations
def add_equiv.trans {M : Type u_3} {N : Type u_4} {P : Type u_5} [has_add M] [has_add N] [has_add P] (h1 : M ≃+ N) (h2 : N ≃+ P) :
M ≃+ P

@[simp]
theorem mul_equiv.apply_symm_apply {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) (y : N) :
e ((e.symm) y) = y

e.right_inv in canonical form

@[simp]
theorem add_equiv.apply_symm_apply {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) (y : N) :
e ((e.symm) y) = y
@[simp]
theorem mul_equiv.symm_apply_apply {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) (x : M) :
(e.symm) (e x) = x

e.left_inv in canonical form

@[simp]
theorem add_equiv.symm_apply_apply {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) (x : M) :
(e.symm) (e x) = x
@[simp]
theorem mul_equiv.symm_comp_self {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) :
@[simp]
theorem add_equiv.symm_comp_self {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) :
@[simp]
theorem add_equiv.self_comp_symm {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) :
@[simp]
theorem mul_equiv.self_comp_symm {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) :
@[simp]
theorem mul_equiv.coe_refl {M : Type u_3} [has_mul M] :
@[simp]
theorem add_equiv.refl_apply {M : Type u_3} [has_add M] (m : M) :
m = m
theorem mul_equiv.refl_apply {M : Type u_3} [has_mul M] (m : M) :
m = m
@[simp]
theorem mul_equiv.coe_trans {M : Type u_3} {N : Type u_4} {P : Type u_5} [has_mul M] [has_mul N] [has_mul P] (e₁ : M ≃* N) (e₂ : N ≃* P) :
(e₁.trans e₂) = e₂ e₁
@[simp]
theorem add_equiv.coe_trans {M : Type u_3} {N : Type u_4} {P : Type u_5} [has_add M] [has_add N] [has_add P] (e₁ : M ≃+ N) (e₂ : N ≃+ P) :
(e₁.trans e₂) = e₂ e₁
theorem mul_equiv.trans_apply {M : Type u_3} {N : Type u_4} {P : Type u_5} [has_mul M] [has_mul N] [has_mul P] (e₁ : M ≃* N) (e₂ : N ≃* P) (m : M) :
(e₁.trans e₂) m = e₂ (e₁ m)
theorem add_equiv.trans_apply {M : Type u_3} {N : Type u_4} {P : Type u_5} [has_add M] [has_add N] [has_add P] (e₁ : M ≃+ N) (e₂ : N ≃+ P) (m : M) :
(e₁.trans e₂) m = e₂ (e₁ m)
@[simp]
theorem add_equiv.apply_eq_iff_eq {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) {x y : M} :
e x = e y x = y
@[simp]
theorem mul_equiv.apply_eq_iff_eq {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) {x y : M} :
e x = e y x = y
theorem add_equiv.apply_eq_iff_symm_apply {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) {x : M} {y : N} :
e x = y x = (e.symm) y
theorem mul_equiv.apply_eq_iff_symm_apply {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) {x : M} {y : N} :
e x = y x = (e.symm) y
theorem add_equiv.symm_apply_eq {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) {x : N} {y : M} :
(e.symm) x = y x = e y
theorem mul_equiv.symm_apply_eq {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) {x : N} {y : M} :
(e.symm) x = y x = e y
theorem mul_equiv.eq_symm_apply {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) {x : N} {y : M} :
y = (e.symm) x e y = x
theorem add_equiv.eq_symm_apply {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) {x : N} {y : M} :
y = (e.symm) x e y = x
@[ext]
theorem add_equiv.ext {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] {f g : M ≃+ N} (h : ∀ (x : M), f x = g x) :
f = g

Two additive isomorphisms agree if they are defined by the same underlying function.

@[ext]
theorem mul_equiv.ext {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] {f g : M ≃* N} (h : ∀ (x : M), f x = g x) :
f = g

Two multiplicative isomorphisms agree if they are defined by the same underlying function.

theorem add_equiv.ext_iff {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] {f g : M ≃+ N} :
f = g ∀ (x : M), f x = g x
theorem mul_equiv.ext_iff {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] {f g : M ≃* N} :
f = g ∀ (x : M), f x = g x
@[simp]
theorem mul_equiv.mk_coe {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) (e' : N → M) (h₁ : e) (h₂ : e) (h₃ : ∀ (x y : M), e (x * y) = (e x) * e y) :
{to_fun := e, inv_fun := e', left_inv := h₁, right_inv := h₂, map_mul' := h₃} = e
@[simp]
theorem add_equiv.mk_coe {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) (e' : N → M) (h₁ : e) (h₂ : e) (h₃ : ∀ (x y : M), e (x + y) = e x + e y) :
{to_fun := e, inv_fun := e', left_inv := h₁, right_inv := h₂, map_add' := h₃} = e
@[simp]
theorem mul_equiv.mk_coe' {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (e : M ≃* N) (f : N → M) (h₁ : f) (h₂ : f) (h₃ : ∀ (x y : N), f (x * y) = (f x) * f y) :
{to_fun := f, inv_fun := e, left_inv := h₁, right_inv := h₂, map_mul' := h₃} = e.symm
@[simp]
theorem add_equiv.mk_coe' {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (e : M ≃+ N) (f : N → M) (h₁ : f) (h₂ : f) (h₃ : ∀ (x y : N), f (x + y) = f x + f y) :
{to_fun := f, inv_fun := e, left_inv := h₁, right_inv := h₂, map_add' := h₃} = e.symm
@[protected]
theorem add_equiv.congr_arg {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] {f : M ≃+ N} {x x' : M} :
x = x'f x = f x'
@[protected]
theorem mul_equiv.congr_arg {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] {f : M ≃* N} {x x' : M} :
x = x'f x = f x'
@[protected]
theorem add_equiv.congr_fun {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] {f g : M ≃+ N} (h : f = g) (x : M) :
f x = g x
@[protected]
theorem mul_equiv.congr_fun {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] {f g : M ≃* N} (h : f = g) (x : M) :
f x = g x
M ≃+ N

The add_equiv between two add_monoids with a unique element.

def mul_equiv.mul_equiv_of_unique_of_unique {M : Type u_1} {N : Type u_2} [unique M] [unique N] [has_mul M] [has_mul N] :
M ≃* N

The mul_equiv between two monoids with a unique element.

Equations
@[protected, instance]
def add_equiv.unique {M : Type u_1} {N : Type u_2} [unique M] [unique N] [has_add M] [has_add N] :
unique (M ≃+ N)
@[protected, instance]
def mul_equiv.unique {M : Type u_1} {N : Type u_2} [unique M] [unique N] [has_mul M] [has_mul N] :
unique (M ≃* N)

There is a unique monoid homomorphism between two monoids with a unique element.

Equations

## Monoids #

@[simp]
theorem add_equiv.map_zero {M : Type u_1} {N : Type u_2} (h : M ≃+ N) :
h 0 = 0
@[simp]
theorem mul_equiv.map_one {M : Type u_1} {N : Type u_2} (h : M ≃* N) :
h 1 = 1

A multiplicative equiv of monoids sends 1 to 1 (and is hence a monoid isomorphism).

@[simp]
theorem add_equiv.map_eq_zero_iff {M : Type u_1} {N : Type u_2} (h : M ≃+ N) {x : M} :
h x = 0 x = 0
@[simp]
theorem mul_equiv.map_eq_one_iff {M : Type u_1} {N : Type u_2} (h : M ≃* N) {x : M} :
h x = 1 x = 1
theorem add_equiv.map_ne_zero_iff {M : Type u_1} {N : Type u_2} (h : M ≃+ N) {x : M} :
h x 0 x 0
theorem mul_equiv.map_ne_one_iff {M : Type u_1} {N : Type u_2} (h : M ≃* N) {x : M} :
h x 1 x 1
def add_equiv.of_bijective {M : Type u_1} {N : Type u_2} (f : M →+ N) (hf : function.bijective f) :
M ≃+ N

A bijective add_monoid homomorphism is an isomorphism

def mul_equiv.of_bijective {M : Type u_1} {N : Type u_2} (f : M →* N) (hf : function.bijective f) :
M ≃* N

A bijective monoid homomorphism is an isomorphism

Equations
def add_equiv.to_add_monoid_hom {M : Type u_1} {N : Type u_2} (h : M ≃+ N) :
M →+ N

Extract the forward direction of an additive equivalence as an addition-preserving function.

def mul_equiv.to_monoid_hom {M : Type u_1} {N : Type u_2} (h : M ≃* N) :
M →* N

Extract the forward direction of a multiplicative equivalence as a multiplication-preserving function.

Equations
@[simp]
theorem mul_equiv.coe_to_monoid_hom {M : Type u_1} {N : Type u_2} (e : M ≃* N) :
@[simp]
theorem add_equiv.coe_to_add_monoid_hom {M : Type u_1} {N : Type u_2} (e : M ≃+ N) :
theorem mul_equiv.to_monoid_hom_injective {M : Type u_1} {N : Type u_2}  :
@[simp]
theorem add_equiv.arrow_congr_apply {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} (f : M N) (g : P ≃+ Q) (h : M → P) (n : N) :
h n = g (h ((f.symm) n))
def add_equiv.arrow_congr {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} (f : M N) (g : P ≃+ Q) :
(M → P) ≃+ (N → Q)

An additive analogue of equiv.arrow_congr, where the equivalence between the targets is additive.

def mul_equiv.arrow_congr {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} (f : M N) (g : P ≃* Q) :
(M → P) ≃* (N → Q)

A multiplicative analogue of equiv.arrow_congr, where the equivalence between the targets is multiplicative.

Equations
@[simp]
theorem mul_equiv.arrow_congr_apply {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} (f : M N) (g : P ≃* Q) (h : M → P) (n : N) :
h n = g (h ((f.symm) n))
def add_equiv.add_monoid_hom_congr {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} (f : M ≃+ N) (g : P ≃+ Q) :
(M →+ P) ≃+ (N →+ Q)

An additive analogue of equiv.arrow_congr, for additive maps from an additive monoid to a commutative additive monoid.

@[simp]
theorem add_equiv.add_monoid_hom_congr_apply {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} (f : M ≃+ N) (g : P ≃+ Q) (h : M →+ P) :
def mul_equiv.monoid_hom_congr {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} [comm_monoid P] [comm_monoid Q] (f : M ≃* N) (g : P ≃* Q) :
(M →* P) ≃* (N →* Q)

A multiplicative analogue of equiv.arrow_congr, for multiplicative maps from a monoid to a commutative monoid.

Equations
@[simp]
theorem mul_equiv.monoid_hom_congr_apply {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} [comm_monoid P] [comm_monoid Q] (f : M ≃* N) (g : P ≃* Q) (h : M →* P) :
@[simp]
theorem mul_equiv.Pi_congr_right_apply {η : Type u_1} {Ms : η → Type u_2} {Ns : η → Type u_3} [Π (j : η), mul_one_class (Ms j)] [Π (j : η), mul_one_class (Ns j)] (es : Π (j : η), Ms j ≃* Ns j) (x : Π (j : η), Ms j) (j : η) :
j = (es j) (x j)
@[simp]
theorem add_equiv.Pi_congr_right_apply {η : Type u_1} {Ms : η → Type u_2} {Ns : η → Type u_3} [Π (j : η), add_zero_class (Ms j)] [Π (j : η), add_zero_class (Ns j)] (es : Π (j : η), Ms j ≃+ Ns j) (x : Π (j : η), Ms j) (j : η) :
j = (es j) (x j)
def add_equiv.Pi_congr_right {η : Type u_1} {Ms : η → Type u_2} {Ns : η → Type u_3} [Π (j : η), add_zero_class (Ms j)] [Π (j : η), add_zero_class (Ns j)] (es : Π (j : η), Ms j ≃+ Ns j) :
(Π (j : η), Ms j) ≃+ Π (j : η), Ns j

A family of additive equivalences Π j, (Ms j ≃+ Ns j) generates an additive equivalence between Π j, Ms j and Π j, Ns j.

This is the add_equiv version of equiv.Pi_congr_right, and the dependent version of add_equiv.arrow_congr.

def mul_equiv.Pi_congr_right {η : Type u_1} {Ms : η → Type u_2} {Ns : η → Type u_3} [Π (j : η), mul_one_class (Ms j)] [Π (j : η), mul_one_class (Ns j)] (es : Π (j : η), Ms j ≃* Ns j) :
(Π (j : η), Ms j) ≃* Π (j : η), Ns j

A family of multiplicative equivalences Π j, (Ms j ≃* Ns j) generates a multiplicative equivalence between Π j, Ms j and Π j, Ns j.

This is the mul_equiv version of equiv.Pi_congr_right, and the dependent version of mul_equiv.arrow_congr.

Equations
@[simp]
theorem mul_equiv.Pi_congr_right_refl {η : Type u_1} {Ms : η → Type u_2} [Π (j : η), mul_one_class (Ms j)] :
mul_equiv.Pi_congr_right (λ (j : η), mul_equiv.refl (Ms j)) = mul_equiv.refl (Π (j : η), Ms j)
@[simp]
theorem mul_equiv.Pi_congr_right_symm {η : Type u_1} {Ms : η → Type u_2} {Ns : η → Type u_3} [Π (j : η), mul_one_class (Ms j)] [Π (j : η), mul_one_class (Ns j)] (es : Π (j : η), Ms j ≃* Ns j) :
= mul_equiv.Pi_congr_right (λ (i : η), (es i).symm)
@[simp]
theorem mul_equiv.Pi_congr_right_trans {η : Type u_1} {Ms : η → Type u_2} {Ns : η → Type u_3} {Ps : η → Type u_4} [Π (j : η), mul_one_class (Ms j)] [Π (j : η), mul_one_class (Ns j)] [Π (j : η), mul_one_class (Ps j)] (es : Π (j : η), Ms j ≃* Ns j) (fs : Π (j : η), Ns j ≃* Ps j) :
= mul_equiv.Pi_congr_right (λ (i : η), (es i).trans (fs i))

# Groups #

@[simp]
theorem add_equiv.map_neg {G : Type u_7} {H : Type u_8} [add_group G] [add_group H] (h : G ≃+ H) (x : G) :
h (-x) = -h x
@[simp]
theorem mul_equiv.map_inv {G : Type u_7} {H : Type u_8} [group G] [group H] (h : G ≃* H) (x : G) :

A multiplicative equivalence of groups preserves inversion.

def add_monoid_hom.to_add_equiv {M : Type u_3} {N : Type u_4} (f : M →+ N) (g : N →+ M) (h₁ : g.comp f = ) (h₂ : f.comp g = ) :
M ≃+ N

Given a pair of additive monoid homomorphisms f, g such that g.comp f = id and f.comp g = id, returns an additive equivalence with to_fun = f and inv_fun = g. This constructor is useful if the underlying type(s) have specialized ext lemmas for additive monoid homomorphisms.

Equations
@[simp]
theorem monoid_hom.to_mul_equiv_apply {M : Type u_3} {N : Type u_4} (f : M →* N) (g : N →* M) (h₁ : g.comp f = ) (h₂ : f.comp g = ) :
(f.to_mul_equiv g h₁ h₂) = f
def monoid_hom.to_mul_equiv {M : Type u_3} {N : Type u_4} (f : M →* N) (g : N →* M) (h₁ : g.comp f = ) (h₂ : f.comp g = ) :
M ≃* N

Given a pair of monoid homomorphisms f, g such that g.comp f = id and f.comp g = id, returns an multiplicative equivalence with to_fun = f and inv_fun = g. This constructor is useful if the underlying type(s) have specialized ext lemmas for monoid homomorphisms.

Equations
@[simp]
theorem add_monoid_hom.to_add_equiv_symm_apply {M : Type u_3} {N : Type u_4} (f : M →+ N) (g : N →+ M) (h₁ : g.comp f = ) (h₂ : f.comp g = ) :
((f.to_add_equiv g h₁ h₂).symm) = g
@[simp]
theorem add_monoid_hom.to_add_equiv_apply {M : Type u_3} {N : Type u_4} (f : M →+ N) (g : N →+ M) (h₁ : g.comp f = ) (h₂ : f.comp g = ) :
(f.to_add_equiv g h₁ h₂) = f
@[simp]
theorem monoid_hom.to_mul_equiv_symm_apply {M : Type u_3} {N : Type u_4} (f : M →* N) (g : N →* M) (h₁ : g.comp f = ) (h₂ : f.comp g = ) :
((f.to_mul_equiv g h₁ h₂).symm) = g
theorem add_equiv.map_sub {A : Type u_1} {B : Type u_2} [add_group A] [add_group B] (h : A ≃+ B) (x y : A) :
h (x - y) = h x - h y

def to_units {G : Type u_1} [group G] :
G ≃*

A group is isomorphic to its group of units.

Equations
G ≃+

@[protected]
theorem group.is_unit {G : Type u_1} [group G] (x : G) :
def units.map_equiv {M : Type u_3} {N : Type u_4} [monoid M] [monoid N] (h : M ≃* N) :

A multiplicative equivalence of monoids defines a multiplicative equivalence of their groups of units.

Equations
def units.mul_left {M : Type u_3} [monoid M] (u : units M) :

Left multiplication by a unit of a monoid is a permutation of the underlying type.

Equations
@[simp]
(u.add_left) = λ (x : M), u + x
@[simp]
theorem units.mul_left_apply {M : Type u_3} [monoid M] (u : units M) :
(u.mul_left) = λ (x : M), (u) * x

Left addition of an additive unit is a permutation of the underlying type.

@[simp]
theorem units.mul_left_symm {M : Type u_3} [monoid M] (u : units M) :
@[simp]
@[simp]
theorem units.mul_right_apply {M : Type u_3} [monoid M] (u : units M) :
(u.mul_right) = λ (x : M), x * u
@[simp]
(u.add_right) = λ (x : M), x + u
def units.mul_right {M : Type u_3} [monoid M] (u : units M) :

Right multiplication by a unit of a monoid is a permutation of the underlying type.

Equations

Right addition of an additive unit is a permutation of the underlying type.

@[simp]
theorem units.mul_right_symm {M : Type u_3} [monoid M] (u : units M) :
@[simp]
@[protected]
def equiv.add_left {G : Type u_7} [add_group G] (a : G) :

Left addition in an add_group is a permutation of the underlying type.

@[protected]
def equiv.mul_left {G : Type u_7} [group G] (a : G) :

Left multiplication in a group is a permutation of the underlying type.

Equations
@[simp]
theorem equiv.coe_mul_left {G : Type u_7} [group G] (a : G) :
@[simp]
theorem equiv.coe_add_left {G : Type u_7} [add_group G] (a : G) :
@[simp, nolint]
theorem equiv.add_left_symm_apply {G : Type u_7} [add_group G] (a : G) :
@[simp, nolint]
theorem equiv.mul_left_symm_apply {G : Type u_7} [group G] (a : G) :

extra simp lemma that dsimp can use. simp will never use this.

@[simp]
theorem equiv.mul_left_symm {G : Type u_7} [group G] (a : G) :
@[simp]
theorem equiv.add_left_symm {G : Type u_7} [add_group G] (a : G) :
@[protected]
def equiv.mul_right {G : Type u_7} [group G] (a : G) :

Right multiplication in a group is a permutation of the underlying type.

Equations
@[protected]
def equiv.add_right {G : Type u_7} [add_group G] (a : G) :

Right addition in an add_group is a permutation of the underlying type.

@[simp]
theorem equiv.coe_add_right {G : Type u_7} [add_group G] (a : G) :
= λ (x : G), x + a
@[simp]
theorem equiv.coe_mul_right {G : Type u_7} [group G] (a : G) :
= λ (x : G), x * a
@[simp]
theorem equiv.add_right_symm {G : Type u_7} [add_group G] (a : G) :
@[simp]
theorem equiv.mul_right_symm {G : Type u_7} [group G] (a : G) :
@[simp, nolint]
theorem equiv.add_right_symm_apply {G : Type u_7} [add_group G] (a : G) :
= λ (x : G), x + -a
@[simp, nolint]
theorem equiv.mul_right_symm_apply {G : Type u_7} [group G] (a : G) :
= λ (x : G), x * a⁻¹

extra simp lemma that dsimp can use. simp will never use this.

@[simp]
theorem equiv.neg_apply (G : Type u_7) [add_group G] :
(equiv.neg G) = λ (a : G), -a
@[protected]
def equiv.neg (G : Type u_7) [add_group G] :

Negation on an add_group is a permutation of the underlying type.

@[simp]
theorem equiv.inv_apply (G : Type u_7) [group G] :
(equiv.inv G) = λ (a : G), a⁻¹
@[protected]
def equiv.inv (G : Type u_7) [group G] :

Inversion on a group is a permutation of the underlying type.

Equations
@[simp]
theorem equiv.neg_symm {G : Type u_7} [add_group G] :
@[simp]
theorem equiv.inv_symm {G : Type u_7} [group G] :
@[protected]
def equiv.mul_left' {G : Type u_7} (a : G) (ha : a 0) :

Left multiplication by a nonzero element in a group_with_zero is a permutation of the underlying type.

Equations
@[simp]
theorem equiv.mul_left'_apply {G : Type u_7} (a : G) (ha : a 0) :
ha) = λ (x : G), a * x
@[simp]
theorem equiv.mul_left'_symm_apply {G : Type u_7} (a : G) (ha : a 0) :
(equiv.symm ha)) = λ (x : G), a⁻¹ * x
@[protected]
def equiv.mul_right' {G : Type u_7} (a : G) (ha : a 0) :

Right multiplication by a nonzero element in a group_with_zero is a permutation of the underlying type.

Equations
@[simp]
theorem equiv.mul_right'_apply {G : Type u_7} (a : G) (ha : a 0) :
ha) = λ (x : G), x * a
@[simp]
theorem equiv.mul_right'_symm_apply {G : Type u_7} (a : G) (ha : a 0) :
(equiv.symm ha)) = λ (x : G), x * a⁻¹
def add_equiv.neg (G : Type u_1)  :
G ≃+ G

When the add_group is commutative, equiv.neg is an add_equiv.

def mul_equiv.inv (G : Type u_1) [comm_group G] :
G ≃* G

When the group is commutative, equiv.inv is a mul_equiv. There is a variant of this mul_equiv.inv' G : G ≃* Gᵒᵖ for the non-commutative case.

Equations
def add_equiv.to_multiplicative {G : Type u_7} {H : Type u_8}  :
G ≃+ H

Reinterpret G ≃+ H as multiplicative G ≃* multiplicative H.

Equations
def mul_equiv.to_additive {G : Type u_7} {H : Type u_8}  :

Reinterpret G ≃* H as additive G ≃+ additive H.

Equations
def add_equiv.to_multiplicative' {G : Type u_7} {H : Type u_8}  :
≃+ H (G ≃*

Reinterpret additive G ≃+ H as G ≃* multiplicative H.

Equations
def mul_equiv.to_additive' {G : Type u_7} {H : Type u_8}  :

Reinterpret G ≃* multiplicative H as additive G ≃+ H as.

Equations
def add_equiv.to_multiplicative'' {G : Type u_7} {H : Type u_8}  :

Reinterpret G ≃+ additive H as multiplicative G ≃* H.

Equations
def mul_equiv.to_additive'' {G : Type u_7} {H : Type u_8}  :

Reinterpret multiplicative G ≃* H as G ≃+ additive H as.

Equations