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_monoid
s/add_group
s and monoid
s/group
s.
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
Makes an additive inverse from a bijection which preserves addition.
Makes a multiplicative inverse from a bijection which preserves multiplication.
Equations
- mul_equiv.has_coe_to_fun = {F := λ (x : M ≃* N), M → N, coe := mul_equiv.to_fun _inst_2}
The identity map is an additive isomorphism.
The identity map is a multiplicative isomorphism.
Equations
- mul_equiv.refl M = {to_fun := (equiv.refl M).to_fun, inv_fun := (equiv.refl M).inv_fun, left_inv := _, right_inv := _, map_mul' := _}
Equations
- mul_equiv.inhabited = {default := mul_equiv.refl M _inst_1}
See Note custom simps projection
See Note [custom simps projection]
Equations
- mul_equiv.simps.symm_apply e = ⇑(e.symm)
The mul_equiv
between two monoids with a unique element.
Equations
- mul_equiv.mul_equiv_of_unique_of_unique = {to_fun := equiv_of_unique_of_unique.to_fun, inv_fun := equiv_of_unique_of_unique.inv_fun, left_inv := _, right_inv := _, map_mul' := _}
There is a unique monoid homomorphism between two monoids with a unique element.
Equations
- mul_equiv.unique = {to_inhabited := {default := mul_equiv.mul_equiv_of_unique_of_unique _inst_8}, uniq := _}
Monoids #
A multiplicative equiv of monoids sends 1 to 1 (and is hence a monoid isomorphism).
A bijective add_monoid
homomorphism is an isomorphism
A bijective monoid
homomorphism is an isomorphism
Equations
- mul_equiv.of_bijective f hf = {to_fun := (equiv.of_bijective ⇑f hf).to_fun, inv_fun := (equiv.of_bijective ⇑f hf).inv_fun, left_inv := _, right_inv := _, map_mul' := _}
Extract the forward direction of an additive equivalence as an addition-preserving function.
Extract the forward direction of a multiplicative equivalence as a multiplication-preserving function.
An additive analogue of equiv.arrow_congr
,
where the equivalence between the targets is additive.
A multiplicative analogue of equiv.arrow_congr
,
where the equivalence between the targets is multiplicative.
An additive analogue of equiv.arrow_congr
,
for additive maps from an additive monoid to a commutative additive monoid.
A multiplicative analogue of equiv.arrow_congr
,
for multiplicative maps from a monoid to a commutative monoid.
Equations
- f.monoid_hom_congr g = {to_fun := λ (h : M →* P), g.to_monoid_hom.comp (h.comp f.symm.to_monoid_hom), inv_fun := λ (k : N →* Q), g.symm.to_monoid_hom.comp (k.comp f.to_monoid_hom), left_inv := _, right_inv := _, map_mul' := _}
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
.
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
.
Groups #
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.
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.
An additive group is isomorphic to its group of additive units
A multiplicative equivalence of monoids defines a multiplicative equivalence of their groups of units.
Equations
- units.map_equiv h = {to_fun := (units.map h.to_monoid_hom).to_fun, inv_fun := ⇑(units.map h.symm.to_monoid_hom), left_inv := _, right_inv := _, map_mul' := _}
Left addition of an additive unit is a permutation of the underlying type.
Right addition of an additive unit is a permutation of the underlying type.
Left addition in an add_group
is a permutation of the underlying type.
extra simp lemma that dsimp
can use. simp
will never use this.
Right addition in an add_group
is a permutation of the underlying type.
extra simp lemma that dsimp
can use. simp
will never use this.
Negation on an add_group
is a permutation of the underlying type.
Left multiplication by a nonzero element in a group_with_zero
is a permutation of the
underlying type.
Right multiplication by a nonzero element in a group_with_zero
is a permutation of the
underlying type.
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
- mul_equiv.inv G = {to_fun := has_inv.inv (div_inv_monoid.to_has_inv G), inv_fun := has_inv.inv (div_inv_monoid.to_has_inv G), left_inv := _, right_inv := _, map_mul' := _}
Reinterpret G ≃+ H
as multiplicative G ≃* multiplicative H
.
Equations
- add_equiv.to_multiplicative = {to_fun := λ (f : G ≃+ H), {to_fun := ⇑(⇑add_monoid_hom.to_multiplicative f.to_add_monoid_hom), inv_fun := ⇑(⇑add_monoid_hom.to_multiplicative f.symm.to_add_monoid_hom), left_inv := _, right_inv := _, map_mul' := _}, inv_fun := λ (f : multiplicative G ≃* multiplicative H), {to_fun := ⇑(f.to_monoid_hom), inv_fun := ⇑(f.symm.to_monoid_hom), left_inv := _, right_inv := _, map_add' := _}, left_inv := _, right_inv := _}
Reinterpret G ≃* H
as additive G ≃+ additive H
.
Equations
- mul_equiv.to_additive = {to_fun := λ (f : G ≃* H), {to_fun := ⇑(⇑monoid_hom.to_additive f.to_monoid_hom), inv_fun := ⇑(⇑monoid_hom.to_additive f.symm.to_monoid_hom), left_inv := _, right_inv := _, map_add' := _}, inv_fun := λ (f : additive G ≃+ additive H), {to_fun := ⇑(f.to_add_monoid_hom), inv_fun := ⇑(f.symm.to_add_monoid_hom), left_inv := _, right_inv := _, map_mul' := _}, left_inv := _, right_inv := _}
Reinterpret additive G ≃+ H
as G ≃* multiplicative H
.
Equations
- add_equiv.to_multiplicative' = {to_fun := λ (f : additive G ≃+ H), {to_fun := ⇑(⇑add_monoid_hom.to_multiplicative' f.to_add_monoid_hom), inv_fun := ⇑(⇑add_monoid_hom.to_multiplicative'' f.symm.to_add_monoid_hom), left_inv := _, right_inv := _, map_mul' := _}, inv_fun := λ (f : G ≃* multiplicative H), {to_fun := ⇑(f.to_monoid_hom), inv_fun := ⇑(f.symm.to_monoid_hom), left_inv := _, right_inv := _, map_add' := _}, left_inv := _, right_inv := _}
Reinterpret G ≃* multiplicative H
as additive G ≃+ H
as.
Reinterpret G ≃+ additive H
as multiplicative G ≃* H
.
Equations
- add_equiv.to_multiplicative'' = {to_fun := λ (f : G ≃+ additive H), {to_fun := ⇑(⇑add_monoid_hom.to_multiplicative'' f.to_add_monoid_hom), inv_fun := ⇑(⇑add_monoid_hom.to_multiplicative' f.symm.to_add_monoid_hom), left_inv := _, right_inv := _, map_mul' := _}, inv_fun := λ (f : multiplicative G ≃* H), {to_fun := ⇑(f.to_monoid_hom), inv_fun := ⇑(f.symm.to_monoid_hom), left_inv := _, right_inv := _, map_add' := _}, left_inv := _, right_inv := _}
Reinterpret multiplicative G ≃* H
as G ≃+ additive H
as.