Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit a7063ec

Browse files
committed
feat(ring_theory/prod): ring homs to/from R × S (#2836)
* move some instances from `algebra/pi_instances`; * add `prod.comm_semiring`; * define `ring_hom.fst`, `ring_hom.snd`, `ring_hom.prod`, and `ring_hom.prod_map`.
1 parent 6ee3a47 commit a7063ec

File tree

3 files changed

+124
-28
lines changed

3 files changed

+124
-28
lines changed

src/algebra/group/prod.lean

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,15 @@ protected def prod (f : M →* N) (g : M →* P) : M →* N × P :=
156156
@[simp, to_additive prod_apply]
157157
lemma prod_apply (f : M →* N) (g : M →* P) (x) : f.prod g x = (f x, g x) := rfl
158158

159-
@[to_additive fst_comp_prod]
159+
@[simp, to_additive fst_comp_prod]
160160
lemma fst_comp_prod (f : M →* N) (g : M →* P) : (fst N P).comp (f.prod g) = f :=
161161
ext $ λ x, rfl
162162

163-
@[to_additive snd_comp_prod]
163+
@[simp, to_additive snd_comp_prod]
164164
lemma snd_comp_prod (f : M →* N) (g : M →* P) : (snd N P).comp (f.prod g) = g :=
165165
ext $ λ x, rfl
166166

167-
@[to_additive prod_unique]
167+
@[simp, to_additive prod_unique]
168168
lemma prod_unique (f : M →* N × P) :
169169
((fst N P).comp f).prod ((snd N P).comp f) = f :=
170170
ext $ λ x, by simp only [prod_apply, coe_fst, coe_snd, comp_apply, prod.mk.eta]
@@ -183,9 +183,8 @@ def prod_map : M × N →* M' × N' := (f.comp (fst M N)).prod (g.comp (snd M N)
183183
@[to_additive prod_map_def]
184184
lemma prod_map_def : prod_map f g = (f.comp (fst M N)).prod (g.comp (snd M N)) := rfl
185185

186-
-- TODO : use `rfl` once we redefine `prod.map` in stdlib
187186
@[simp, to_additive coe_prod_map]
188-
lemma coe_prod_map : ⇑(prod_map f g) = prod.map f g := funext $ λ ⟨x, y⟩, rfl
187+
lemma coe_prod_map : ⇑(prod_map f g) = prod.map f g := rfl
189188

190189
@[to_additive prod_comp_prod_map]
191190
lemma prod_comp_prod_map (f : P →* M) (g : P →* N) (f' : M →* M') (g' : N →* N') :

src/algebra/pi_instances.lean

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
Copyright (c) 2018 Simon Hudon. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Simon Hudon, Patrick Massot
5-
6-
Pi instances for algebraic structures.
75
-/
86
import algebra.module
97
import ring_theory.subring
8+
import ring_theory.prod
9+
10+
/-!
11+
# Pi instances for algebraic structures
12+
-/
1013

1114
namespace pi
1215
universes u v w
@@ -339,32 +342,15 @@ lemma snd_prod [comm_monoid α] [comm_monoid β] {t : finset γ} {f : γ → α
339342
(t.prod f).2 = t.prod (λc, (f c).2) :=
340343
(monoid_hom.snd α β).map_prod f t
341344

342-
instance [semiring α] [semiring β] : semiring (α × β) :=
343-
{ zero_mul := λ a, mk.inj_iff.mpr ⟨zero_mul _, zero_mul _⟩,
344-
mul_zero := λ a, mk.inj_iff.mpr ⟨mul_zero _, mul_zero _⟩,
345-
left_distrib := λ a b c, mk.inj_iff.mpr ⟨left_distrib _ _ _, left_distrib _ _ _⟩,
346-
right_distrib := λ a b c, mk.inj_iff.mpr ⟨right_distrib _ _ _, right_distrib _ _ _⟩,
347-
..prod.add_comm_monoid, ..prod.monoid }
348-
349-
instance [ring α] [ring β] : ring (α × β) :=
350-
{ ..prod.add_comm_group, ..prod.semiring }
351-
352-
instance [comm_ring α] [comm_ring β] : comm_ring (α × β) :=
353-
{ ..prod.ring, ..prod.comm_monoid }
354-
355-
instance [nonzero_comm_ring α] [comm_ring β] : nonzero_comm_ring (α × β) :=
356-
{ zero_ne_one := mt (congr_arg prod.fst) zero_ne_one,
357-
..prod.comm_ring }
358-
359345
instance fst.is_semiring_hom [semiring α] [semiring β] : is_semiring_hom (prod.fst : α × β → α) :=
360-
by refine_struct {..}; simp
346+
(ring_hom.fst α β).is_semiring_hom
361347
instance snd.is_semiring_hom [semiring α] [semiring β] : is_semiring_hom (prod.snd : α × β → β) :=
362-
by refine_struct {..}; simp
348+
(ring_hom.snd α β).is_semiring_hom
363349

364350
instance fst.is_ring_hom [ring α] [ring β] : is_ring_hom (prod.fst : α × β → α) :=
365-
by refine_struct {..}; simp
351+
(ring_hom.fst α β).is_ring_hom
366352
instance snd.is_ring_hom [ring α] [ring β] : is_ring_hom (prod.snd : α × β → β) :=
367-
by refine_struct {..}; simp
353+
(ring_hom.snd α β).is_ring_hom
368354

369355
/-- Left injection function for the inner product
370356
From a vector space (and also group and module) perspective the product is the same as the sum of

src/ring_theory/prod.lean

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/-
2+
Copyright (c) 2020 Yury Kudryashov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Johannes Hölzl, Chris Hughes, Mario Carneiro, Yury Kudryashov
5+
-/
6+
import algebra.group.prod
7+
import algebra.ring
8+
9+
/-!
10+
# Semiring, ring etc structures on `R × S`
11+
12+
In this file we define two-binop (`semiring`, `ring` etc) structures on `R × S`. We also prove
13+
trivial `simp` lemmas, and define the following operations on `ring_hom`s:
14+
15+
* `fst R S : R × S →+* R`, `snd R S : R × S →+* R`: projections `prod.fst` and `prod.snd`
16+
as `ring_hom`s;
17+
* `f.prod g : `R →+* S × T`: sends `x` to `(f x, g x)`;
18+
* `f.prod_map g : `R × S → R' × S'`: `prod.map f g` as a `ring_hom`,
19+
sends `(x, y)` to `(f x, g y)`.
20+
-/
21+
22+
variables {R : Type*} {R' : Type*} {S : Type*} {S' : Type*} {T : Type*} {T' : Type*}
23+
24+
namespace prod
25+
26+
/-- Product of two semirings is a semiring. -/
27+
instance [semiring R] [semiring S] : semiring (R × S) :=
28+
{ zero_mul := λ a, mk.inj_iff.mpr ⟨zero_mul _, zero_mul _⟩,
29+
mul_zero := λ a, mk.inj_iff.mpr ⟨mul_zero _, mul_zero _⟩,
30+
left_distrib := λ a b c, mk.inj_iff.mpr ⟨left_distrib _ _ _, left_distrib _ _ _⟩,
31+
right_distrib := λ a b c, mk.inj_iff.mpr ⟨right_distrib _ _ _, right_distrib _ _ _⟩,
32+
.. prod.add_comm_monoid, .. prod.monoid }
33+
34+
/-- Product of two commutative semirings is a commutative semiring. -/
35+
instance [comm_semiring R] [comm_semiring S] : comm_semiring (R × S) :=
36+
{ .. prod.semiring, .. prod.comm_monoid }
37+
38+
/-- Product of two rings is a ring. -/
39+
instance [ring R] [ring S] : ring (R × S) :=
40+
{ .. prod.add_comm_group, .. prod.semiring }
41+
42+
/-- Product of two commutative rings is a commutative ring. -/
43+
instance [comm_ring R] [comm_ring S] : comm_ring (R × S) :=
44+
{ .. prod.ring, .. prod.comm_monoid }
45+
46+
/-- Product of two commutative rings is a nonzero commutative ring provided that the first
47+
ring is a nonzero ring. -/
48+
instance [nonzero_comm_ring R] [comm_ring S] : nonzero_comm_ring (R × S) :=
49+
{ zero_ne_one := mt (congr_arg prod.fst) zero_ne_one,
50+
.. prod.comm_ring }
51+
52+
end prod
53+
54+
namespace ring_hom
55+
56+
variables (R S) [semiring R] [semiring S]
57+
58+
/-- Given semirings `R`, `S`, the natural projection homomorphism from `R × S` to `R`.-/
59+
def fst : R × S →+* R := { to_fun := prod.fst, .. monoid_hom.fst R S, .. add_monoid_hom.fst R S }
60+
61+
/-- Given semirings `R`, `S`, the natural projection homomorphism from `R × S` to `S`.-/
62+
def snd : R × S →+* S := { to_fun := prod.snd, .. monoid_hom.snd R S, .. add_monoid_hom.snd R S }
63+
64+
variables {R S}
65+
66+
@[simp] lemma coe_fst : ⇑(fst R S) = prod.fst := rfl
67+
@[simp] lemma coe_snd : ⇑(snd R S) = prod.snd := rfl
68+
69+
section prod
70+
71+
variables [semiring T] (f : R →+* S) (g : R →+* T)
72+
73+
/-- Combine two ring homomorphisms `f : R →+* S`, `g : R →+* T` into `f.prod g : R →+* S × T`
74+
given by `(f.prod g) x = (f x, g x)` -/
75+
protected def prod (f : R →+* S) (g : R →+* T) : R →+* S × T :=
76+
{ to_fun := λ x, (f x, g x),
77+
.. monoid_hom.prod (f : R →* S) (g : R →* T), .. add_monoid_hom.prod (f : R →+ S) (g : R →+ T) }
78+
79+
@[simp] lemma prod_apply (x) : f.prod g x = (f x, g x) := rfl
80+
81+
@[simp] lemma fst_comp_prod : (fst S T).comp (f.prod g) = f :=
82+
ext $ λ x, rfl
83+
84+
@[simp] lemma snd_comp_prod : (snd S T).comp (f.prod g) = g :=
85+
ext $ λ x, rfl
86+
87+
lemma prod_unique (f : R →+* S × T) :
88+
((fst S T).comp f).prod ((snd S T).comp f) = f :=
89+
ext $ λ x, by simp only [prod_apply, coe_fst, coe_snd, comp_apply, prod.mk.eta]
90+
91+
end prod
92+
93+
section prod_map
94+
95+
variables [semiring R'] [semiring S'] [semiring T] (f : R →+* R') (g : S →+* S')
96+
97+
/-- `prod.map` as a `ring_hom`. -/
98+
def prod_map : R × S →* R' × S' := (f.comp (fst R S)).prod (g.comp (snd R S))
99+
100+
lemma prod_map_def : prod_map f g = (f.comp (fst R S)).prod (g.comp (snd R S)) := rfl
101+
102+
@[simp]
103+
lemma coe_prod_map : ⇑(prod_map f g) = prod.map f g := rfl
104+
105+
lemma prod_comp_prod_map (f : T →* R) (g : T →* S) (f' : R →* R') (g' : S →* S') :
106+
(f'.prod_map g').comp (f.prod g) = (f'.comp f).prod (g'.comp g) :=
107+
rfl
108+
109+
end prod_map
110+
111+
end ring_hom

0 commit comments

Comments
 (0)