Skip to content

Commit 15818cd

Browse files
committed
WIP; done up to IsRankOneDiscrete.mk'
1 parent a05a084 commit 15818cd

1 file changed

Lines changed: 55 additions & 47 deletions

File tree

  • LocalClassFieldTheory/DiscreteValuationRing

LocalClassFieldTheory/DiscreteValuationRing/Basic.lean

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,17 @@ Copyright (c) 2024 María Inés de Frutos-Fernández, Filippo A. E. Nuccio. All
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: María Inés de Frutos-Fernández, Filippo A. E. Nuccio
55
-/
6-
import LocalClassFieldTheory.ForMathlib.WithZero
7-
import Mathlib.Algebra.Order.Group.Cyclic
6+
--import Mathlib.Algebra.Order.Group.Cyclic --**TODO**: reinstate after #26584 is merged.
7+
import LocalClassFieldTheory.FromMathlib.Cyclic --**TODO**: remove after #26584 is merged.
8+
import Mathlib.Analysis.Normed.Ring.Lemmas
9+
import Mathlib.RingTheory.DedekindDomain.AdicValuation
10+
import Mathlib.RingTheory.DiscreteValuationRing.Basic
11+
import Mathlib.RingTheory.PrincipalIdealDomainOfPrime
12+
import Mathlib.RingTheory.Valuation.Discrete.Basic
13+
14+
/- import LocalClassFieldTheory.ForMathlib.WithZero
15+
--import Mathlib.Algebra.Order.Group.Cyclic --**TODO**: reinstate after #26584 is merged.
16+
import LocalClassFieldTheory.FromMathlib.Cyclic --**TODO**: remove after #26584 is merged.
817
import Mathlib.Analysis.Normed.Field.Lemmas
918
import Mathlib.Data.Int.WithZero
1019
import Mathlib.RingTheory.DedekindDomain.AdicValuation
@@ -13,7 +22,7 @@ import Mathlib.RingTheory.PrincipalIdealDomainOfPrime
1322
import Mathlib.RingTheory.Valuation.Discrete.Basic
1423
import Mathlib.RingTheory.Valuation.Integers
1524
import Mathlib.RingTheory.Valuation.RankOne
16-
import Mathlib.GroupTheory.SpecificGroups.Cyclic
25+
import Mathlib.GroupTheory.SpecificGroups.Cyclic -/
1726

1827
import Mathlib.Algebra.GroupWithZero.Int
1928

@@ -127,16 +136,33 @@ lemma IsUniformizer_val_ne_zero {π : K} (hπ : v.IsUniformizer π) : v π ≠ 0
127136

128137
open MonoidHomWithZero Subgroup
129138

139+
--TODO: move after `generator_zpowers_eq_valueGroup`
140+
lemma IsRankOneDiscrete.generator_zpowers_mem_valueGroup :
141+
(IsRankOneDiscrete.generator v) ∈ valueGroup v := by
142+
rw [← IsRankOneDiscrete.generator_zpowers_eq_valueGroup]
143+
exact mem_zpowers (IsRankOneDiscrete.generator v)
144+
145+
lemma valueGroup_genLTOne_eq_generator :
146+
Subgroup.genLTOne (valueGroup v) = IsRankOneDiscrete.generator v := by
147+
rw [eq_comm]
148+
apply (valueGroup v).genLTOne_unique
149+
⟨IsRankOneDiscrete.generator v, IsRankOneDiscrete.generator_zpowers_mem_valueGroup⟩
150+
constructor
151+
· exact Subtype.coe_lt_coe.mp (IsRankOneDiscrete.generator_lt_one v)
152+
· have := IsRankOneDiscrete.generator_zpowers_eq_valueGroup v
153+
rw [eq_top_iff']
154+
intro x
155+
have hx : x.1 ∈ zpowers (IsRankOneDiscrete.generator v) := by
156+
rw [IsRankOneDiscrete.generator_zpowers_eq_valueGroup v]; exact x.2
157+
obtain ⟨k, hk⟩ := hx
158+
exact ⟨k, by ext1; exact hk⟩
159+
130160
lemma IsUniformizer_val_generates_unitsMapRange {π : K} (hπ : v.IsUniformizer π) :
131161
valueGroup v = zpowers (Units.mk0 (v π) (v.IsUniformizer_val_ne_zero hπ)) := by
132-
--rw [(valueGroup v).genLTOne_zpowers_eq_top]
133-
sorry/- rw [← v.unitsMapRange.genLTOne_zpowers_eq_top]
162+
rw [← (valueGroup v).genLTOne_zpowers_eq_top]
134163
congr
135-
simp_all [isUniformizer_val, Units.mk0_val] -/
136-
137-
--Units.mk0 (zpowers (v π)) (v.IsUniformizer_val_ne_zero) := sorry--((/- WithZero.unitsMap -/(v.IsUniformizer_val_ne_zero hπ))) := by
138-
-- convert (Mul.exists_generator_lt_one ℤ v.unitsMapRange_ne_bot).choose_spec.2.symm
139-
-- rw [← WithZero.coe_inj, ← hπ, WithZero.coe_unitsMap]
164+
simp_all [isUniformizer_val, Units.mk0_val]
165+
exact valueGroup_genLTOne_eq_generator
140166

141167
variable (v) in
142168
/-- The structure `Uniformizer` bundles together the term in the ring and a proof that it is a
@@ -237,40 +263,23 @@ local notation "K₀" => v.valuationSubring
237263
theorem exists_IsUniformizer_of_isNontrivial :
238264
∃ π : K₀, IsUniformizer v (π : K) := by
239265
simp only [IsUniformizer_iff, Subtype.exists, mem_valuationSubring_iff, exists_prop]
240-
set g := (⊤ : Subgroup (valueGroup v)).genLTOne with hg
241-
have := valueGroup_eq_range (f := v)
242-
have hg_mem : g.1.1 ∈ ((range v) \ {0}) := by
266+
set g := (valueGroup v).genLTOne with hg
267+
have hg_mem : g.1 ∈ ((range v) \ {0}) := by
243268
rw [← valueGroup_eq_range, hg]
244-
exact mem_image_of_mem Units.val (Subtype.coe_prop _)
269+
exact mem_image_of_mem Units.val (valueGroup v).genLTOne_mem
245270
obtain ⟨⟨π, hπ⟩, hγ0⟩ := hg_mem
246271
use π
247272
rw [hπ, hg]
248-
constructor
249-
· exact_mod_cast (le_of_lt (⊤ : Subgroup (valueGroup v)).genLTOne_lt_one)
250-
·
251-
sorry
252-
/- · apply le_of_lt
253-
rw [← unitsMap_apply, hπ]
254-
have := Subgroup.genLTOne_lt_one (H := v.unitsMapRange)
255-
rw [hg]
256-
rw [← Units.val_one]
257-
rw [Units.val_lt_val]
258-
rw [Subgroup.genLTOne_val_eq_genLTOne]
259-
exact this
260-
· rw [← unitsMap_apply, hπ, hg]
261-
rw [Subgroup.genLTOne_val_eq_genLTOne]
262-
-- **FAE : The above `splitting` should not be performed** -/
263-
264-
265-
instance [IsNontrivial v] : Nonempty (Uniformizer v) :=
273+
exact ⟨le_of_lt (valueGroup v).genLTOne_lt_one, by rw [valueGroup_genLTOne_eq_generator]⟩
274+
275+
instance : Nonempty (Uniformizer v) :=
266276
⟨⟨(exists_IsUniformizer_of_isNontrivial v).choose,
267277
(exists_IsUniformizer_of_isNontrivial v).choose_spec⟩⟩
268278

269279
end Field
270280

271281
end IsNontrivial
272282

273-
274283
open LinearOrderedCommGroup
275284

276285

@@ -286,7 +295,6 @@ variable {K : Type w₁} [Field K] (v : Valuation K Γ)
286295
the notion of `valuation_subring` instead of the weaker one of `integer`s to access the
287296
corresponding API. -/
288297
local notation "K₀" => v.valuationSubring
289-
290298
section Uniformizer
291299

292300
variable {v} [hv : v.IsRankOneDiscrete]
@@ -307,20 +315,21 @@ theorem associated_of_IsUniformizer (π₁ π₂ : Uniformizer v) : Associated
307315
apply_fun ((↑·) : K₀ → K) using Subtype.val_injective
308316
simp [hp, ← mul_assoc, mul_inv_cancel₀ (IsUniformizer_ne_zero π₁.2)]
309317

318+
open MonoidHomWithZero in
310319
theorem pow_Uniformizer {r : K₀} (hr : r ≠ 0) (π : Uniformizer v) :
311320
∃ n : ℕ, ∃ u : K₀ˣ, r = (π.1 ^ n).1 * u.1 := by
312-
sorry
313-
/- have hr₀ : v r ≠ 0 := by rw [ne_eq, zero_iff, Subring.coe_eq_zero_iff]; exact hr
314-
set vr := unitsMap v (Units.mk0 r.1 (by norm_cast)) with hvr_def
315-
have hvr : vr ∈ v.unitsMapRange := by
316-
simp only [unitsMapRange, Subgroup.mem_mk, Set.mem_range, unitsMap_apply]
317-
have hr' : (r : K) ≠ 0 := by simpa [ne_eq, ZeroMemClass.coe_eq_zero] using hr
318-
use Units.mk0 r hr'
321+
have hr₀ : v r ≠ 0 := by rw [ne_eq, zero_iff, Subring.coe_eq_zero_iff]; exact hr
322+
set vr : Γˣ := Units.mk0 (v r) hr₀ with hvr_def
323+
have hvr : vr ∈ (valueGroup v) := by
324+
apply mem_valueGroup
325+
rw [hvr_def, Units.val_mk0 hr₀]
326+
exact mem_range_self _
319327
rw [IsUniformizer_val_generates_unitsMapRange π.2, Subgroup.mem_zpowers_iff] at hvr
320328
obtain ⟨m, hm⟩ := hvr
321329
have hm' : v π.val ^ m = v r := by
322330
rw [hvr_def] at hm
323-
simp [← v.unitsMap_of_ne_zero (x := r.1) (by norm_cast), ← hm]
331+
rw [← Units.val_mk0 hr₀, ← hm]
332+
simp [Units.val_zpow_eq_zpow_val, Units.val_mk0]
324333
have hm₀ : 0 ≤ m := by
325334
rw [← zpow_le_one_iff_right_of_lt_one₀ (IsUniformizer_val_pos π.2)
326335
(IsUniformizer_val_lt_one π.2), hm']
@@ -339,7 +348,7 @@ theorem pow_Uniformizer {r : K₀} (hr : r ≠ 0) (π : Uniformizer v) :
339348
Integers.isUnit_of_one (integer.integers v) (isUnit_iff_ne_zero.mpr ha₀) hpow
340349
use h_unit_a.unit
341350
rw [IsUnit.unit_spec, Subring.coe_pow, ha, ← mul_assoc, zpow_neg, hn, zpow_natCast,
342-
mul_inv_cancel₀ (pow_ne_zero _ (Uniformizer_ne_zero π)), one_mul] -/
351+
mul_inv_cancel₀ (pow_ne_zero _ (Uniformizer_ne_zero π)), one_mul]
343352

344353
theorem Uniformizer_is_generator (π : Uniformizer v) :
345354
maximalIdeal v.valuationSubring = Ideal.span {π.1} := by
@@ -447,7 +456,7 @@ noncomputable instance _root_.DiscreteValuation.rankOne : RankOne v where
447456
448457
end RankOne -/
449458

450-
theorem ideal_isPrincipal [v.IsNontrivial] [IsCyclic Γˣ] (I : Ideal K₀) : I.IsPrincipal := by
459+
theorem ideal_isPrincipal /- [v.IsNontrivial] [IsCyclic Γˣ] -/ (I : Ideal K₀) : I.IsPrincipal := by
451460
suffices ∀ P : Ideal K₀, P.IsPrime → Submodule.IsPrincipal P by
452461
exact (IsPrincipalIdealRing.of_prime this).principal I
453462
intro P hP
@@ -467,11 +476,11 @@ theorem ideal_isPrincipal [v.IsNontrivial] [IsCyclic Γˣ] (I : Ideal K₀) : I.
467476
rw [← Ideal.IsMaximal.eq_of_le (IsLocalRing.maximalIdeal.isMaximal K₀) hP.ne_top hx_mem]
468477
exact ⟨π.1, Uniformizer_is_generator π⟩
469478

470-
theorem integer_isPrincipalIdealRing [v.IsNontrivial] [IsCyclic Γˣ] : IsPrincipalIdealRing K₀ :=
479+
theorem integer_isPrincipalIdealRing /- [v.IsNontrivial] [IsCyclic Γˣ] -/ : IsPrincipalIdealRing K₀ :=
471480
fun I ↦ ideal_isPrincipal v I⟩
472481

473482
/-- This is Chapter I, Section 1, Proposition 1 in Serre's Local Fields -/
474-
instance dvr_of_isDiscrete [v.IsNontrivial] [IsCyclic Γˣ] :
483+
instance dvr_of_isDiscrete /- [v.IsNontrivial] [IsCyclic Γˣ] -/:
475484
IsDiscreteValuationRing K₀ where
476485
toIsPrincipalIdealRing := integer_isPrincipalIdealRing v
477486
toIsLocalRing := inferInstance
@@ -568,5 +577,4 @@ noncomputable def dvrEquivUnitBall :
568577
(topEquiv.symm.trans (equivMapOfInjective ⊤ (algebraMap A (FractionRing A))
569578
(IsFractionRing.injective A _))).trans (RingEquiv.subringCongr algebraMap_eq_integers)
570579

571-
572580
end Valuation

0 commit comments

Comments
 (0)