mathlib documentation

data.equiv.mul_add

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 #

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 #

equiv, mul_equiv, add_equiv

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

Makes an additive inverse from a bijection which preserves addition.

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

Makes a multiplicative inverse from a bijection which preserves multiplication.

Equations
def add_monoid_hom.inverse {A : Type u_1} {B : Type u_2} [add_monoid A] [add_monoid B] (f : A →+ B) (g : B → A) (h₁ : function.left_inverse g f) (h₂ : function.right_inverse g f) :
B →+ A

The inverse of a bijective add_monoid_hom is an add_monoid_hom.

Equations
def monoid_hom.inverse {A : Type u_1} {B : Type u_2} [monoid A] [monoid B] (f : A →* B) (g : B → A) (h₁ : function.left_inverse g f) (h₂ : function.right_inverse g f) :
B →* A

The inverse of a bijective monoid_hom is a monoid_hom.

Equations
@[simp]
theorem add_monoid_hom.inverse_apply {A : Type u_1} {B : Type u_2} [add_monoid A] [add_monoid B] (f : A →+ B) (g : B → A) (h₁ : function.left_inverse g f) (h₂ : function.right_inverse g f) (ᾰ : B) :
(f.inverse g h₁ h₂) = g ᾰ
@[simp]
theorem monoid_hom.inverse_apply {A : Type u_1} {B : Type u_2} [monoid A] [monoid B] (f : A →* B) (g : B → A) (h₁ : function.left_inverse g f) (h₂ : function.right_inverse g f) (ᾰ : B) :
(f.inverse g h₁ h₂) = g ᾰ
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.

structure add_equiv (A : Type u_9) (B : Type u_10) [has_add A] [has_add B] :
Type (max u_10 u_9)

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

def add_equiv.to_add_hom {A : Type u_9} {B : Type u_10} [has_add A] [has_add B] (self : A ≃+ 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) :

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)

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

@[protected, instance]
def add_equiv.has_coe_to_fun {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] :
has_coe_to_fun (M ≃+ N) (λ (_x : M ≃+ N), M → N)
Equations
@[protected, instance]
def mul_equiv.has_coe_to_fun {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] :
has_coe_to_fun (M ≃* N) (λ (_x : M ≃* N), M → 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]
theorem add_equiv.coe_to_add_hom {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] {f : M ≃+ N} :
@[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

Makes an additive isomorphism from a bijection which preserves addition.

Equations
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) :
def add_equiv.refl (M : Type u_1) [has_add M] :
M ≃+ M

The identity map is an additive isomorphism.

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

The identity map is a multiplicative isomorphism.

Equations
@[protected, instance]
def add_equiv.inhabited {M : Type u_3} [has_add M] :
Equations
@[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.

Equations
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
@[simp]
theorem mul_equiv.inv_fun_eq_symm {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] {f : M ≃* N} :
@[simp]
theorem add_equiv.neg_fun_eq_symm {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] {f : M ≃+ N} :
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

Equations
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

See Note [custom simps projection]

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₁ : function.left_inverse g f) (h₂ : function.right_inverse g 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₁ : function.left_inverse g f) (h₂ : function.right_inverse g 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.to_equiv_mk {M : Type u_3} {N : Type u_4} [has_mul M] [has_mul N] (f : M → N) (g : N → M) (h₁ : function.left_inverse g f) (h₂ : function.right_inverse g 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₃}.to_equiv = {to_fun := f, inv_fun := g, left_inv := h₁, right_inv := h₂}
@[simp]
theorem add_equiv.to_equiv_mk {M : Type u_3} {N : Type u_4} [has_add M] [has_add N] (f : M → N) (g : N → M) (h₁ : function.left_inverse g f) (h₂ : function.right_inverse g 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₃}.to_equiv = {to_fun := f, inv_fun := g, left_inv := h₁, right_inv := h₂}
@[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] :
theorem add_equiv.symm_bijective {M : Type u_3} {N : Type u_4} [has_add M] [has_add 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₁ : function.left_inverse g f) (h₂ : function.right_inverse g 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₁ : function.left_inverse g f) (h₂ : function.right_inverse g 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

Transitivity of addition-preserving isomorphisms

Equations
@[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.coe_refl {M : Type u_3} [has_add M] :
theorem add_equiv.refl_apply {M : Type u_3} [has_add M] (m : M) :
theorem mul_equiv.refl_apply {M : Type u_3} [has_mul 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.symm_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) (p : P) :
((e₁.trans e₂).symm) p = (e₁.symm) ((e₂.symm) p)
@[simp]
theorem mul_equiv.symm_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) (p : P) :
((e₁.trans e₂).symm) p = (e₁.symm) ((e₂.symm) p)
@[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
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₁ : function.left_inverse e' e) (h₂ : function.right_inverse e' 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₁ : function.left_inverse e' e) (h₂ : function.right_inverse e' 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₁ : function.left_inverse e f) (h₂ : function.right_inverse e 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₁ : function.left_inverse e f) (h₂ : function.right_inverse e 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
def add_equiv.add_equiv_of_unique_of_unique {M : Type u_1} {N : Type u_2} [unique M] [unique N] [has_add M] [has_add N] :
M ≃+ N

The add_equiv between two add_monoids with a unique element.

Equations
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)
Equations
@[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} [add_zero_class M] [add_zero_class N] (h : M ≃+ N) :
h 0 = 0
@[simp]
theorem mul_equiv.map_one {M : Type u_1} {N : Type u_2} [mul_one_class M] [mul_one_class N] (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} [add_zero_class M] [add_zero_class N] (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} [mul_one_class M] [mul_one_class N] (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} [add_zero_class M] [add_zero_class N] (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} [mul_one_class M] [mul_one_class N] (h : M ≃* N) {x : M} :
h x 1 x 1
noncomputable def add_equiv.of_bijective {M : Type u_1} {N : Type u_2} [add_zero_class M] [add_zero_class N] (f : M →+ N) (hf : function.bijective f) :
M ≃+ N

A bijective add_monoid homomorphism is an isomorphism

Equations
noncomputable def mul_equiv.of_bijective {M : Type u_1} {N : Type u_2} [mul_one_class M] [mul_one_class N] (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} [add_zero_class M] [add_zero_class N] (h : M ≃+ N) :
M →+ N

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

Equations
def mul_equiv.to_monoid_hom {M : Type u_1} {N : Type u_2} [mul_one_class M] [mul_one_class N] (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} [mul_one_class M] [mul_one_class N] (e : M ≃* N) :
@[simp]
theorem add_equiv.coe_to_add_monoid_hom {M : Type u_1} {N : Type u_2} [add_zero_class M] [add_zero_class N] (e : M ≃+ N) :
@[simp]
theorem add_equiv.arrow_congr_apply {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} [add_zero_class P] [add_zero_class Q] (f : M N) (g : P ≃+ Q) (h : M → P) (n : N) :
(add_equiv.arrow_congr f g) 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} [add_zero_class P] [add_zero_class Q] (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.

Equations
def mul_equiv.arrow_congr {M : Type u_1} {N : Type u_2} {P : Type u_3} {Q : Type u_4} [mul_one_class P] [mul_one_class Q] (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} [mul_one_class P] [mul_one_class Q] (f : M N) (g : P ≃* Q) (h : M → P) (n : N) :
(mul_equiv.arrow_congr f g) 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} [add_zero_class M] [add_zero_class N] [add_comm_monoid P] [add_comm_monoid Q] (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.

Equations
@[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} [add_zero_class M] [add_zero_class N] [add_comm_monoid P] [add_comm_monoid Q] (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} [mul_one_class M] [mul_one_class N] [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} [mul_one_class M] [mul_one_class N] [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 : η) :
(mul_equiv.Pi_congr_right es) x 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 : η) :
(add_equiv.Pi_congr_right es) x 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.

Equations
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) :
@[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) :

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} [add_zero_class M] [add_zero_class N] (f : M →+ N) (g : N →+ M) (h₁ : g.comp f = add_monoid_hom.id M) (h₂ : f.comp g = add_monoid_hom.id N) :
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} [mul_one_class M] [mul_one_class N] (f : M →* N) (g : N →* M) (h₁ : g.comp f = monoid_hom.id M) (h₂ : f.comp g = monoid_hom.id N) :
(f.to_mul_equiv g h₁ h₂) = f
def monoid_hom.to_mul_equiv {M : Type u_3} {N : Type u_4} [mul_one_class M] [mul_one_class N] (f : M →* N) (g : N →* M) (h₁ : g.comp f = monoid_hom.id M) (h₂ : f.comp g = monoid_hom.id N) :
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} [add_zero_class M] [add_zero_class N] (f : M →+ N) (g : N →+ M) (h₁ : g.comp f = add_monoid_hom.id M) (h₂ : f.comp g = add_monoid_hom.id N) :
((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} [add_zero_class M] [add_zero_class N] (f : M →+ N) (g : N →+ M) (h₁ : g.comp f = add_monoid_hom.id M) (h₂ : f.comp g = add_monoid_hom.id N) :
(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} [mul_one_class M] [mul_one_class N] (f : M →* N) (g : N →* M) (h₁ : g.comp f = monoid_hom.id M) (h₂ : f.comp g = monoid_hom.id N) :
((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

An additive equivalence of additive groups preserves subtraction.

def to_units {G : Type u_7} [group G] :

A group is isomorphic to its group of units.

Equations
def to_add_units {G : Type u_7} [add_group G] :

An additive group is isomorphic to its group of additive units

Equations
@[simp]
theorem coe_to_units {G : Type u_7} [group G] (g : G) :
@[simp]
theorem coe_to_add_units {G : Type u_7} [add_group G] (g : G) :
@[protected]
theorem group.is_unit {G : Type u_1} [group G] (x : G) :
@[simp]
theorem units.coe_inv {G : Type u_7} [group G] (u : units G) :
@[simp]
theorem add_units.coe_neg {G : Type u_7} [add_group G] (u : add_units 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]
theorem add_units.add_left_apply {M : Type u_3} [add_monoid M] (u : add_units M) :
(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
def add_units.add_left {M : Type u_3} [add_monoid M] (u : add_units M) :

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

Equations
@[simp]
theorem units.mul_left_symm {M : Type u_3} [monoid M] (u : units M) :
@[simp]
theorem add_units.add_left_symm {M : Type u_3} [add_monoid M] (u : add_units M) :
theorem units.mul_left_bijective {M : Type u_3} [monoid M] (a : units M) :
@[simp]
theorem units.mul_right_apply {M : Type u_3} [monoid M] (u : units M) :
(u.mul_right) = λ (x : M), x * u
@[simp]
theorem add_units.add_right_apply {M : Type u_3} [add_monoid M] (u : add_units M) :
(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
def add_units.add_right {M : Type u_3} [add_monoid M] (u : add_units M) :

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

Equations
@[simp]
theorem units.mul_right_symm {M : Type u_3} [monoid M] (u : units M) :
@[simp]
theorem add_units.add_right_symm {M : Type u_3} [add_monoid M] (u : add_units M) :
theorem units.mul_right_bijective {M : Type u_3} [monoid M] (a : units M) :
function.bijective (λ (_x : M), _x * a)
theorem add_units.add_right_bijective {M : Type u_3} [add_monoid M] (a : add_units M) :
function.bijective (λ (_x : M), _x + a)
@[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.

Equations
@[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) :
theorem group.mul_left_bijective {G : Type u_7} [group G] (a : G) :
theorem add_group.add_left_bijective {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.

Equations
@[simp]
theorem equiv.coe_add_right {G : Type u_7} [add_group G] (a : G) :
(equiv.add_right a) = λ (x : G), x + a
@[simp]
theorem equiv.coe_mul_right {G : Type u_7} [group G] (a : G) :
(equiv.mul_right a) = λ (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) :
(equiv.symm (equiv.add_right a)) = λ (x : G), x + -a
@[simp, nolint]
theorem equiv.mul_right_symm_apply {G : Type u_7} [group G] (a : G) :
(equiv.symm (equiv.mul_right a)) = λ (x : G), x * a⁻¹

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

theorem add_group.add_right_bijective {G : Type u_7} [add_group G] (a : G) :
function.bijective (λ (_x : G), _x + a)
theorem group.mul_right_bijective {G : Type u_7} [group G] (a : G) :
function.bijective (λ (_x : G), _x * a)
@[simp]
theorem equiv.neg_apply (G : Type u_7) [add_group G] :
@[protected]
def equiv.neg (G : Type u_7) [add_group G] :

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

Equations
@[simp]
theorem equiv.inv_apply (G : Type u_7) [group G] :
@[protected]
def equiv.inv (G : Type u_7) [group G] :

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

Equations
@[protected]
def equiv.inv₀ (G : Type u_1) [group_with_zero G] :

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

Equations
@[simp]
theorem equiv.inv₀_apply (G : Type u_1) [group_with_zero G] :
@[simp]
theorem equiv.neg_symm {G : Type u_7} [add_group G] :
@[simp]
theorem equiv.inv_symm {G : Type u_7} [group G] :
@[simp]
@[protected]
def equiv.sub_left {G : Type u_7} [add_group G] (a : G) :
G G

A version of equiv.add_left a (-b) that is defeq to a - b.

Equations
@[simp]
theorem equiv.div_left_symm_apply {G : Type u_7} [group G] (a b : G) :
@[simp]
theorem equiv.div_left_apply {G : Type u_7} [group G] (a b : G) :
@[simp]
theorem equiv.sub_left_symm_apply {G : Type u_7} [add_group G] (a b : G) :
@[protected]
def equiv.div_left {G : Type u_7} [group G] (a : G) :
G G

A version of equiv.mul_left a b⁻¹ that is defeq to a / b.

Equations
@[simp]
theorem equiv.sub_left_apply {G : Type u_7} [add_group G] (a b : G) :
@[simp]
theorem equiv.div_right_apply {G : Type u_7} [group G] (a b : G) :
@[simp]
theorem equiv.sub_right_symm_apply {G : Type u_7} [add_group G] (a b : G) :
@[simp]
theorem equiv.sub_right_apply {G : Type u_7} [add_group G] (a b : G) :
@[protected]
def equiv.sub_right {G : Type u_7} [add_group G] (a : G) :
G G

A version of equiv.add_right (-a) b that is defeq to b - a.

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

A version of equiv.mul_right a⁻¹ b that is defeq to b / a.

Equations
@[simp]
theorem equiv.div_right_symm_apply {G : Type u_7} [group G] (a b : G) :
@[simp]
theorem equiv.mul_left₀_apply {G : Type u_7} [group_with_zero G] (a : G) (ha : a 0) :
@[simp]
theorem equiv.mul_left₀_symm_apply {G : Type u_7} [group_with_zero G] (a : G) (ha : a 0) :
@[protected]
def equiv.mul_left₀ {G : Type u_7} [group_with_zero G] (a : G) (ha : a 0) :

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

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

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

Equations
theorem mul_right_bijective₀ {G : Type u_7} [group_with_zero G] (a : G) (ha : a 0) :
function.bijective (λ (_x : G), _x * a)
def add_equiv.neg (G : Type u_1) [add_comm_group G] :
G ≃+ G

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

Equations
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 mul_equiv.inv₀ (G : Type u_1) [comm_group_with_zero G] :
G ≃* G

When the group with zero is commutative, equiv.inv₀ is a mul_equiv.

Equations
@[simp]
theorem mul_equiv.inv₀_apply (G : Type u_1) [comm_group_with_zero G] (ᾰ : G) :
def mul_equiv.to_additive' {G : Type u_7} {H : Type u_8} [mul_one_class G] [add_zero_class H] :

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

Equations
def mul_equiv.to_additive'' {G : Type u_7} {H : Type u_8} [add_zero_class G] [mul_one_class H] :

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

Equations