Skip to content

Commit c61602c

Browse files
committed
feat(Algebra/Group/Submonoid/Units): units in MonoidHom.eqLocusM (leanprover-community#40171)
This PR adds `MonoidHom.isUnit_eqLocusM_mk_iff`, which is the monoid version of `RingHom.isUnit_eqLocus_mk_iff`. @eric-wieser
1 parent 0531bb7 commit c61602c

2 files changed

Lines changed: 35 additions & 11 deletions

File tree

Mathlib/Algebra/Group/Submonoid/Units.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,3 +339,17 @@ def unitsEquivSelf (H : Subgroup G) : H.units ≃* H :=
339339
H.unitsEquivUnitsType.trans (toUnits (G := H)).symm
340340

341341
end Subgroup
342+
343+
@[to_additive]
344+
theorem MonoidHom.isUnit_eqLocusM_mk_iff {N : Type*} [Monoid N] (f g : M →* N) {r : M}
345+
(hr : f r = g r) : IsUnit (⟨r, hr⟩ : f.eqLocusM g) ↔ IsUnit r := by
346+
refine ⟨fun h ↦ h.map (SubmonoidClass.subtype _), fun h ↦ ?_⟩
347+
obtain ⟨s, hs⟩ := isUnit_iff_exists.mp h
348+
suffices ∃ a, r * a = 1 ∧ f a = g a ∧ a * r = 1 by
349+
simpa [isUnit_iff_exists, ← Subtype.val_inj]
350+
refine ⟨s, hs.left, ?_, hs.right⟩
351+
rw [← mul_one (f s), ← map_one g, ← hs.left, map_mul, ← mul_assoc, ← hr, ← map_mul,
352+
hs.right, map_one, one_mul]
353+
354+
instance {N : Type*} [Monoid N] (f g : M →* N) : IsLocalHom (f.eqLocusM g).subtype where
355+
map_nonunit r := f.isUnit_eqLocusM_mk_iff g r.prop |>.2

Mathlib/Algebra/Ring/Subring/Units.lean

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public import Mathlib.Algebra.Order.GroupWithZero.Submonoid
1111
public import Mathlib.Algebra.Order.Ring.Defs
1212
public import Mathlib.Algebra.Ring.Subring.Basic
1313

14+
import Mathlib.Algebra.Group.Submonoid.Units
15+
1416
/-!
1517
1618
# Unit subgroups of a ring
@@ -31,14 +33,22 @@ theorem Units.mem_posSubgroup {R : Type*} [Semiring R] [LinearOrder R] [IsStrict
3133
(u : Rˣ) : u ∈ Units.posSubgroup R ↔ (0 : R) < u :=
3234
Iff.rfl
3335

34-
theorem RingHom.isUnit_eqLocus_mk_iff {R T : Type*} [Ring R] [Semiring T] (f g : R →+* T)
35-
{r : R} (hr : f r = g r) : IsUnit (⟨r, hr⟩ : f.eqLocus g) ↔ IsUnit r := by
36-
refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
37-
· simp [isUnit_iff_exists, ← Subtype.val_inj] at h ⊢
38-
grind
39-
obtain ⟨s, hs⟩ := isUnit_iff_exists.mp h
40-
suffices ∃ a, r * a = 1 ∧ f a = g a ∧ a * r = 1 by
41-
simpa [isUnit_iff_exists, ← Subtype.val_inj]
42-
refine ⟨s, hs.left, ?_, hs.right⟩
43-
rw [← mul_one (f s), ← map_one g, ← hs.left, map_mul, ← mul_assoc, ← hr, ← map_mul,
44-
hs.right, map_one, one_mul]
36+
namespace RingHom
37+
38+
variable {R T : Type*} [Semiring T]
39+
40+
theorem isUnit_eqLocusS_mk_iff [Semiring R] (f g : R →+* T) {r : R} (hr : f r = g r) :
41+
IsUnit (⟨r, hr⟩ : f.eqLocusS g) ↔ IsUnit r :=
42+
MonoidHom.isUnit_eqLocusM_mk_iff ..
43+
44+
theorem isUnit_eqLocus_mk_iff [Ring R] (f g : R →+* T) {r : R} (hr : f r = g r) :
45+
IsUnit (⟨r, hr⟩ : f.eqLocus g) ↔ IsUnit r :=
46+
MonoidHom.isUnit_eqLocusM_mk_iff ..
47+
48+
instance [Semiring R] (f g : R →+* T) : IsLocalHom (f.eqLocusS g).subtype where
49+
map_nonunit r := f.isUnit_eqLocusS_mk_iff g r.prop |>.2
50+
51+
instance [Ring R] (f g : R →+* T) : IsLocalHom (f.eqLocus g).subtype where
52+
map_nonunit r := f.isUnit_eqLocus_mk_iff g r.prop |>.2
53+
54+
end RingHom

0 commit comments

Comments
 (0)