Skip to content

Commit 77ee539

Browse files
committed
feat(Valuation/DiscreteValuationRel): val relations with compatible valuations to Zm0 are IsDiscrete (#27213)
Co-authored-by: Yakov Pechersky <pechersky@users.noreply.github.com>
1 parent 0e01277 commit 77ee539

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5737,6 +5737,7 @@ import Mathlib.RingTheory.Valuation.AlgebraInstances
57375737
import Mathlib.RingTheory.Valuation.Archimedean
57385738
import Mathlib.RingTheory.Valuation.Basic
57395739
import Mathlib.RingTheory.Valuation.Discrete.Basic
5740+
import Mathlib.RingTheory.Valuation.DiscreteValuativeRel
57405741
import Mathlib.RingTheory.Valuation.ExtendToLocalization
57415742
import Mathlib.RingTheory.Valuation.Extension
57425743
import Mathlib.RingTheory.Valuation.Integers
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/-
2+
Copyright (c) 2025 Yakov Pechersky. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yakov Pechersky
5+
-/
6+
7+
import Mathlib.Algebra.GroupWithZero.Range
8+
import Mathlib.GroupTheory.ArchimedeanDensely
9+
import Mathlib.RingTheory.Valuation.RankOne
10+
11+
/-!
12+
13+
# Discrete Valuative Relations
14+
15+
Discrete valuative relations have a maximal element less than one in the value group.
16+
17+
In the rank-one case, this is equivalent to the value group being isomorphic to `ℤᵐ⁰`.
18+
19+
-/
20+
21+
namespace ValuativeRel
22+
23+
variable {R : Type*} [CommRing R] [ValuativeRel R]
24+
25+
open WithZero
26+
27+
lemma nonempty_orderIso_withZeroMul_int_iff :
28+
Nonempty (ValueGroupWithZero R ≃*o ℤᵐ⁰) ↔
29+
IsDiscrete R ∧ IsNontrivial R ∧ MulArchimedean (ValueGroupWithZero R) := by
30+
constructor
31+
· rintro ⟨e⟩
32+
let x := e.symm (exp (-1))
33+
have hx0 : x ≠ 0 := by simp [x]
34+
have hx1 : x < 1 := by simp [- exp_neg, x, ← lt_map_inv_iff, ← exp_zero]
35+
refine ⟨⟨x, hx1, fun y hy ↦ ?_⟩, ⟨x, hx0, hx1.ne⟩, .comap e.toMonoidHom e.strictMono⟩
36+
rcases eq_or_ne y 0 with rfl | hy0
37+
· simp
38+
· rw [← map_one e.symm, ← map_inv_lt_iff, ← log_lt_log (by simp [hy0]) (by simp)] at hy
39+
rw [← map_inv_le_iff, ← log_le_log (by simp [hy0]) (by simp)]
40+
simp only [OrderMonoidIso.equivLike_inv_eq_symm, OrderMonoidIso.symm_symm, log_one,
41+
log_exp] at hy ⊢
42+
linarith
43+
· rintro ⟨hD, hN, hM⟩
44+
rw [isNontrivial_iff_nontrivial_units] at hN
45+
rw [LinearOrderedCommGroupWithZero.discrete_iff_not_denselyOrdered]
46+
intro H
47+
obtain ⟨x, hx, hx'⟩ := hD.has_maximal_element
48+
obtain ⟨y, hy, hy'⟩ := exists_between hx
49+
exact hy.not_ge (hx' y hy')
50+
51+
lemma IsDiscrete.of_compatible_withZeroMulInt (v : Valuation R ℤᵐ⁰) [v.Compatible] :
52+
IsDiscrete R := by
53+
have : IsRankLeOne R := .of_compatible_mulArchimedean v
54+
by_cases h : IsNontrivial R
55+
· by_cases H : DenselyOrdered (ValueGroupWithZero R)
56+
· exfalso
57+
refine (MonoidWithZeroHom.range_nontrivial (ValueGroupWithZero.embed v)).not_subsingleton ?_
58+
rw [← WithZero.denselyOrdered_set_iff_subsingleton]
59+
exact (ValueGroupWithZero.embed_strictMono v).denselyOrdered_range
60+
· rw [isNontrivial_iff_nontrivial_units] at h
61+
rw [← LinearOrderedCommGroupWithZero.discrete_iff_not_denselyOrdered] at H
62+
rw [nonempty_orderIso_withZeroMul_int_iff] at H
63+
exact H.left
64+
· rw [isNontrivial_iff_nontrivial_units, not_nontrivial_iff_subsingleton] at h
65+
refine ⟨⟨0, zero_lt_one, fun y hy ↦ ?_⟩⟩
66+
contrapose! hy
67+
have : 1 = Units.mk0 y hy.ne' := Subsingleton.elim _ _
68+
exact Units.val_le_val.mpr this.le
69+
70+
end ValuativeRel

0 commit comments

Comments
 (0)