Definitions/Def_DedekindDomain_AdicValuation_InlineSpecific.lean
Adic completions of Dedekind domains: integers, uniformizers, residue fields
Throughout, A is a Dedekind domain with fraction field K and v a height-one prime of A, so that Mathlib's v-adic valuation v \colon K \to \mathbb{Z}^{m0} = WithZero (Multiplicative ℤ), the completion K_v = v.adicCompletion K and its valuation ring \mathcal{O}_v = v.adicCompletionIntegers K are available. The module equips these with the structure of a complete discrete valuation ring and identifies residue fields.
The definitions proper are: completionIdeal K v, the maximal ideal of the local ring \mathcal{O}_v, characterised by x \in completionIdeal iff v(x) < 1, equivalently v(x) \le ofAdd (-1), and more generally x \in \mathfrak{m}^n iff v(x) \le ofAdd (-n); ResidueFieldToCompletionResidueField, the ring homomorphism A/v \to \mathcal{O}_v/\mathfrak{m} induced by A \to \mathcal{O}_v (legitimate since completionIdeal lies over v.asIdeal); and ResidueFieldEquivCompletionResidueField, the assertion that this homomorphism is bijective, packaged as a ring isomorphism, surjectivity resting on approximation of elements of \mathcal{O}_v by elements of A. Consequently the residue degree Ideal.inertiaDeg' of completionIdeal over v.asIdeal is 1.
Alongside these, instances are provided: the valuation on K_v is rank-one discrete; completionIdeal lies over v.asIdeal; \mathcal{O}_v has dimension at most one, is a principal ideal ring, and is a discrete valuation ring (also in the notation \mathcal{O}[K_v]); and K_v is separable as a topological space when K is countable. The supporting theorems include: the closure of the image of A in K_v is exactly \mathcal{O}_v, hence A \to \mathcal{O}_v has dense range; approximation of a v-integral element by an element of A within any prescribed bound, and its simultaneous form over a finite family of distinct height-one primes; existence of a uniformizer \pi with v(\pi) = ofAdd (-1), the factorisation x = \pi^n u of nonzero elements of \mathcal{O}_v with u a unit, and \mathfrak{m} = (\pi); and the fact that finitely many elements of the completions K_{v_i} can be scaled by a single element of K into the respective valuation rings. Private helpers express the integral valuation as \exp(-\,\mathrm{mult}_{v}(aA)) and characterise units of a valuation subring as the elements of valuation 1.
Relation to Mathlib
Built on Mathlib's IsDedekindDomain.HeightOneSpectrum.adicCompletion and adicCompletionIntegers; it supplies the Valuation.IsRankOneDiscrete, Ring.DimensionLEOne, IsPrincipalIdealRing and IsDiscreteValuationRing instances for those objects, together with the residue-field identification. A few auxiliary lemmas on local rings and valuation subrings are kept private to this module.
Where it is used
These results are the local toolkit used wherever completions at finite places of a number field and their residue fields appear, in particular in local–global arguments and in the adelic formalism on the automorphic side of the proof.
References
- J.-P. Serre, Local Fields, Graduate Texts in Mathematics 67, Springer, 1979
- J. Neukirch, Algebraic Number Theory, Grundlehren der mathematischen Wissenschaften 322, Springer, 1999, Chapter II
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 565 lines
- 39 declarations
- used in the statements of 8 theorems and imported by 18 proofs
- imports 0 definition modules
Source file: Definitions/Def_DedekindDomain_AdicValuation_InlineSpecific.lean
Imports
- only Mathlib
Declarations
- lemma
IsDedekindDomain.HeightOneSpectrum.intValuation_eq_coe_neg_multiplicity - theorem
IsLocalRing.maximalIdeal_le - lemma
ValuationSubring.subtype_inj - theorem
ValuationSubring.valued_eq_one_of_isUnit - theorem
ValuationSubring.isUnit_of_valued_eq_one - theorem
ValuationSubring.isUnit_iff_valued_eq_one - lemma
IsDedekindDomain.HeightOneSpectrum.exists_ofAdd_natCast_of_le_one - lemma
IsDedekindDomain.HeightOneSpectrum.exists_ofAdd_natCast_lt - lemma
IsDedekindDomain.HeightOneSpectrum.ne_zero_of_some_le_intValuation - lemma
IsDedekindDomain.HeightOneSpectrum.emultiplicity_eq_of_valuation_eq_ofAdd - lemma
IsDedekindDomain.HeightOneSpectrum.exists_adicValued_mul_sub_le - lemma
IsDedekindDomain.HeightOneSpectrum.exists_adicValued_sub_lt_of_adicValued_le_one - theorem
IsDedekindDomain.HeightOneSpectrum.closureAlgebraMapIntegers_eq_integers - theorem
IsDedekindDomain.HeightOneSpectrum.denseRange_of_integerAlgebraMap - theorem
IsDedekindDomain.HeightOneSpectrum.exists_adicValued_sub_lt_of_adicCompletionInteger - abbrev
IsDedekindDomain.HeightOneSpectrum.completionIdeal - lemma
IsDedekindDomain.HeightOneSpectrum.mem_completionIdeal_iff - lemma
IsDedekindDomain.HeightOneSpectrum.algebraMap_completionIntegers - def
IsDedekindDomain.HeightOneSpectrum.ResidueFieldToCompletionResidueField - def
IsDedekindDomain.HeightOneSpectrum.ResidueFieldEquivCompletionResidueField - theorem
IsDedekindDomain.HeightOneSpectrum.inertiaDeg_asIdeal_completionIdeal - theorem
IsDedekindDomain.HeightOneSpectrum.exists_forall_adicValued_sub_lt - lemma
IsDedekindDomain.HeightOneSpectrum.adicCompletion.eq_mul_nonZeroDivisor_inv_adicCompletionIntegers - lemma
IsDedekindDomain.HeightOneSpectrum.adicCompletion.eq_mul_pi_adicCompletionIntegers - theorem
IsDedekindDomain.HeightOneSpectrum.adicCompletion.exists_uniformizer - theorem
IsDedekindDomain.HeightOneSpectrum.adicCompletion.uniformizer_ne_zero - theorem
IsDedekindDomain.HeightOneSpectrum.adicCompletion.uniformizer_not_isUnit - theorem
IsDedekindDomain.HeightOneSpectrum.adicCompletion.eq_pow_uniformizer_mul_unit - theorem
IsDedekindDomain.HeightOneSpectrum.adicCompletion.maximalIdeal_eq_span_uniformizer - lemma
IsDedekindDomain.HeightOneSpectrum.adicCompletion.mem_completionIdeal_pow - lemma
IsDedekindDomain.HeightOneSpectrum.mem_completionIdeal_iff' - lemma
IsDedekindDomain.HeightOneSpectrum.completionIdeal_ne_bot
Source
import Mathlib.Topology.Algebra.Valued.ValuationTopology ↗ import Mathlib.RingTheory.LocalRing.MaximalIdeal.Basic ↗ import Mathlib.RingTheory.LocalRing.MaximalIdeal.Defs ↗ import Mathlib.RingTheory.DedekindDomain.AdicValuation ↗ import Mathlib.Analysis.Normed.Ring.Lemmas ↗ import Mathlib.NumberTheory.RamificationInertia.Inertia ↗ import Mathlib.RingTheory.Valuation.Discrete.Basic ↗ import Mathlib.Topology.Path ↗ import Mathlib.Algebra.Group.Int.TypeTags ↗ import Mathlib.RingTheory.Valuation.Discrete.RankOne ↗ set_option maxHeartbeats 1200000 set_option synthInstance.maxHeartbeats 400000 section namespace IsDedekindDomain.HeightOneSpectrum open IsDedekindDomain private instance {R : Type*} [CommRing R] [IsDedekindDomain R] (K : Type*) [Field K] [Countable K] [Algebra R K] [IsFractionRing R K] (v : HeightOneSpectrum R) : TopologicalSpace.SeparableSpace (v.adicCompletion K) where exists_countable_dense := ⟨_, Set.countable_range _, HeightOneSpectrum.denseRange_algebraMap (K := K) (v := v)⟩ private lemma intValuation_eq_coe_neg_multiplicity {A : Type*} [CommRing A] [IsDedekindDomain A] (v : HeightOneSpectrum A) {a : A} (hnz : a ≠ 0) : v.intValuation a = WithZero.exp (-(multiplicity v.asIdeal (Ideal.span {a}) : ℤ)) := by classical have hnb : Ideal.span {a} ≠ ⊥ := by rwa [ne_eq, Ideal.span_singleton_eq_bot] rw [intValuation_if_neg _ hnz, count_associates_factors_eq hnb v.isPrime v.ne_bot] nth_rw 1 [← normalize_eq v.asIdeal] congr symm apply multiplicity_eq_of_emultiplicity_eq_some rw [← UniqueFactorizationMonoid.emultiplicity_eq_count_normalizedFactors v.irreducible hnb] end IsDedekindDomain.HeightOneSpectrum end section private theorem IsLocalRing.maximalIdeal_le {R : Type*} [CommSemiring R] [IsLocalRing R] {J : Ideal R} (hJ : J ≠ ⊤) (h : IsLocalRing.maximalIdeal R ≤ J) : J.IsMaximal := (IsLocalRing.maximalIdeal.isMaximal R).eq_of_le hJ h ▸ IsLocalRing.maximalIdeal.isMaximal R end section variable {F : Type*} [Field F] private lemma ValuationSubring.subtype_inj {R : ValuationSubring F} {x y : R} : R.subtype x = R.subtype y ↔ x = y := R.subtype_injective.eq_iff private theorem ValuationSubring.valued_eq_one_of_isUnit {K : Type*} [Field K] {Γ₀ : Type*} [LinearOrderedCommGroupWithZero Γ₀] [hv : Valued K Γ₀] (x : hv.v.valuationSubring) (hx : IsUnit x) : Valued.v x.val = 1 := by obtain ⟨u, hu⟩ := hx apply le_antisymm ((hv.v.mem_valuationSubring_iff _).1 x.2) rw [← Valued.v.map_one (R := K), ← Submonoid.coe_one, ← u.mul_inv, hu, Submonoid.coe_mul, Valued.v.map_mul] nth_rw 2 [← mul_one (Valued.v x.val)] exact mul_le_mul_right ((hv.v.mem_valuationSubring_iff _).1 (u⁻¹.val.property)) _ private theorem ValuationSubring.isUnit_of_valued_eq_one {K : Type*} [Field K] {Γ₀ : Type*} [LinearOrderedCommGroupWithZero Γ₀] [hv : Valued K Γ₀] (x : hv.v.valuationSubring) (hx : Valued.v x.val = 1) : IsUnit x := by have : IsUnit x.val := by rw [isUnit_iff_ne_zero, ne_eq, ← map_eq_zero hv.v, hx]; aesop obtain ⟨u, hu⟩ := this have hu_inv_le : Valued.v u⁻¹.val ≤ 1 := by rw [← one_mul (Valued.v _), ← hx, ← hu, ← Valued.v.map_mul, u.mul_inv, hu, hx, Valued.v.map_one] rw [isUnit_iff_exists] exact ⟨⟨u⁻¹.val, hu_inv_le⟩, ⟨by aesop, by aesop⟩⟩ private theorem ValuationSubring.isUnit_iff_valued_eq_one {K : Type*} [Field K] {Γ₀ : Type*} [LinearOrderedCommGroupWithZero Γ₀] [hv : Valued K Γ₀] (x : hv.v.valuationSubring) : IsUnit x ↔ Valued.v x.val = 1 := ⟨valued_eq_one_of_isUnit x, isUnit_of_valued_eq_one x⟩ end section namespace IsDedekindDomain.HeightOneSpectrum section Multiplicative open scoped WithZero lemma exists_ofAdd_natCast_of_le_one {x : ℤᵐ⁰} (hx : x ≠ 0) (hx' : x ≤ 1) : ∃ (k : ℕ), (Multiplicative.ofAdd (-(k : ℤ))) = x := by lift x to Multiplicative ℤ using hx norm_cast at hx' obtain ⟨k, hk⟩ := Int.eq_ofNat_of_zero_le (Int.neg_nonneg_of_nonpos hx') use k rw [← hk, Int.neg_neg] rfl lemma exists_ofAdd_natCast_lt {x : ℤᵐ⁰} (hx : x ≠ 0) : ∃ (k : ℕ), (Multiplicative.ofAdd (-(k : ℤ))) < x := by obtain ⟨y, hnz, hyx⟩ := WithZero.exists_ne_zero_and_lt hx lift y to Multiplicative ℤ using hnz use y.natAbs apply lt_of_le_of_lt _ hyx norm_cast exact inv_mabs_le y end Multiplicative variable {A : Type*} (K : Type*) [CommRing A] [Field K] [Algebra A K] [IsFractionRing A K] [IsDedekindDomain A] (v : HeightOneSpectrum A) lemma ne_zero_of_some_le_intValuation {a : A} {m : Multiplicative ℤ} (h : m ≤ v.intValuation a) : a ≠ 0 := by rintro rfl simp at h lemma emultiplicity_eq_of_valuation_eq_ofAdd {a : A} {k : ℕ} (hv : v.intValuation a = (Multiplicative.ofAdd (-(k : ℤ)))) : emultiplicity v.asIdeal (Ideal.span {a}) = k := by classical have hnz : a ≠ 0 := ne_zero_of_some_le_intValuation _ (le_of_eq hv.symm) have hnb : Ideal.span {a} ≠ ⊥ := by rwa [ne_eq, Ideal.span_singleton_eq_bot] simp only [intValuation_if_neg _ hnz, WithZero.exp, ofAdd_neg, WithZero.coe_inv, inv_inj, WithZero.coe_inj, EmbeddingLike.apply_eq_iff_eq, Nat.cast_inj] at hv rw [← hv, UniqueFactorizationMonoid.emultiplicity_eq_count_normalizedFactors v.irreducible hnb, count_associates_factors_eq hnb v.isPrime v.ne_bot, normalize_eq] lemma exists_adicValued_mul_sub_le {a b : A} {γ : WithZero (Multiplicative ℤ)} (hγ : γ ≠ 0) (hle : γ ≤ v.intValuation a) (hle' : v.intValuation b ≤ v.intValuation a) : ∃ y, v.intValuation (y * a - b) ≤ γ := by have hγ' : γ ≤ 1 := by apply hle.trans apply intValuation_le_one obtain ⟨n, hn⟩ := exists_ofAdd_natCast_of_le_one hγ hγ' rw [← hn, ← WithZero.exp] at hle ⊢ have hnz : a ≠ 0 := ne_zero_of_some_le_intValuation _ hle have hnb : Ideal.span {a} ≠ ⊥ := by rwa [ne_eq, Ideal.span_singleton_eq_bot] rw [intValuation_eq_coe_neg_multiplicity _ hnz, WithZero.exp_le_exp, neg_le_neg_iff, Int.ofNat_le] at hle have hm : emultiplicity v.asIdeal (Ideal.span {a}) ≤ n := le_of_eq_of_le (emultiplicity_eq_of_valuation_eq_ofAdd v <| intValuation_eq_coe_neg_multiplicity v hnz) (ENat.coe_le_coe.mpr hle) have hb : b ∈ v.asIdeal ^ multiplicity v.asIdeal (Ideal.span {a}) := by rwa [← intValuation_le_pow_iff_mem, ← intValuation_eq_coe_neg_multiplicity _ hnz] rw [← irreducible_pow_sup_of_ge hnb (irreducible v) n hm] at hb obtain ⟨x, hx, z, hz, hxz⟩ := Submodule.mem_sup.mp hb obtain ⟨y, hy⟩ := Ideal.mem_span_singleton'.mp hz use y rwa [hy, ← hxz, sub_add_cancel_right, intValuation_le_pow_iff_mem, neg_mem_iff] open MonoidWithZeroHom in lemma exists_adicValued_sub_lt_of_adicValued_le_one {x : (WithVal (v.valuation K))} (γ : ((WithZero (Multiplicative ℤ)))ˣ) (hx : Valued.v x ≤ 1) : ∃a, Valued.v ((algebraMap A K a) - (x : v.adicCompletion K)) < γ.val := by obtain ⟨⟨n, d, hd⟩, hnd⟩ := IsLocalization.surj (nonZeroDivisors A) x dsimp only at hnd have hnd' := congr_arg Valued.v hnd simp only [map_mul] at hnd' have hge : Valued.v ((algebraMap A (WithVal (v.valuation K))) d) ≥ Valued.v ((algebraMap A (WithVal (v.valuation K))) n) := calc Valued.v ((algebraMap A (WithVal (v.valuation K))) d) ≥ (valuation K v) x.ofVal * (valuation K v) ((algebraMap A (WithVal (v.valuation K))) d).ofVal := mul_le_of_le_one_left' hx _ = Valued.v ((algebraMap A (WithVal (v.valuation K))) n) := hnd' simp only [ge_iff_le, WithVal.algebraMap_right_apply, WithVal.valued_toVal] at hge simp only [valuation_of_algebraMap] at hge have hdz : (algebraMap A (WithVal (v.valuation K)) d) ≠ 0 := IsLocalization.to_map_ne_zero_of_mem_nonZeroDivisors _ (fun _ ↦ id) hd have hv : Valued.v ((algebraMap A (WithVal (v.valuation K)) d)) ≠ 0 := by rw [Valuation.ne_zero_iff] exact hdz let hu : Valued.v ((algebraMap A (WithVal (v.valuation K)) d)) * γ.val ≠ 0 := by rw [mul_ne_zero_iff] exact ⟨hv, γ.ne_zero⟩ obtain ⟨γ', hγ, hγu, hγv⟩ := WithZero.exists_ne_zero_and_lt_and_lt hu hv simp only [WithVal.algebraMap_right_apply, WithVal.valued_toVal, valuation_of_algebraMap] at hγv obtain ⟨a, hval⟩ := exists_adicValued_mul_sub_le v hγ hγv.le hge use a rw [← eq_div_iff_mul_eq hdz] at hnd rw [adicCompletion.valuedAdicCompletion_def, ← adicCompletion.equiv_apply, map_sub, adicCompletion.equiv_apply, adicCompletion.equiv_apply, adicCompletion.toCompletion_ofCompletion, adicCompletion.toCompletion_ofCompletion, ← UniformSpace.Completion.coe_sub, Valued.extensionValuation_apply_coe, hnd, sub_div' hdz, map_div₀] rw [← Valuation.pos_iff Valued.v, WithVal.algebraMap_right_apply, WithVal.valued_toVal] at hdz simp only [WithVal.algebraMap_right_apply, WithVal.equiv_symm_apply, ← WithVal.toVal_mul, ← WithVal.toVal_sub, WithVal.valued_toVal, ← map_mul, ← map_sub] at hγu ⊢ rw [div_lt_iff₀' hdz, valuation_of_algebraMap] exact lt_of_le_of_lt hval hγu open scoped WithZero local notation "vK" => (Valued.v : Valuation (v.adicCompletion K) ℤᵐ⁰) instance : Valuation.IsRankOneDiscrete vK where exists_generator_lt_one' := by have h : (v.valuation K).IsRankOneDiscrete := Valuation.IsRankOneDiscrete.mk' (valuation K v) exact ⟨h.generator, by rw [h.generator_zpowers_eq_valueGroup, adicCompletion_valueGroup_eq], h.generator_lt_one⟩ open Valuation.IsRankOneDiscrete in theorem closureAlgebraMapIntegers_eq_integers : closure (algebraMap A (v.adicCompletion K)).range = SetLike.coe (v.adicCompletionIntegers K) := by apply subset_antisymm · apply closure_minimal _ (Valued.isClosed_valuationSubring _) rintro b ⟨a, rfl⟩ exact coe_mem_adicCompletionIntegers v a · let f := fun (k : WithVal (v.valuation K)) => (k : v.adicCompletion K) suffices h : closure (f '' (f ⁻¹' (adicCompletionIntegers K v))) ⊆ closure (algebraMap A (adicCompletion K v)).range by apply Set.Subset.trans _ h exact DenseRange.subset_closure_image_preimage_of_isOpen ((adicCompletion.ofCompletion_surjective K v).denseRange.comp UniformSpace.Completion.denseRange_coe (adicCompletion.continuous_ofCompletion K v)) (Valued.isOpen_valuationSubring _) apply closure_minimal _ isClosed_closure rintro k ⟨x, hx, rfl⟩ unfold f at hx rw [Set.mem_preimage, SetLike.mem_coe, mem_adicCompletionIntegers, adicCompletion.valued_ofCompletion, Valued.valuedCompletion_apply] at hx rw [mem_closure_iff_nhds_zero] intro U hU rw [Valued.mem_nhds] at hU obtain ⟨γ, hγ⟩ := hU let γ' := Units.mapEquiv (valueGroup₀_equiv_withZeroMulInt _).toMulEquiv γ obtain ⟨a, ha⟩ := exists_adicValued_sub_lt_of_adicValued_le_one K v γ' hx use algebraMap A K a constructor · use a rfl · apply hγ simp only [sub_zero, WithVal.equiv_symm_apply, Set.mem_setOf_eq] rwa [← (valueGroup₀_equiv_withZeroMulInt_strictMono _).lt_iff_lt, valueGroup₀_equiv_withZeroMulInt_restrict_apply_of_surjective (valuedAdicCompletion_surjective K v)] theorem denseRange_of_integerAlgebraMap : DenseRange (algebraMap A (v.adicCompletionIntegers K)) := by rw [denseRange_iff_closure_range, Set.eq_univ_iff_forall] intro x rw [closure_subtype] suffices h : Subtype.val '' Set.range ((algebraMap A ↥(adicCompletionIntegers K v))) = (algebraMap A (v.adicCompletion K)).range by rw [h, closureAlgebraMapIntegers_eq_integers K v] exact Subtype.coe_prop x simp only [RingHom.coe_range, ← Set.range_comp'] rfl open Valuation.IsRankOneDiscrete in theorem exists_adicValued_sub_lt_of_adicCompletionInteger (x : v.adicCompletionIntegers K) (γ : ℤᵐ⁰ˣ) : ∃a, Valued.v ((algebraMap A K a) - (x : v.adicCompletion K)) < γ.val := by have h := closureAlgebraMapIntegers_eq_integers K v rw [Set.ext_iff] at h specialize h x simp_rw [RingHom.coe_range, Subtype.coe_prop, iff_true, mem_closure_iff_nhds] at h specialize h { y | Valued.v (y - (x : v.adicCompletion K)) < γ.val } have hn : {y | Valued.v (y - (x : v.adicCompletion K)) < γ.val} ∈ nhds x.val := by rw [Valued.mem_nhds] use (Units.mapEquiv (valueGroup₀_equiv_withZeroMulInt vK).toMulEquiv).symm γ have hsurj := (valuedAdicCompletion_surjective K v) intro y hy have hy' := (valueGroup₀_equiv_withZeroMulInt_strictMono vK) hy rw [valueGroup₀_equiv_withZeroMulInt_restrict_apply_of_surjective hsurj] at hy' refine lt_of_lt_of_eq hy' ?_ exact MulEquiv.apply_symm_apply (valueGroup₀_equiv_withZeroMulInt vK).toMulEquiv _ obtain ⟨z, ⟨hz, a, ha⟩⟩ := h hn use a rw [algebraMap_adicCompletion, Function.comp_apply] at ha rwa [ha] noncomputable abbrev completionIdeal : Ideal (v.adicCompletionIntegers K) := IsLocalRing.maximalIdeal (adicCompletionIntegers K v) lemma mem_completionIdeal_iff (x : v.adicCompletionIntegers K) : x ∈ completionIdeal K v ↔ Valued.v x.val < 1 := Valuation.mem_maximalIdeal_iff _ _ lemma algebraMap_completionIntegers (x : A) : (algebraMap A (v.adicCompletionIntegers K) x) = (algebraMap A (v.adicCompletion K) x) := rfl instance : (v.completionIdeal K).LiesOver v.asIdeal := ⟨by rw [Ideal.under_def] ext x simp only [Ideal.mem_comap, mem_completionIdeal_iff, algebraMap_completionIntegers, valuedAdicCompletion_eq_valuation, valuation_lt_one_iff_mem]⟩ open IsLocalRing in noncomputable def ResidueFieldToCompletionResidueField : A ⧸ v.asIdeal →+* ResidueField (v.adicCompletionIntegers K) := Ideal.quotientMap _ (algebraMap _ _) <| le_of_eq Ideal.LiesOver.over set_option backward.isDefEq.respectTransparency false in open IsLocalRing in noncomputable def ResidueFieldEquivCompletionResidueField : A ⧸ v.asIdeal ≃+* ResidueField (v.adicCompletionIntegers K) := by apply RingEquiv.ofBijective (ResidueFieldToCompletionResidueField K v) ⟨Ideal.quotientMap_injective' <| ge_of_eq Ideal.LiesOver.over, ?_⟩ intro z obtain ⟨x, hx⟩ := Submodule.Quotient.mk_surjective (p := maximalIdeal ↥(adicCompletionIntegers K v)) z rw [← hx, Ideal.Quotient.mk_eq_mk] suffices ∃ a : A, (ResidueFieldToCompletionResidueField K v) a = Ideal.Quotient.mk _ x by obtain ⟨a, ha⟩ := this refine ⟨a, ha⟩ change ∃ a, Ideal.Quotient.mk (maximalIdeal (v.adicCompletionIntegers K)) _ = _ simp_rw [Ideal.Quotient.mk_eq_mk_iff_sub_mem, mem_maximalIdeal, mem_nonunits_iff] conv => pattern ¬(IsUnit _) rw [Valuation.Integer.not_isUnit_iff_valuation_lt_one] exact exists_adicValued_sub_lt_of_adicCompletionInteger K v x 1 attribute [local instance 9999] Algebra.toModule in theorem inertiaDeg_asIdeal_completionIdeal : Ideal.inertiaDeg' v.asIdeal (v.completionIdeal K) = 1 := by rw [Ideal.inertiaDeg'_algebraMap] have f : (A ⧸ v.asIdeal) ≃ₗ[A ⧸ v.asIdeal] ((adicCompletionIntegers K v) ⧸ completionIdeal K v) := { __ := ResidueFieldEquivCompletionResidueField K v map_smul' := by intro x y rw [Algebra.smul_def, Algebra.smul_def] exact map_mul (ResidueFieldEquivCompletionResidueField K v) x y } rw [← LinearEquiv.finrank_eq f] exact Module.finrank_self _ theorem exists_forall_adicValued_sub_lt {ι : Type*} (s : Finset ι) (e : ι → (WithZero (Multiplicative ℤ))ˣ) (valuation : ι → HeightOneSpectrum A) (injective : Function.Injective valuation) (x : (i : ι) → (valuation i).adicCompletionIntegers K) : ∃ a, ∀ i ∈ s, Valued.v ((algebraMap A K a) - (x i).val) < (e i).val := by choose f hf using fun (i : s) => exists_adicValued_sub_lt_of_adicCompletionInteger K (valuation i) (x i) (e i) have hexists_e' : ∀ (i : ι), ∃ (e' : ℕ), (Multiplicative.ofAdd (-(e' : ℤ))) < (e i).val := by intro i apply exists_ofAdd_natCast_lt (e i).ne_zero choose e' he' using hexists_e' have hinj : ∀ i ∈ s, ∀ j ∈ s, i ≠ j → (fun i ↦ (valuation i).asIdeal) i ≠ (fun i ↦ (valuation i).asIdeal) j := by intro _ _ _ _ exact mt <| fun hij ↦ injective (HeightOneSpectrum.ext hij) obtain ⟨a, ha⟩ := IsDedekindDomain.exists_forall_sub_mem_ideal (s := s) (fun i => (valuation i).asIdeal) e' (fun i hi => (valuation i).prime) hinj f use a intro i hi specialize ha i hi specialize hf ⟨i, hi⟩ rw [← intValuation_le_pow_iff_mem, ← valuation_of_algebraMap (K := K), ← valuedAdicCompletion_eq_valuation, algebraMap.coe_sub] at ha refine lt_of_le_of_lt ?_ (Valuation.map_add_lt _ (ha.trans_lt (he' i)) hf) apply le_of_eq congr rw [add_sub, sub_eq_sub_iff_add_eq_add, add_right_cancel_iff, add_comm_sub, add_sub, eq_sub_iff_add_eq] rfl lemma adicCompletion.eq_mul_nonZeroDivisor_inv_adicCompletionIntegers (v : HeightOneSpectrum A) (x : v.adicCompletion K) : ∃a ∈ nonZeroDivisors A, ∃b ∈ v.adicCompletionIntegers K, x = (algebraMap A K a)⁻¹ • b := by obtain ⟨a, hz, ha⟩ := adicCompletion.mul_nonZeroDivisor_mem_adicCompletionIntegers v x use a, hz, (algebraMap A K a) • x constructor · rwa [Algebra.smul_def, ← IsScalarTower.algebraMap_apply, mul_comm] · rw [smul_smul, inv_mul_cancel₀, one_smul] exact IsLocalization.to_map_ne_zero_of_mem_nonZeroDivisors K (fun _ ↦ id) hz lemma adicCompletion.eq_mul_pi_adicCompletionIntegers {ι : Type*} [Finite ι] (valuation : ι → HeightOneSpectrum A) (x : (i : ι) → (valuation i).adicCompletion K) : ∃k : K, ∃y ∈ Set.pi Set.univ (fun (i : ι) ↦ ((valuation i).adicCompletionIntegers K).carrier), x = k • y := by classical let := Fintype.ofFinite ι choose f hf using fun (i : ι) => eq_mul_nonZeroDivisor_inv_adicCompletionIntegers K (valuation i) (x i) use (algebraMap A K (∏ i : ι, f i))⁻¹, (algebraMap A K (∏ i : ι, f i)) • x have hz : ∀ (i : ι), (algebraMap A K) (f i) ≠ 0 := fun i => IsLocalization.to_map_ne_zero_of_mem_nonZeroDivisors K (fun _ ↦ id) (hf i).left constructor · rintro i - obtain ⟨b, hb, hx⟩ := (hf i).right beta_reduce rw [Pi.smul_apply, algebraMap_smul, Subsemiring.coe_carrier_toSubmonoid, Subring.coe_toSubsemiring, SetLike.mem_coe, ValuationSubring.mem_toSubring, hx, ← Finset.prod_erase_mul _ f (Finset.mem_univ i), mul_smul, ← IsScalarTower.smul_assoc (f i), Algebra.smul_def (f i), mul_inv_cancel₀ (hz i), one_smul, Algebra.smul_def] apply mul_mem (coe_mem_adicCompletionIntegers _ _) hb · rw [smul_smul, inv_mul_cancel₀, one_smul] simp [Finset.prod_ne_zero_iff, hz] namespace adicCompletion open scoped algebraMap in theorem exists_uniformizer (v : HeightOneSpectrum A) : ∃ π : v.adicCompletionIntegers K, Valued.v π.1 = Multiplicative.ofAdd (- 1 : ℤ) := by obtain ⟨π, hπ⟩ := v.intValuation_exists_uniformizer use π rw [← WithZero.exp, ← hπ, ← ValuationSubring.algebraMap_apply, ← IsScalarTower.algebraMap_apply, v.valuedAdicCompletion_eq_valuation, v.valuation_of_algebraMap] variable {K} in theorem uniformizer_ne_zero {v : HeightOneSpectrum A} {π : v.adicCompletionIntegers K} (hπ : Valued.v π.1 = Multiplicative.ofAdd (-1 : ℤ)) : π ≠ 0 := by contrapose! hπ simp [hπ] set_option backward.isDefEq.respectTransparency false in variable {K} in open scoped Multiplicative in theorem uniformizer_not_isUnit {π : v.adicCompletionIntegers K} (hπ : Valued.v π.1 = Multiplicative.ofAdd (-1 : ℤ)) : ¬IsUnit (π : v.adicCompletionIntegers K) := by rw [ValuationSubring.isUnit_iff_valued_eq_one, ← WithZero.coe_one, ← ofAdd_zero, hπ] apply ne_of_lt rw [WithZero.coe_lt_coe, Multiplicative.ofAdd_lt] omega theorem eq_pow_uniformizer_mul_unit {x : v.adicCompletionIntegers K} (hx : x ≠ 0) {π : v.adicCompletionIntegers K} (hπ : Valued.v π.1 = Multiplicative.ofAdd (-1 : ℤ)) : ∃ (n : ℕ) (u : (v.adicCompletionIntegers K)ˣ), x = π ^ n * u := by have hx' : Valued.v x.1 ≠ 0 := by simp [hx] let m := - Multiplicative.toAdd (WithZero.unzero hx') have hm₀ : 0 ≤ m := by simp_rw [m, Right.nonneg_neg_iff, ← toAdd_one, Multiplicative.toAdd_le] rw [← WithZero.coe_le_coe]; exact (WithZero.coe_unzero _).symm ▸ x.2 have hpow : Valued.v (π ^ (-m) * x.val) = 1 := by rw [Valued.v.map_mul, map_zpow₀, hπ, ofAdd_neg, WithZero.coe_inv, inv_zpow', neg_neg, ← WithZero.coe_zpow, ← Int.ofAdd_mul, one_mul, ofAdd_neg, ofAdd_toAdd, WithZero.coe_inv, WithZero.coe_unzero, inv_mul_cancel₀ hx'] let a : v.adicCompletionIntegers K := ⟨π ^ (-m) * x.val, le_of_eq hpow⟩ refine ⟨m.toNat, (ValuationSubring.isUnit_of_valued_eq_one a hpow).unit, Subtype.ext ?_⟩ simp only [zpow_neg, IsUnit.unit_spec, MulMemClass.coe_mul, SubmonoidClass.coe_pow, a, ← zpow_natCast, m.toNat_of_nonneg hm₀, ← mul_assoc] rw [mul_inv_cancel₀ (zpow_ne_zero _ <| (by simp [uniformizer_ne_zero hπ])), one_mul] open scoped algebraMap in theorem maximalIdeal_eq_span_uniformizer {π : v.adicCompletionIntegers K} (hπ : Valued.v π.1 = Multiplicative.ofAdd (-1 : ℤ)) : IsLocalRing.maximalIdeal (v.adicCompletionIntegers K) = Ideal.span {(π : v.adicCompletionIntegers K)} := by refine (IsLocalRing.maximalIdeal.isMaximal _).eq_of_le (Ideal.span_singleton_ne_top (uniformizer_not_isUnit v hπ)) (fun x hx => ?_) by_cases hx₀ : x = 0 · simp only [hx₀, Ideal.zero_mem] · obtain ⟨n, ⟨u, hu⟩⟩ := eq_pow_uniformizer_mul_unit K v hx₀ hπ have hn : ¬(IsUnit x) := fun h => (IsLocalRing.maximalIdeal.isMaximal _).ne_top (Ideal.eq_top_of_isUnit_mem _ hx h) replace hn : n ≠ 0 := fun h => by {rw [hu, h, pow_zero, one_mul] at hn; exact hn u.isUnit} simpa [Ideal.mem_span_singleton, hu, IsUnit.dvd_mul_right, Units.isUnit] using dvd_pow_self π hn instance : Ring.DimensionLEOne (v.adicCompletionIntegers K) where maximalOfPrime {𝔭} h𝔭_ne_bot h𝔭_prime := by let ⟨x, hx⟩ := Submodule.exists_mem_ne_zero_of_ne_bot h𝔭_ne_bot let ⟨π, hπ⟩ := exists_uniformizer K v obtain ⟨n, ⟨u, rfl⟩⟩ := eq_pow_uniformizer_mul_unit K v hx.2 hπ simp only [Units.isUnit, Ideal.mul_unit_mem_iff_mem, ne_eq, mul_eq_zero, pow_eq_zero_iff', Units.ne_zero, or_false, not_and, Decidable.not_not] at hx by_cases hn : n = 0 · simp only [hn, pow_zero, ← 𝔭.eq_top_iff_one, implies_true, and_true] at hx exact h𝔭_prime.ne_top hx |>.elim · rw [h𝔭_prime.pow_mem_iff_mem n (by omega), ← 𝔭.span_singleton_le_iff_mem, ← maximalIdeal_eq_span_uniformizer K v hπ] at hx exact IsLocalRing.maximalIdeal_le h𝔭_prime.ne_top hx.1 open scoped algebraMap in instance : IsPrincipalIdealRing (v.adicCompletionIntegers K) := by apply IsPrincipalIdealRing.of_prime intro P hP by_cases hP_bot : P = ⊥ · exact hP_bot ▸ bot_isPrincipal · let ⟨π, hπ⟩ := exists_uniformizer K v use π rw [IsLocalRing.eq_maximalIdeal (hP.isMaximal hP_bot)] exact maximalIdeal_eq_span_uniformizer K v hπ instance : IsDiscreteValuationRing (v.adicCompletionIntegers K) where not_a_field' := by let ⟨π, hπ⟩ := exists_uniformizer K v rw [maximalIdeal_eq_span_uniformizer K v hπ] intro h simp only [Ideal.span_singleton_eq_bot] at h exact uniformizer_ne_zero hπ h open scoped Valued in instance : IsDiscreteValuationRing (𝒪[v.adicCompletion K]) := inferInstanceAs (IsDiscreteValuationRing (v.adicCompletionIntegers K)) lemma mem_completionIdeal_pow {n : ℕ} (x : v.adicCompletionIntegers K) : x ∈ (v.completionIdeal K) ^ n ↔ Valued.v x.val ≤ ↑(Multiplicative.ofAdd (-(n : ℤ))) := by obtain ⟨π, hπ⟩ := exists_uniformizer K v unfold completionIdeal rw [maximalIdeal_eq_span_uniformizer K v hπ, Ideal.span_singleton_pow, Ideal.mem_span_singleton'] have hvalπ_pow : (Valued.v π.val) ^ n = (Multiplicative.ofAdd (-n : ℤ)) := by rw [hπ] norm_num norm_cast rw [← ofAdd_nsmul, Nat.smul_one_eq_cast] constructor · rintro ⟨a, rfl⟩ simp only [MulMemClass.coe_mul, SubmonoidClass.coe_pow, map_mul, map_pow, ofAdd_neg, WithZero.coe_inv] apply mul_le_of_le_one_of_le a.prop <| le_of_eq hvalπ_pow · intro hx set a := x.val / (π ^ n) with ha' have ha : Valued.v a ≤ 1 := by rwa [ha', Valuation.map_div, Valuation.map_pow, hvalπ_pow, div_le_one₀ (WithZero.zero_lt_coe _)] use ⟨a, ha⟩ apply Subtype.val_injective simp only [MulMemClass.coe_mul, SubmonoidClass.coe_pow, ha'] rw [div_mul_eq_mul_div₀, mul_div_cancel_right₀] apply pow_ne_zero n norm_cast exact uniformizer_ne_zero hπ end adicCompletion lemma mem_completionIdeal_iff' (x : v.adicCompletionIntegers K) : x ∈ v.completionIdeal K ↔ Valued.v x.val ≤ ↑(Multiplicative.ofAdd (-(1 : ℤ))) := by rw [← Submodule.pow_one (v.completionIdeal K), adicCompletion.mem_completionIdeal_pow, Int.natCast_one] lemma completionIdeal_ne_bot : completionIdeal K v ≠ ⊥ := IsDiscreteValuationRing.not_a_field _ end IsDedekindDomain.HeightOneSpectrum end
Statements phrased using this module (8)
- Residue–trace commutation through the completion, F/E separable
AlgebraicCurve.residueTraceCompletionCommute4 below · depth 11 - Tate's residue agrees with the local residue trace
AlgebraicCurve.tateAgreement0 below · depth 12 - Chain rule for Tate's residue along F/E
AlgebraicCurve.tateChainRule0 below · depth 12 - Tate's commutator has finite K-rank at every place
AlgebraicCurve.tateCommFinite0 below · depth 12 - Trace compatibility of Tate's local residue for separable F/E
AlgebraicCurve.tateTraceCompat_of_isSeparable0 below · depth 12 - Uniqueness of Hensel lifts in a local ring
IsLocalRing.hensel_lift_unique0 below · depth 20 - Residue commutes with trace through the completion
AlgebraicCurve.residueTraceCompletionCommute_v24 below · depth 21 - Tate's residue equals the trace of the local residue
AlgebraicCurve.tateAgreement_v20 below · depth 22