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

Commit e63df39

Browse files
mckoenadamtopaz
andcommitted
feat(ring_theory/valuation/valuation_subring): define principal unit group of valuation subring and provide basic API (#14742)
This PR defines the principal unit group of a valuation subring as a subgroup of the units of the field. We show two valuation subrings are equal iff their principal unit groups are the same, and we show that the map on valuation subrings to their principal unit groups is an order embedding. Co-authored-by: Adam Topaz <github@adamtopaz.com>
1 parent e1f0116 commit e63df39

File tree

2 files changed

+170
-28
lines changed

2 files changed

+170
-28
lines changed

src/ring_theory/ideal/local_ring.lean

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,16 @@ begin
307307
f.is_unit_map f.is_unit_map
308308
end
309309

310+
/-- If `f : R →+* S` is a surjective local ring hom, then the induced units map is surjective. -/
311+
lemma surjective_units_map_of_local_ring_hom [comm_ring R] [comm_ring S]
312+
(f : R →+* S) (hf : function.surjective f) (h : is_local_ring_hom f) :
313+
function.surjective (units.map $ f.to_monoid_hom) :=
314+
begin
315+
intro a,
316+
obtain ⟨b,hb⟩ := hf (a : S),
317+
use (is_unit_of_map_unit f _ (by { rw hb, exact units.is_unit _})).unit, ext, exact hb,
318+
end
319+
310320
section
311321
variables (R) [comm_ring R] [local_ring R] [comm_ring S] [local_ring S]
312322

@@ -345,6 +355,16 @@ lemma ker_eq_maximal_ideal [field K] (φ : R →+* K) (hφ : function.surjective
345355
φ.ker = maximal_ideal R :=
346356
local_ring.eq_maximal_ideal $ (ring_hom.ker_is_maximal_of_surjective φ) hφ
347357

358+
lemma is_local_ring_hom_residue :
359+
is_local_ring_hom (local_ring.residue R) :=
360+
begin
361+
constructor,
362+
intros a ha,
363+
by_contra,
364+
erw ideal.quotient.eq_zero_iff_mem.mpr ((local_ring.mem_maximal_ideal _).mpr h) at ha,
365+
exact ha.ne_zero rfl,
366+
end
367+
348368
end
349369

350370
end local_ring

src/ring_theory/valuation/valuation_subring.lean

Lines changed: 150 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/-
22
Copyright (c) 2022 Adam Topaz. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Adam Topaz, Junyan Xu
4+
Authors: Adam Topaz, Junyan Xu, Jack McKoen
55
-/
66
import ring_theory.valuation.valuation_ring
77
import ring_theory.localization.as_subring
@@ -367,21 +367,7 @@ section unit_group
367367
def unit_group : subgroup Kˣ :=
368368
(A.valuation.to_monoid_with_zero_hom.to_monoid_hom.comp (units.coe_hom K)).ker
369369

370-
lemma mem_unit_group_iff (x : Kˣ) : x ∈ A.unit_group ↔ A.valuation x = 1 := iff.refl _
371-
372-
lemma unit_group_injective : function.injective (unit_group : valuation_subring K → subgroup _) :=
373-
λ A B h, begin
374-
rw [← A.valuation_subring_valuation, ← B.valuation_subring_valuation,
375-
← valuation.is_equiv_iff_valuation_subring, valuation.is_equiv_iff_val_eq_one],
376-
rw set_like.ext_iff at h,
377-
intros x,
378-
by_cases hx : x = 0, { simp only [hx, valuation.map_zero, zero_ne_one] },
379-
exact h (units.mk0 x hx)
380-
end
381-
382-
lemma eq_iff_unit_group {A B : valuation_subring K} :
383-
A = B ↔ A.unit_group = B.unit_group :=
384-
unit_group_injective.eq_iff.symm
370+
lemma mem_unit_group_iff (x : Kˣ) : x ∈ A.unit_group ↔ A.valuation x = 1 := iff.rfl
385371

386372
/-- For a valuation subring `A`, `A.unit_group` agrees with the units of `A`. -/
387373
def unit_group_mul_equiv : A.unit_group ≃* Aˣ :=
@@ -403,6 +389,7 @@ lemma coe_unit_group_mul_equiv_apply (a : A.unit_group) :
403389
lemma coe_unit_group_mul_equiv_symm_apply (a : Aˣ) :
404390
(A.unit_group_mul_equiv.symm a : K) = a := rfl
405391

392+
406393
lemma unit_group_le_unit_group {A B : valuation_subring K} :
407394
A.unit_group ≤ B.unit_group ↔ A ≤ B :=
408395
begin
@@ -424,6 +411,13 @@ begin
424411
simpa using hx }
425412
end
426413

414+
lemma unit_group_injective : function.injective (unit_group : valuation_subring K → subgroup _) :=
415+
λ A B h, by { simpa only [le_antisymm_iff, unit_group_le_unit_group] using h}
416+
417+
lemma eq_iff_unit_group {A B : valuation_subring K} :
418+
A = B ↔ A.unit_group = B.unit_group :=
419+
unit_group_injective.eq_iff.symm
420+
427421
/-- The map on valuation subrings to their unit groups is an order embedding. -/
428422
def unit_group_order_embedding : valuation_subring K ↪o subgroup Kˣ :=
429423
{ to_fun := λ A, A.unit_group,
@@ -442,18 +436,7 @@ def nonunits : subsemigroup K :=
442436
{ carrier := { x | A.valuation x < 1 },
443437
mul_mem' := λ a b ha hb, (mul_lt_mul₀ ha hb).trans_eq $ mul_one _ }
444438

445-
lemma mem_nonunits_iff {x : K} : x ∈ A.nonunits ↔ A.valuation x < 1 := iff.refl _
446-
447-
lemma nonunits_injective :
448-
function.injective (nonunits : valuation_subring K → subsemigroup _) :=
449-
λ A B h, begin
450-
rw [← A.valuation_subring_valuation, ← B.valuation_subring_valuation,
451-
← valuation.is_equiv_iff_valuation_subring, valuation.is_equiv_iff_val_lt_one],
452-
exact set_like.ext_iff.1 h,
453-
end
454-
455-
lemma nonunits_inj {A B : valuation_subring K} : A.nonunits = B.nonunits ↔ A = B :=
456-
nonunits_injective.eq_iff
439+
lemma mem_nonunits_iff {x : K} : x ∈ A.nonunits ↔ A.valuation x < 1 := iff.rfl
457440

458441
lemma nonunits_le_nonunits {A B : valuation_subring K} :
459442
B.nonunits ≤ A.nonunits ↔ A ≤ B :=
@@ -467,6 +450,13 @@ begin
467450
by_contra h_1, from not_lt.2 (monotone_map_of_le _ _ h (not_lt.1 h_1)) hx }
468451
end
469452

453+
lemma nonunits_injective :
454+
function.injective (nonunits : valuation_subring K → subsemigroup _) :=
455+
λ A B h, by { simpa only [le_antisymm_iff, nonunits_le_nonunits] using h.symm }
456+
457+
lemma nonunits_inj {A B : valuation_subring K} : A.nonunits = B.nonunits ↔ A = B :=
458+
nonunits_injective.eq_iff
459+
470460
/-- The map on valuation subrings to their nonunits is a dual order embedding. -/
471461
def nonunits_order_embedding :
472462
valuation_subring K ↪o (subsemigroup K)ᵒᵈ :=
@@ -510,4 +500,136 @@ end
510500

511501
end nonunits
512502

503+
section principal_unit_group
504+
505+
/-- The principal unit group of a valuation subring, as a subgroup of `Kˣ`. -/
506+
def principal_unit_group : subgroup Kˣ :=
507+
{ carrier := { x | A.valuation (x - 1) < 1 },
508+
mul_mem' := begin
509+
intros a b ha hb,
510+
refine lt_of_le_of_lt _ (max_lt hb ha),
511+
rw [← one_mul (A.valuation (b - 1)), ← A.valuation.map_one_add_of_lt ha, add_sub_cancel'_right,
512+
← valuation.map_mul, mul_sub_one, ← sub_add_sub_cancel],
513+
exact A.valuation.map_add _ _,
514+
end,
515+
one_mem' := by simpa using zero_lt_one₀,
516+
inv_mem' := begin
517+
dsimp,
518+
intros a ha,
519+
conv {to_lhs, rw [← mul_one (A.valuation _), ← A.valuation.map_one_add_of_lt ha]},
520+
rwa [add_sub_cancel'_right, ← valuation.map_mul, sub_mul, units.inv_mul, ← neg_sub, one_mul,
521+
valuation.map_neg],
522+
end }
523+
524+
lemma principal_units_le_units : A.principal_unit_group ≤ A.unit_group :=
525+
λ a h, by simpa only [add_sub_cancel'_right] using A.valuation.map_one_add_of_lt h
526+
527+
lemma mem_principal_unit_group_iff (x : Kˣ) :
528+
x ∈ A.principal_unit_group ↔ A.valuation ((x : K) - 1) < 1 := iff.rfl
529+
530+
lemma principal_unit_group_le_principal_unit_group {A B : valuation_subring K} :
531+
B.principal_unit_group ≤ A.principal_unit_group ↔ A ≤ B :=
532+
begin
533+
split,
534+
{ intros h x hx,
535+
by_cases h_1 : x = 0, { simp only [h_1, zero_mem] },
536+
by_cases h_2 : x⁻¹ + 1 = 0,
537+
{ rw [add_eq_zero_iff_eq_neg, inv_eq_iff_inv_eq, inv_neg, inv_one] at h_2,
538+
simpa only [h_2] using B.neg_mem _ B.one_mem },
539+
{ rw [← valuation_le_one_iff, ← not_lt, valuation.one_lt_val_iff _ h_1, ← add_sub_cancel x⁻¹,
540+
← units.coe_mk0 h_2, ← mem_principal_unit_group_iff] at hx ⊢,
541+
simpa only [hx] using @h (units.mk0 (x⁻¹ + 1) h_2) } },
542+
{ intros h x hx,
543+
by_contra h_1, from not_lt.2 (monotone_map_of_le _ _ h (not_lt.1 h_1)) hx }
544+
end
545+
546+
lemma principal_unit_group_injective :
547+
function.injective (principal_unit_group : valuation_subring K → subgroup _) :=
548+
λ A B h, by { simpa [le_antisymm_iff, principal_unit_group_le_principal_unit_group] using h.symm }
549+
550+
lemma eq_iff_principal_unit_group {A B : valuation_subring K} :
551+
A = B ↔ A.principal_unit_group = B.principal_unit_group :=
552+
principal_unit_group_injective.eq_iff.symm
553+
554+
/-- The map on valuation subrings to their principal unit groups is an order embedding. -/
555+
def principal_unit_group_order_embedding :
556+
valuation_subring K ↪o (subgroup Kˣ)ᵒᵈ :=
557+
{ to_fun := λ A, A.principal_unit_group,
558+
inj' := principal_unit_group_injective,
559+
map_rel_iff' := λ A B, principal_unit_group_le_principal_unit_group }
560+
561+
lemma coe_mem_principal_unit_group_iff {x : A.unit_group} :
562+
(x : Kˣ) ∈ A.principal_unit_group ↔
563+
A.unit_group_mul_equiv x ∈ (units.map (local_ring.residue A).to_monoid_hom).ker :=
564+
begin
565+
rw [monoid_hom.mem_ker, units.ext_iff],
566+
dsimp,
567+
let π := ideal.quotient.mk (local_ring.maximal_ideal A), change _ ↔ π _ = _,
568+
rw [← π.map_one, ← sub_eq_zero, ← π.map_sub, ideal.quotient.eq_zero_iff_mem,
569+
valuation_lt_one_iff],
570+
simpa,
571+
end
572+
573+
/-- The principal unit group agrees with the kernel of the canonical map from
574+
the units of `A` to the units of the residue field of `A`. -/
575+
def principal_unit_group_equiv :
576+
A.principal_unit_group ≃* (units.map (local_ring.residue A).to_monoid_hom).ker :=
577+
{ to_fun := λ x, ⟨A.unit_group_mul_equiv ⟨_, A.principal_units_le_units x.2⟩,
578+
A.coe_mem_principal_unit_group_iff.1 x.2⟩,
579+
inv_fun := λ x, ⟨A.unit_group_mul_equiv.symm x,
580+
by { rw A.coe_mem_principal_unit_group_iff, simpa using set_like.coe_mem x }⟩,
581+
left_inv := λ x, by simp,
582+
right_inv := λ x, by simp,
583+
map_mul' := λ x y, by refl, }
584+
585+
@[simp]
586+
lemma principal_unit_group_equiv_apply (a : A.principal_unit_group) :
587+
(principal_unit_group_equiv A a : K) = a := rfl
588+
589+
@[simp]
590+
lemma principal_unit_group_symm_apply
591+
(a : (units.map (local_ring.residue A).to_monoid_hom).ker) :
592+
(A.principal_unit_group_equiv.symm a : K) = a := rfl
593+
594+
/-- The canonical map from the unit group of `A` to the units of the residue field of `A`. -/
595+
def unit_group_to_residue_field_units :
596+
A.unit_group →* (local_ring.residue_field A)ˣ :=
597+
monoid_hom.comp (units.map $ (ideal.quotient.mk _).to_monoid_hom)
598+
A.unit_group_mul_equiv.to_monoid_hom
599+
600+
@[simp]
601+
lemma coe_unit_group_to_residue_field_units_apply (x : A.unit_group) :
602+
(A.unit_group_to_residue_field_units x : (local_ring.residue_field A) ) =
603+
(ideal.quotient.mk _ (A.unit_group_mul_equiv x : A)) := rfl
604+
605+
lemma ker_unit_group_to_residue_field_units :
606+
A.unit_group_to_residue_field_units.ker = A.principal_unit_group.comap A.unit_group.subtype :=
607+
by { ext, simpa only [subgroup.mem_comap, subgroup.coe_subtype, coe_mem_principal_unit_group_iff] }
608+
609+
lemma surjective_unit_group_to_residue_field_units :
610+
function.surjective A.unit_group_to_residue_field_units :=
611+
(local_ring.surjective_units_map_of_local_ring_hom _
612+
ideal.quotient.mk_surjective local_ring.is_local_ring_hom_residue).comp (mul_equiv.surjective _)
613+
614+
/-- The quotient of the unit group of `A` by the principal unit group of `A` agrees with
615+
the units of the residue field of `A`. -/
616+
def units_mod_principal_units_equiv_residue_field_units :
617+
(A.unit_group ⧸ (A.principal_unit_group.comap A.unit_group.subtype)) ≃*
618+
(local_ring.residue_field A)ˣ :=
619+
mul_equiv.trans (quotient_group.equiv_quotient_of_eq A.ker_unit_group_to_residue_field_units.symm)
620+
(quotient_group.quotient_ker_equiv_of_surjective _ A.surjective_unit_group_to_residue_field_units)
621+
622+
@[simp]
623+
lemma units_mod_principal_units_equiv_residue_field_units_comp_quotient_group_mk :
624+
A.units_mod_principal_units_equiv_residue_field_units.to_monoid_hom.comp
625+
(quotient_group.mk' _) = A.unit_group_to_residue_field_units := rfl
626+
627+
@[simp]
628+
lemma units_mod_principal_units_equiv_residue_field_units_comp_quotient_group_mk_apply
629+
(x : A.unit_group) :
630+
A.units_mod_principal_units_equiv_residue_field_units.to_monoid_hom
631+
(quotient_group.mk x) = A.unit_group_to_residue_field_units x := rfl
632+
633+
end principal_unit_group
634+
513635
end valuation_subring

0 commit comments

Comments
 (0)