Monoid, group etc structures on M × N
#
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file we define one-binop (monoid
, group
etc) structures on M × N
. We also prove
trivial simp
lemmas, and define the following operations on monoid_hom
s:
fst M N : M × N →* M
,snd M N : M × N →* N
: projectionsprod.fst
andprod.snd
asmonoid_hom
s;inl M N : M →* M × N
,inr M N : N →* M × N
: inclusions of first/second monoid into the product;f.prod g :
M →* N × P: sends
xto
(f x, g x)`;f.coprod g : M × N →* P
: sends(x, y)
tof x * g y
;f.prod_map g : M × N → M' × N'
:prod.map f g
as amonoid_hom
, sends(x, y)
to(f x, g y)
.
Main declarations #
mul_mul_hom
/mul_monoid_hom
/mul_monoid_with_zero_hom
: Multiplication bundled as a multiplicative/monoid/monoid with zero homomorphism.div_monoid_hom
/div_monoid_with_zero_hom
: Division bundled as a monoid/monoid with zero homomorphism.
Equations
- prod.has_involutive_inv = {inv := has_inv.inv prod.has_inv, inv_inv := _}
Equations
- prod.has_involutive_neg = {neg := has_neg.neg prod.has_neg, neg_neg := _}
Equations
- prod.mul_zero_class = {mul := has_mul.mul prod.has_mul, zero := 0, zero_mul := _, mul_zero := _}
Equations
- prod.semigroup = {mul := has_mul.mul prod.has_mul, mul_assoc := _}
Equations
- prod.add_semigroup = {add := has_add.add prod.has_add, add_assoc := _}
Equations
- prod.add_comm_semigroup = {add := add_semigroup.add prod.add_semigroup, add_assoc := _, add_comm := _}
Equations
- prod.comm_semigroup = {mul := semigroup.mul prod.semigroup, mul_assoc := _, mul_comm := _}
Equations
- prod.semigroup_with_zero = {mul := mul_zero_class.mul prod.mul_zero_class, mul_assoc := _, zero := mul_zero_class.zero prod.mul_zero_class, zero_mul := _, mul_zero := _}
Equations
- prod.add_zero_class = {zero := 0, add := has_add.add prod.has_add, zero_add := _, add_zero := _}
Equations
- prod.mul_one_class = {one := 1, mul := has_mul.mul prod.has_mul, one_mul := _, mul_one := _}
Equations
- prod.monoid = {mul := semigroup.mul prod.semigroup, mul_assoc := _, one := mul_one_class.one prod.mul_one_class, one_mul := _, mul_one := _, npow := λ (z : ℕ) (a : M × N), (monoid.npow z a.fst, monoid.npow z a.snd), npow_zero' := _, npow_succ' := _}
Equations
- prod.add_monoid = {add := add_semigroup.add prod.add_semigroup, add_assoc := _, zero := add_zero_class.zero prod.add_zero_class, zero_add := _, add_zero := _, nsmul := λ (z : ℕ) (a : M × N), (add_monoid.nsmul z a.fst, add_monoid.nsmul z a.snd), nsmul_zero' := _, nsmul_succ' := _}
Equations
- prod.div_inv_monoid = {mul := monoid.mul prod.monoid, mul_assoc := _, one := monoid.one prod.monoid, one_mul := _, mul_one := _, npow := monoid.npow prod.monoid, npow_zero' := _, npow_succ' := _, inv := has_inv.inv prod.has_inv, div := has_div.div prod.has_div, div_eq_mul_inv := _, zpow := λ (z : ℤ) (a : G × H), (div_inv_monoid.zpow z a.fst, div_inv_monoid.zpow z a.snd), zpow_zero' := _, zpow_succ' := _, zpow_neg' := _}
Equations
- prod.sub_neg_monoid = {add := add_monoid.add prod.add_monoid, add_assoc := _, zero := add_monoid.zero prod.add_monoid, zero_add := _, add_zero := _, nsmul := add_monoid.nsmul prod.add_monoid, nsmul_zero' := _, nsmul_succ' := _, neg := has_neg.neg prod.has_neg, sub := has_sub.sub prod.has_sub, sub_eq_add_neg := _, zsmul := λ (z : ℤ) (a : G × H), (sub_neg_monoid.zsmul z a.fst, sub_neg_monoid.zsmul z a.snd), zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _}
Equations
- prod.division_monoid = {mul := div_inv_monoid.mul prod.div_inv_monoid, mul_assoc := _, one := div_inv_monoid.one prod.div_inv_monoid, one_mul := _, mul_one := _, npow := div_inv_monoid.npow prod.div_inv_monoid, npow_zero' := _, npow_succ' := _, inv := div_inv_monoid.inv prod.div_inv_monoid, div := div_inv_monoid.div prod.div_inv_monoid, div_eq_mul_inv := _, zpow := div_inv_monoid.zpow prod.div_inv_monoid, zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, inv_inv := _, mul_inv_rev := _, inv_eq_of_mul := _}
Equations
- prod.subtraction_monoid = {add := sub_neg_monoid.add prod.sub_neg_monoid, add_assoc := _, zero := sub_neg_monoid.zero prod.sub_neg_monoid, zero_add := _, add_zero := _, nsmul := sub_neg_monoid.nsmul prod.sub_neg_monoid, nsmul_zero' := _, nsmul_succ' := _, neg := sub_neg_monoid.neg prod.sub_neg_monoid, sub := sub_neg_monoid.sub prod.sub_neg_monoid, sub_eq_add_neg := _, zsmul := sub_neg_monoid.zsmul prod.sub_neg_monoid, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, neg_neg := _, neg_add_rev := _, neg_eq_of_add := _}
Equations
- prod.subtraction_comm_monoid = {add := subtraction_monoid.add prod.subtraction_monoid, add_assoc := _, zero := subtraction_monoid.zero prod.subtraction_monoid, zero_add := _, add_zero := _, nsmul := subtraction_monoid.nsmul prod.subtraction_monoid, nsmul_zero' := _, nsmul_succ' := _, neg := subtraction_monoid.neg prod.subtraction_monoid, sub := subtraction_monoid.sub prod.subtraction_monoid, sub_eq_add_neg := _, zsmul := subtraction_monoid.zsmul prod.subtraction_monoid, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, neg_neg := _, neg_add_rev := _, neg_eq_of_add := _, add_comm := _}
Equations
- prod.division_comm_monoid = {mul := division_monoid.mul prod.division_monoid, mul_assoc := _, one := division_monoid.one prod.division_monoid, one_mul := _, mul_one := _, npow := division_monoid.npow prod.division_monoid, npow_zero' := _, npow_succ' := _, inv := division_monoid.inv prod.division_monoid, div := division_monoid.div prod.division_monoid, div_eq_mul_inv := _, zpow := division_monoid.zpow prod.division_monoid, zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, inv_inv := _, mul_inv_rev := _, inv_eq_of_mul := _, mul_comm := _}
Equations
- prod.add_group = {add := sub_neg_monoid.add prod.sub_neg_monoid, add_assoc := _, zero := sub_neg_monoid.zero prod.sub_neg_monoid, zero_add := _, add_zero := _, nsmul := sub_neg_monoid.nsmul prod.sub_neg_monoid, nsmul_zero' := _, nsmul_succ' := _, neg := sub_neg_monoid.neg prod.sub_neg_monoid, sub := sub_neg_monoid.sub prod.sub_neg_monoid, sub_eq_add_neg := _, zsmul := sub_neg_monoid.zsmul prod.sub_neg_monoid, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _}
Equations
- prod.group = {mul := div_inv_monoid.mul prod.div_inv_monoid, mul_assoc := _, one := div_inv_monoid.one prod.div_inv_monoid, one_mul := _, mul_one := _, npow := div_inv_monoid.npow prod.div_inv_monoid, npow_zero' := _, npow_succ' := _, inv := div_inv_monoid.inv prod.div_inv_monoid, div := div_inv_monoid.div prod.div_inv_monoid, div_eq_mul_inv := _, zpow := div_inv_monoid.zpow prod.div_inv_monoid, zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, mul_left_inv := _}
Equations
Equations
- prod.left_cancel_semigroup = {mul := semigroup.mul prod.semigroup, mul_assoc := _, mul_left_cancel := _}
Equations
Equations
- prod.right_cancel_semigroup = {mul := semigroup.mul prod.semigroup, mul_assoc := _, mul_right_cancel := _}
Equations
- prod.left_cancel_monoid = {mul := left_cancel_semigroup.mul prod.left_cancel_semigroup, mul_assoc := _, mul_left_cancel := _, one := monoid.one prod.monoid, one_mul := _, mul_one := _, npow := monoid.npow prod.monoid, npow_zero' := _, npow_succ' := _}
Equations
- prod.left_cancel_add_monoid = {add := add_left_cancel_semigroup.add prod.left_cancel_add_semigroup, add_assoc := _, add_left_cancel := _, zero := add_monoid.zero prod.add_monoid, zero_add := _, add_zero := _, nsmul := add_monoid.nsmul prod.add_monoid, nsmul_zero' := _, nsmul_succ' := _}
Equations
- prod.right_cancel_add_monoid = {add := add_right_cancel_semigroup.add prod.right_cancel_add_semigroup, add_assoc := _, add_right_cancel := _, zero := add_monoid.zero prod.add_monoid, zero_add := _, add_zero := _, nsmul := add_monoid.nsmul prod.add_monoid, nsmul_zero' := _, nsmul_succ' := _}
Equations
- prod.right_cancel_monoid = {mul := right_cancel_semigroup.mul prod.right_cancel_semigroup, mul_assoc := _, mul_right_cancel := _, one := monoid.one prod.monoid, one_mul := _, mul_one := _, npow := monoid.npow prod.monoid, npow_zero' := _, npow_succ' := _}
Equations
- prod.cancel_add_monoid = {add := add_right_cancel_monoid.add prod.right_cancel_add_monoid, add_assoc := _, add_left_cancel := _, zero := add_right_cancel_monoid.zero prod.right_cancel_add_monoid, zero_add := _, add_zero := _, nsmul := add_right_cancel_monoid.nsmul prod.right_cancel_add_monoid, nsmul_zero' := _, nsmul_succ' := _, add_right_cancel := _}
Equations
- prod.cancel_monoid = {mul := right_cancel_monoid.mul prod.right_cancel_monoid, mul_assoc := _, mul_left_cancel := _, one := right_cancel_monoid.one prod.right_cancel_monoid, one_mul := _, mul_one := _, npow := right_cancel_monoid.npow prod.right_cancel_monoid, npow_zero' := _, npow_succ' := _, mul_right_cancel := _}
Equations
- prod.add_comm_monoid = {add := add_comm_semigroup.add prod.add_comm_semigroup, add_assoc := _, zero := add_monoid.zero prod.add_monoid, zero_add := _, add_zero := _, nsmul := add_monoid.nsmul prod.add_monoid, nsmul_zero' := _, nsmul_succ' := _, add_comm := _}
Equations
- prod.comm_monoid = {mul := comm_semigroup.mul prod.comm_semigroup, mul_assoc := _, one := monoid.one prod.monoid, one_mul := _, mul_one := _, npow := monoid.npow prod.monoid, npow_zero' := _, npow_succ' := _, mul_comm := _}
Equations
- prod.cancel_comm_monoid = {mul := left_cancel_monoid.mul prod.left_cancel_monoid, mul_assoc := _, mul_left_cancel := _, one := left_cancel_monoid.one prod.left_cancel_monoid, one_mul := _, mul_one := _, npow := left_cancel_monoid.npow prod.left_cancel_monoid, npow_zero' := _, npow_succ' := _, mul_comm := _}
Equations
- prod.cancel_add_comm_monoid = {add := add_left_cancel_monoid.add prod.left_cancel_add_monoid, add_assoc := _, add_left_cancel := _, zero := add_left_cancel_monoid.zero prod.left_cancel_add_monoid, zero_add := _, add_zero := _, nsmul := add_left_cancel_monoid.nsmul prod.left_cancel_add_monoid, nsmul_zero' := _, nsmul_succ' := _, add_comm := _}
Equations
- prod.mul_zero_one_class = {one := mul_one_class.one prod.mul_one_class, mul := mul_zero_class.mul prod.mul_zero_class, one_mul := _, mul_one := _, zero := mul_zero_class.zero prod.mul_zero_class, zero_mul := _, mul_zero := _}
Equations
- prod.monoid_with_zero = {mul := monoid.mul prod.monoid, mul_assoc := _, one := monoid.one prod.monoid, one_mul := _, mul_one := _, npow := monoid.npow prod.monoid, npow_zero' := _, npow_succ' := _, zero := mul_zero_one_class.zero prod.mul_zero_one_class, zero_mul := _, mul_zero := _}
Equations
- prod.comm_monoid_with_zero = {mul := comm_monoid.mul prod.comm_monoid, mul_assoc := _, one := comm_monoid.one prod.comm_monoid, one_mul := _, mul_one := _, npow := comm_monoid.npow prod.comm_monoid, npow_zero' := _, npow_succ' := _, mul_comm := _, zero := monoid_with_zero.zero prod.monoid_with_zero, zero_mul := _, mul_zero := _}
Equations
- prod.add_comm_group = {add := add_comm_semigroup.add prod.add_comm_semigroup, add_assoc := _, zero := add_group.zero prod.add_group, zero_add := _, add_zero := _, nsmul := add_group.nsmul prod.add_group, nsmul_zero' := _, nsmul_succ' := _, neg := add_group.neg prod.add_group, sub := add_group.sub prod.add_group, sub_eq_add_neg := _, zsmul := add_group.zsmul prod.add_group, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _}
Equations
- prod.comm_group = {mul := comm_semigroup.mul prod.comm_semigroup, mul_assoc := _, one := group.one prod.group, one_mul := _, mul_one := _, npow := group.npow prod.group, npow_zero' := _, npow_succ' := _, inv := group.inv prod.group, div := group.div prod.group, div_eq_mul_inv := _, zpow := group.zpow prod.group, zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, mul_left_inv := _, mul_comm := _}
Combine two monoid_hom
s f : M →ₙ* N
, g : M →ₙ* P
into
f.prod g : M →ₙ* (N × P)
given by (f.prod g) x = (f x, g x)
.
prod.map
as an add_monoid_hom
Equations
- f.prod_map g = (f.comp (add_hom.fst M N)).prod (g.comp (add_hom.snd M N))
Coproduct of two mul_hom
s with the same codomain:
f.coprod g (p : M × N) = f p.1 * g p.2
.
Equations
- f.coprod g = f.comp (mul_hom.fst M N) * g.comp (mul_hom.snd M N)
Coproduct of two add_hom
s with the same codomain:
f.coprod g (p : M × N) = f p.1 + g p.2
.
Equations
- f.coprod g = f.comp (add_hom.fst M N) + g.comp (add_hom.snd M N)
Given monoids M
, N
, the natural projection homomorphism from M × N
to M
.
Given additive monoids A
, B
, the natural projection homomorphism
from A × B
to A
Given monoids M
, N
, the natural projection homomorphism from M × N
to N
.
Given additive monoids A
, B
, the natural projection homomorphism
from A × B
to B
Given monoids M
, N
, the natural inclusion homomorphism from M
to M × N
.
Given additive monoids A
, B
, the natural inclusion homomorphism
from A
to A × B
.
Given additive monoids A
, B
, the natural inclusion homomorphism
from B
to A × B
.
Given monoids M
, N
, the natural inclusion homomorphism from N
to M × N
.
Combine two add_monoid_hom
s f : M →+ N
, g : M →+ P
into
f.prod g : M →+ N × P
given by (f.prod g) x = (f x, g x)
Combine two monoid_hom
s f : M →* N
, g : M →* P
into f.prod g : M →* N × P
given by (f.prod g) x = (f x, g x)
.
prod.map
as an add_monoid_hom
Equations
- f.prod_map g = (f.comp (add_monoid_hom.fst M N)).prod (g.comp (add_monoid_hom.snd M N))
prod.map
as a monoid_hom
.
Equations
- f.prod_map g = (f.comp (monoid_hom.fst M N)).prod (g.comp (monoid_hom.snd M N))
Coproduct of two monoid_hom
s with the same codomain:
f.coprod g (p : M × N) = f p.1 * g p.2
.
Equations
- f.coprod g = f.comp (monoid_hom.fst M N) * g.comp (monoid_hom.snd M N)
Coproduct of two add_monoid_hom
s with the same codomain:
f.coprod g (p : M × N) = f p.1 + g p.2
.
Equations
- f.coprod g = f.comp (add_monoid_hom.fst M N) + g.comp (add_monoid_hom.snd M N)
The equivalence between M × N
and N × M
given by swapping the components
is multiplicative.
Equations
- mul_equiv.prod_comm = {to_fun := (equiv.prod_comm M N).to_fun, inv_fun := (equiv.prod_comm M N).inv_fun, left_inv := _, right_inv := _, map_mul' := _}
The equivalence between M × N
and N × M
given by swapping the
components is additive.
Equations
- add_equiv.prod_comm = {to_fun := (equiv.prod_comm M N).to_fun, inv_fun := (equiv.prod_comm M N).inv_fun, left_inv := _, right_inv := _, map_add' := _}
Four-way commutativity of prod
.
The name matches mul_mul_mul_comm
Four-way commutativity of prod
. The name matches mul_mul_mul_comm
.
Product of multiplicative isomorphisms; the maps come from equiv.prod_congr
.
Product of additive isomorphisms; the maps come from equiv.prod_congr
.
Multiplying by the trivial monoid doesn't change the structure.
Equations
- add_equiv.unique_prod = {to_fun := (equiv.unique_prod M N).to_fun, inv_fun := (equiv.unique_prod M N).inv_fun, left_inv := _, right_inv := _, map_add' := _}
Multiplying by the trivial monoid doesn't change the structure.
Equations
- mul_equiv.unique_prod = {to_fun := (equiv.unique_prod M N).to_fun, inv_fun := (equiv.unique_prod M N).inv_fun, left_inv := _, right_inv := _, map_mul' := _}
Multiplying by the trivial monoid doesn't change the structure.
Equations
- add_equiv.prod_unique = {to_fun := (equiv.prod_unique M N).to_fun, inv_fun := (equiv.prod_unique M N).inv_fun, left_inv := _, right_inv := _, map_add' := _}
Multiplying by the trivial monoid doesn't change the structure.
Equations
- mul_equiv.prod_unique = {to_fun := (equiv.prod_unique M N).to_fun, inv_fun := (equiv.prod_unique M N).inv_fun, left_inv := _, right_inv := _, map_mul' := _}
The additive monoid equivalence between additive units of a product of two additive monoids, and the product of the additive units of each additive monoid.
Equations
- add_equiv.prod_add_units = {to_fun := ⇑((add_units.map (add_monoid_hom.fst M N)).prod (add_units.map (add_monoid_hom.snd M N))), inv_fun := λ (u : add_units M × add_units N), {val := (↑(u.fst), ↑(u.snd)), neg := (↑-u.fst, ↑-u.snd), val_neg := _, neg_val := _}, left_inv := _, right_inv := _, map_add' := _}
The monoid equivalence between units of a product of two monoids, and the product of the units of each monoid.
Multiplication and division as homomorphisms #
Multiplication as a multiplicative homomorphism.
Addition as an additive homomorphism.
Addition as an additive monoid homomorphism.
Equations
- add_add_monoid_hom = {to_fun := add_add_hom.to_fun, map_zero' := _, map_add' := _}
Multiplication as a monoid homomorphism.
Equations
- mul_monoid_hom = {to_fun := mul_mul_hom.to_fun, map_one' := _, map_mul' := _}
Multiplication as a multiplicative homomorphism with zero.
Equations
- mul_monoid_with_zero_hom = {to_fun := mul_monoid_hom.to_fun, map_zero' := _, map_one' := _, map_mul' := _}