|
| 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