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

Commit 8bc2354

Browse files
mckoenVierkantor
andcommitted
feat(ring_theory/valuation/valuation_subring): define maximal ideal of valuation subring and provide basic API (#14656)
This PR defines the unique maximal ideal of a valuation subring as a subsemigroup of the field. We prove a few equivalent conditions for two valuations to be equivalent, and we use this to show two valuation subrings are equivalent iff they have the same maximal ideal. Co-authored-by: Vierkantor <vierkantor@vierkantor.com> Co-authored-by: jackmckoen <104791831+jackmckoen@users.noreply.github.com>
1 parent 70887f8 commit 8bc2354

File tree

2 files changed

+166
-34
lines changed

2 files changed

+166
-34
lines changed

src/ring_theory/valuation/basic.lean

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ noncomputable theory
6767

6868
open function ideal
6969

70-
variables {F R : Type*} -- This will be a ring, assumed commutative in some sections
70+
variables {K F R : Type*} [division_ring K]
7171

7272
section
7373
variables (F R) (Γ₀ : Type*) [linear_ordered_comm_monoid_with_zero Γ₀] [ring R]
@@ -170,12 +170,12 @@ lemma ext_iff {v₁ v₂ : valuation R Γ₀} : v₁ = v₂ ↔ ∀ r, v₁ r =
170170
def to_preorder : preorder R := preorder.lift v
171171

172172
/-- If `v` is a valuation on a division ring then `v(x) = 0` iff `x = 0`. -/
173-
@[simp] lemma zero_iff [nontrivial Γ₀] {K : Type*} [division_ring K]
174-
(v : valuation K Γ₀) {x : K} : v x = 0 ↔ x = 0 :=
173+
@[simp] lemma zero_iff [nontrivial Γ₀] (v : valuation K Γ₀) {x : K} :
174+
v x = 0 ↔ x = 0 :=
175175
v.to_monoid_with_zero_hom.map_eq_zero
176176

177-
lemma ne_zero_iff [nontrivial Γ₀] {K : Type*} [division_ring K]
178-
(v : valuation K Γ₀) {x : K} : v x ≠ 0 ↔ x ≠ 0 :=
177+
lemma ne_zero_iff [nontrivial Γ₀] (v : valuation K Γ₀) {x : K} :
178+
v x ≠ 0 ↔ x ≠ 0 :=
179179
v.to_monoid_with_zero_hom.map_ne_zero
180180

181181
theorem unit_map_eq (u : Rˣ) :
@@ -217,11 +217,11 @@ end monoid
217217
section group
218218
variables [linear_ordered_comm_group_with_zero Γ₀] {R} {Γ₀} (v : valuation R Γ₀) {x y z : R}
219219

220-
@[simp] lemma map_inv {K : Type*} [division_ring K]
221-
(v : valuation K Γ₀) {x : K} : v x⁻¹ = (v x)⁻¹ :=
220+
@[simp] lemma map_inv (v : valuation K Γ₀) {x : K} :
221+
v x⁻¹ = (v x)⁻¹ :=
222222
v.to_monoid_with_zero_hom.map_inv x
223223

224-
@[simp] lemma map_zpow {K : Type*} [division_ring K] (v : valuation K Γ₀) {x : K} {n : ℤ} :
224+
@[simp] lemma map_zpow (v : valuation K Γ₀) {x : K} {n : ℤ} :
225225
v (x^n) = (v x)^n :=
226226
v.to_monoid_with_zero_hom.map_zpow x n
227227

@@ -293,6 +293,10 @@ begin
293293
simpa only [v.map_one, v.map_neg] using v.map_add_eq_of_lt_left h
294294
end
295295

296+
lemma one_lt_val_iff (v : valuation K Γ₀) {x : K} (h : x ≠ 0) :
297+
1 < v x ↔ v x⁻¹ < 1 :=
298+
by simpa using (inv_lt_inv₀ (v.ne_zero_iff.2 h) one_ne_zero).symm
299+
296300
/-- The subgroup of elements whose valuation is less than a certain unit.-/
297301
def lt_add_subgroup (v : valuation R Γ₀) (γ : Γ₀ˣ) : add_subgroup R :=
298302
{ carrier := {x | v x < γ},
@@ -358,7 +362,6 @@ lemma is_equiv_of_map_strict_mono [linear_ordered_comm_monoid_with_zero Γ₀]
358362

359363
lemma is_equiv_of_val_le_one [linear_ordered_comm_group_with_zero Γ₀]
360364
[linear_ordered_comm_group_with_zero Γ'₀]
361-
{K : Type*} [division_ring K]
362365
(v : valuation K Γ₀) (v' : valuation K Γ'₀) (h : ∀ {x:K}, v x ≤ 1 ↔ v' x ≤ 1) :
363366
v.is_equiv v' :=
364367
begin
@@ -382,15 +385,13 @@ end
382385
lemma is_equiv_iff_val_le_one
383386
[linear_ordered_comm_group_with_zero Γ₀]
384387
[linear_ordered_comm_group_with_zero Γ'₀]
385-
{K : Type*} [division_ring K]
386388
(v : valuation K Γ₀) (v' : valuation K Γ'₀) :
387389
v.is_equiv v' ↔ ∀ {x : K}, v x ≤ 1 ↔ v' x ≤ 1 :=
388390
⟨λ h x, by simpa using h x 1, is_equiv_of_val_le_one _ _⟩
389391

390392
lemma is_equiv_iff_val_eq_one
391393
[linear_ordered_comm_group_with_zero Γ₀]
392394
[linear_ordered_comm_group_with_zero Γ'₀]
393-
{K : Type*} [division_ring K]
394395
(v : valuation K Γ₀) (v' : valuation K Γ'₀) :
395396
v.is_equiv v' ↔ ∀ {x : K}, v x = 1 ↔ v' x = 1 :=
396397
begin
@@ -419,6 +420,61 @@ begin
419420
{ rw ← h at hx', exact le_of_eq hx' } } }
420421
end
421422

423+
lemma is_equiv_iff_val_lt_one
424+
[linear_ordered_comm_group_with_zero Γ₀]
425+
[linear_ordered_comm_group_with_zero Γ'₀]
426+
(v : valuation K Γ₀) (v' : valuation K Γ'₀) :
427+
v.is_equiv v' ↔ ∀ {x : K}, v x < 1 ↔ v' x < 1 :=
428+
begin
429+
split,
430+
{ intros h x,
431+
simp only [lt_iff_le_and_ne, and_congr ((is_equiv_iff_val_le_one _ _).1 h)
432+
((is_equiv_iff_val_eq_one _ _).1 h).not] },
433+
{ rw is_equiv_iff_val_eq_one,
434+
intros h x,
435+
by_cases hx : x = 0, { simp only [(zero_iff _).2 hx, zero_ne_one] },
436+
split,
437+
{ intro hh,
438+
by_contra h_1,
439+
cases ne_iff_lt_or_gt.1 h_1,
440+
{ simpa [hh, lt_self_iff_false] using h.2 h_2 },
441+
{ rw [← inv_one, eq_inv_iff_eq_inv, ← map_inv] at hh,
442+
exact hh.le.not_lt (h.2 ((one_lt_val_iff v' hx).1 h_2)) } },
443+
{ intro hh,
444+
by_contra h_1,
445+
cases ne_iff_lt_or_gt.1 h_1,
446+
{ simpa [hh, lt_self_iff_false] using h.1 h_2 },
447+
{ rw [← inv_one, eq_inv_iff_eq_inv, ← map_inv] at hh,
448+
exact hh.le.not_lt (h.1 ((one_lt_val_iff v hx).1 h_2)) } } }
449+
end
450+
451+
lemma is_equiv_iff_val_sub_one_lt_one
452+
[linear_ordered_comm_group_with_zero Γ₀]
453+
[linear_ordered_comm_group_with_zero Γ'₀]
454+
(v : valuation K Γ₀) (v' : valuation K Γ'₀) :
455+
v.is_equiv v' ↔ ∀ {x : K}, v (x - 1) < 1 ↔ v' (x - 1) < 1 :=
456+
begin
457+
rw is_equiv_iff_val_lt_one,
458+
exact (equiv.sub_right 1).surjective.forall
459+
end
460+
461+
lemma is_equiv_tfae
462+
[linear_ordered_comm_group_with_zero Γ₀]
463+
[linear_ordered_comm_group_with_zero Γ'₀]
464+
(v : valuation K Γ₀) (v' : valuation K Γ'₀) :
465+
[v.is_equiv v',
466+
∀ {x}, v x ≤ 1 ↔ v' x ≤ 1,
467+
∀ {x}, v x = 1 ↔ v' x = 1,
468+
∀ {x}, v x < 1 ↔ v' x < 1,
469+
∀ {x}, v (x-1) < 1 ↔ v' (x-1) < 1].tfae :=
470+
begin
471+
tfae_have : 12, { apply is_equiv_iff_val_le_one },
472+
tfae_have : 13, { apply is_equiv_iff_val_eq_one },
473+
tfae_have : 14, { apply is_equiv_iff_val_lt_one },
474+
tfae_have : 15, { apply is_equiv_iff_val_sub_one_lt_one },
475+
tfae_finish
476+
end
477+
422478
end
423479

424480
section supp
@@ -605,12 +661,13 @@ valuation.ext_iff
605661
def to_preorder : preorder R := preorder.lift v
606662

607663
/-- If `v` is an additive valuation on a division ring then `v(x) = ⊤` iff `x = 0`. -/
608-
@[simp] lemma top_iff [nontrivial Γ₀] {K : Type*} [division_ring K]
609-
(v : add_valuation K Γ₀) {x : K} : v x = ⊤ ↔ x = 0 :=
664+
@[simp] lemma top_iff [nontrivial Γ₀] (v : add_valuation K Γ₀) {x : K} :
665+
v x = ⊤ ↔ x = 0 :=
610666
v.zero_iff
611667

612-
lemma ne_top_iff [nontrivial Γ₀] {K : Type*} [division_ring K]
613-
(v : add_valuation K Γ₀) {x : K} : v x ≠ ⊤ ↔ x ≠ 0 := v.ne_zero_iff
668+
lemma ne_top_iff [nontrivial Γ₀] (v : add_valuation K Γ₀) {x : K} :
669+
v x ≠ ⊤ ↔ x ≠ 0 :=
670+
v.ne_zero_iff
614671

615672
/-- A ring homomorphism `S → R` induces a map `add_valuation R Γ₀ → add_valuation S Γ₀`. -/
616673
def comap {S : Type*} [ring S] (f : S →+* R) (v : add_valuation R Γ₀) :
@@ -644,8 +701,8 @@ end monoid
644701
section group
645702
variables [linear_ordered_add_comm_group_with_top Γ₀] [ring R] (v : add_valuation R Γ₀) {x y z : R}
646703

647-
@[simp] lemma map_inv {K : Type*} [division_ring K]
648-
(v : add_valuation K Γ₀) {x : K} : v x⁻¹ = - (v x) :=
704+
@[simp] lemma map_inv (v : add_valuation K Γ₀) {x : K} :
705+
v x⁻¹ = - (v x) :=
649706
v.map_inv
650707

651708
lemma map_units_inv (x : Rˣ) : v (x⁻¹ : Rˣ) = - (v x) :=

src/ring_theory/valuation/valuation_subring.lean

Lines changed: 92 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ instance : valuation_ring A :=
7272
by_cases (b : K) = 0, { use 0, left, ext, simp [h] },
7373
by_cases (a : K) = 0, { use 0, right, ext, simp [h] },
7474
cases A.mem_or_inv_mem (a/b) with hh hh,
75-
{ use ⟨a/b,hh⟩, right, ext, field_simp, ring },
75+
{ use ⟨a/b, hh⟩, right, ext, field_simp, ring },
7676
{ rw (show (a/b : K)⁻¹ = b/a, by field_simp) at hh,
77-
use ⟨b/a,hh⟩, left, ext, field_simp, ring },
77+
use ⟨b/a, hh⟩, left, ext, field_simp, ring },
7878
end }
7979

8080
instance : algebra A K :=
@@ -84,16 +84,16 @@ show algebra A.to_subring K, by apply_instance
8484
lemma algebra_map_apply (a : A) : algebra_map A K a = a := rfl
8585

8686
instance : is_fraction_ring A K :=
87-
{ map_units := λ ⟨y,hy⟩,
87+
{ map_units := λ ⟨y, hy⟩,
8888
(units.mk0 (y : K) (λ c, non_zero_divisors.ne_zero hy $ subtype.ext c)).is_unit,
8989
surj := λ z, begin
90-
by_cases z = 0, { use (0,1), simp [h] },
90+
by_cases z = 0, { use (0, 1), simp [h] },
9191
cases A.mem_or_inv_mem z with hh hh,
92-
{ use (⟨z,hh⟩,1), simp },
93-
{ refine ⟨⟨1,⟨⟨_,hh⟩,_⟩⟩, mul_inv_cancel h⟩,
92+
{ use (⟨z, hh⟩, 1), simp },
93+
{ refine ⟨⟨1, ⟨⟨_, hh⟩, _⟩⟩, mul_inv_cancel h⟩,
9494
exact mem_non_zero_divisors_iff_ne_zero.2 (λ c, h (inv_eq_zero.mp (congr_arg coe c))) },
9595
end,
96-
eq_iff_exists := λ a b, ⟨ λ h, ⟨1, by { ext, simpa using h }⟩, λ ⟨c,h⟩,
96+
eq_iff_exists := λ a b, ⟨ λ h, ⟨1, by { ext, simpa using h }⟩, λ ⟨c, h⟩,
9797
congr_arg coe ((mul_eq_mul_right_iff.1 h).resolve_right (non_zero_divisors.ne_zero c.2)) ⟩ }
9898

9999
/-- The value group of the valuation associated to `A`. -/
@@ -106,13 +106,13 @@ def valuation : valuation K A.value_group := valuation_ring.valuation A K
106106
instance inhabited_value_group : inhabited A.value_group := ⟨A.valuation 0
107107

108108
lemma valuation_le_one (a : A) : A.valuation a ≤ 1 :=
109-
(valuation_ring.mem_integer_iff A K _).2 ⟨a,rfl⟩
109+
(valuation_ring.mem_integer_iff A K _).2 ⟨a, rfl⟩
110110

111111
lemma mem_of_valuation_le_one (x : K) (h : A.valuation x ≤ 1) : x ∈ A :=
112-
let ⟨a,ha⟩ := (valuation_ring.mem_integer_iff A K x).1 h in ha ▸ a.2
112+
let ⟨a, ha⟩ := (valuation_ring.mem_integer_iff A K x).1 h in ha ▸ a.2
113113

114114
lemma valuation_le_one_iff (x : K) : A.valuation x ≤ 1 ↔ x ∈ A :=
115-
⟨mem_of_valuation_le_one _ _, λ ha, A.valuation_le_one ⟨x,ha⟩⟩
115+
⟨mem_of_valuation_le_one _ _, λ ha, A.valuation_le_one ⟨x, ha⟩⟩
116116

117117
lemma valuation_eq_iff (x y : K) : A.valuation x = A.valuation y ↔
118118
∃ a : Aˣ, (a : K) * y = x := quotient.eq'
@@ -179,15 +179,15 @@ subring.subtype R.to_subring
179179
/-- The canonical map on value groups induced by a coarsening of valuation rings. -/
180180
def map_of_le (R S : valuation_subring K) (h : R ≤ S) :
181181
R.value_group →*₀ S.value_group :=
182-
{ to_fun := quotient.map' id $ λ x y ⟨u,hu⟩, ⟨units.map (R.inclusion S h).to_monoid_hom u, hu⟩,
182+
{ to_fun := quotient.map' id $ λ x y ⟨u, hu⟩, ⟨units.map (R.inclusion S h).to_monoid_hom u, hu⟩,
183183
map_zero' := rfl,
184184
map_one' := rfl,
185185
map_mul' := by { rintro ⟨⟩ ⟨⟩, refl } }
186186

187187
@[mono]
188188
lemma monotone_map_of_le (R S : valuation_subring K) (h : R ≤ S) :
189189
monotone (R.map_of_le S h) :=
190-
by { rintros ⟨⟩ ⟨⟩ ⟨a,ha⟩, exact ⟨R.inclusion S h a, ha⟩ }
190+
by { rintros ⟨⟩ ⟨⟩ ⟨a, ha⟩, exact ⟨R.inclusion S h a, ha⟩ }
191191

192192
@[simp]
193193
lemma map_of_le_comp_valuation (R S : valuation_subring K) (h : R ≤ S) :
@@ -209,7 +209,7 @@ def of_prime (A : valuation_subring K) (P : ideal A) [P.is_prime] :
209209
valuation_subring K :=
210210
of_le A (localization.subalgebra.of_field K P.prime_compl $
211211
le_non_zero_divisors_of_no_zero_divisors $ not_not_intro P.zero_mem).to_subring $
212-
λ a ha, subalgebra.algebra_map_mem _ (⟨a,ha⟩ : A)
212+
λ a ha, subalgebra.algebra_map_mem _ (⟨a, ha⟩ : A)
213213

214214
instance of_prime_algebra (A : valuation_subring K) (P : ideal A) [P.is_prime] :
215215
algebra A (A.of_prime P) := subalgebra.algebra _
@@ -223,7 +223,7 @@ by apply localization.subalgebra.is_localization_of_field K
223223

224224
lemma le_of_prime (A : valuation_subring K) (P : ideal A) [P.is_prime] :
225225
A ≤ of_prime A P :=
226-
λ a ha, subalgebra.algebra_map_mem _ (⟨a,ha⟩ : A)
226+
λ a ha, subalgebra.algebra_map_mem _ (⟨a, ha⟩ : A)
227227

228228
lemma of_prime_valuation_eq_one_iff_mem_prime_compl
229229
(A : valuation_subring K)
@@ -243,7 +243,7 @@ lemma of_prime_ideal_of_le (R S : valuation_subring K) (h : R ≤ S) :
243243
of_prime R (ideal_of_le R S h) = S :=
244244
begin
245245
ext x, split,
246-
{ rintro ⟨a,r,hr,rfl⟩, apply mul_mem, { exact h a.2 },
246+
{ rintro ⟨a, r, hr, rfl⟩, apply mul_mem, { exact h a.2 },
247247
{ rw [← valuation_le_one_iff, valuation.map_inv, ← inv_one, inv_le_inv₀],
248248
{ exact not_lt.1 ((not_iff_not.2 $ valuation_lt_one_iff S _).1 hr) },
249249
{ intro hh, erw [valuation.zero_iff, subring.coe_eq_zero_iff] at hh,
@@ -255,7 +255,7 @@ begin
255255
{ use [1, x⁻¹, hr], split,
256256
{ change (⟨x⁻¹, h hr⟩ : S) ∉ nonunits S,
257257
erw [mem_nonunits_iff, not_not],
258-
apply is_unit_of_mul_eq_one _ (⟨x,hx⟩ : S),
258+
apply is_unit_of_mul_eq_one _ (⟨x, hx⟩ : S),
259259
ext, field_simp },
260260
{ field_simp } } },
261261
end
@@ -407,7 +407,7 @@ lemma unit_group_le_unit_group {A B : valuation_subring K} :
407407
A.unit_group ≤ B.unit_group ↔ A ≤ B :=
408408
begin
409409
split,
410-
{ rintros h x hx,
410+
{ intros h x hx,
411411
rw [← A.valuation_le_one_iff x, le_iff_lt_or_eq] at hx,
412412
by_cases h_1 : x = 0, { simp only [h_1, zero_mem] },
413413
by_cases h_2 : 1 + x = 0,
@@ -435,4 +435,79 @@ unit_group_order_embedding.strict_mono
435435

436436
end unit_group
437437

438+
section nonunits
439+
440+
/-- The nonunits of a valuation subring of `K`, as a subsemigroup of `K`-/
441+
def nonunits : subsemigroup K :=
442+
{ carrier := { x | A.valuation x < 1 },
443+
mul_mem' := λ a b ha hb, (mul_lt_mul₀ ha hb).trans_eq $ mul_one _ }
444+
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
457+
458+
lemma nonunits_le_nonunits {A B : valuation_subring K} :
459+
B.nonunits ≤ A.nonunits ↔ A ≤ B :=
460+
begin
461+
split,
462+
{ intros h x hx,
463+
by_cases h_1 : x = 0, { simp only [h_1, zero_mem] },
464+
rw [← valuation_le_one_iff, ← not_lt, valuation.one_lt_val_iff _ h_1] at hx ⊢,
465+
by_contra h_2, from hx (h h_2) },
466+
{ intros h x hx,
467+
by_contra h_1, from not_lt.2 (monotone_map_of_le _ _ h (not_lt.1 h_1)) hx }
468+
end
469+
470+
/-- The map on valuation subrings to their nonunits is a dual order embedding. -/
471+
def nonunits_order_embedding :
472+
valuation_subring K ↪o (subsemigroup K)ᵒᵈ :=
473+
{ to_fun := λ A, A.nonunits,
474+
inj' := nonunits_injective,
475+
map_rel_iff' := λ A B, nonunits_le_nonunits }
476+
477+
variables {A}
478+
479+
/-- The elements of `A.nonunits` are those of the maximal ideal of `A` after coercion to `K`.
480+
481+
See also `mem_nonunits_iff_exists_mem_maximal_ideal`, which gets rid of the coercion to `K`,
482+
at the expense of a more complicated right hand side.
483+
-/
484+
theorem coe_mem_nonunits_iff {a : A} : (a : K) ∈ A.nonunits ↔ a ∈ local_ring.maximal_ideal A :=
485+
(valuation_lt_one_iff _ _).symm
486+
487+
lemma nonunits_le : A.nonunits ≤ A.to_subring.to_submonoid.to_subsemigroup :=
488+
λ a ha, (A.valuation_le_one_iff _).mp (A.mem_nonunits_iff.mp ha).le
489+
490+
lemma nonunits_subset : (A.nonunits : set K) ⊆ A := nonunits_le
491+
492+
/-- The elements of `A.nonunits` are those of the maximal ideal of `A`.
493+
494+
See also `coe_mem_nonunits_iff`, which has a simpler right hand side but requires the element
495+
to be in `A` already.
496+
-/
497+
theorem mem_nonunits_iff_exists_mem_maximal_ideal {a : K} :
498+
a ∈ A.nonunits ↔ ∃ ha, (⟨a, ha⟩ : A) ∈ local_ring.maximal_ideal A :=
499+
⟨λ h, ⟨nonunits_subset h, coe_mem_nonunits_iff.mp h⟩,
500+
λ ⟨ha, h⟩, coe_mem_nonunits_iff.mpr h⟩
501+
502+
/-- `A.nonunits` agrees with the maximal ideal of `A`, after taking its image in `K`. -/
503+
theorem image_maximal_ideal : (coe : A → K) '' local_ring.maximal_ideal A = A.nonunits :=
504+
begin
505+
ext a,
506+
simp only [set.mem_image, set_like.mem_coe, mem_nonunits_iff_exists_mem_maximal_ideal],
507+
erw subtype.exists,
508+
simp_rw [subtype.coe_mk, exists_and_distrib_right, exists_eq_right],
509+
end
510+
511+
end nonunits
512+
438513
end valuation_subring

0 commit comments

Comments
 (0)