Definitions/Def_AdicCompletionLocalRing.lean
Adic completion of a Noetherian local ring
Throughout, A is a commutative ring and the objects are Mathlib's I-adic completion \widehat{A} = AdicCompletion I A together with its level-n evaluation maps eval I A n (linear) and evalₐ I n (as a ring/algebra map onto A/I^n).
The first group of results identifies the kernels. evalₐ_algebraMap records that the composite of the structure map A \to \widehat{A} with evalₐ I n is reduction modulo I^n; mem_ker_evalₐ_iff identifies the ring-theoretic kernel of evalₐ I n with the module-theoretic kernel of eval I A n; and, for I finitely generated, ker_evalₐ_eq_map_pow states that this kernel is the ideal of \widehat{A} generated by the image of I^n. Consequently exists_eq_algebraMap_add writes any x \in \widehat{A} as a + y with a \in A and y in the extension of I^n. For I finitely generated, isUnit_one_add_of_mem_map shows 1+x is a unit when x lies in the extension of I (the extended ideal lies in the Jacobson radical, \widehat{A} being adically complete), and isUnit_add_of_mem_map extends this to u+x for u a unit.
In the local section A is local with maximal ideal \mathfrak m, and then Noetherian. isUnit_of_isUnit_algebraMap descends unitness along A \to \widehat{A}; maximalIdeal_fg records that \mathfrak m is finitely generated; an instance makes \widehat{A} a local ring. maximalIdeal_pow_eq_ker_evalₐ states that the n-th power of the maximal ideal of \widehat{A} is the kernel of evalₐ (maximalIdeal A) n, with the cases n=1 and the membership criterion x \in \mathfrak m_{\widehat A} \iff evalₐ … 1 x = 0 spelled out separately. For a base ring k with A a k-algebra, quotientMaximalIdealPowAlgHom is the induced k-algebra map \widehat{A}/\mathfrak m_{\widehat A}^n \to A/\mathfrak m^n; it is bijective, and quotientMaximalIdealPowAlgEquiv is the resulting k-algebra isomorphism, which sends the class of the image of a \in A to the class of a.
The transport section fixes a k-algebra isomorphism \Phi : \widehat{A} \xrightarrow{\sim} B with B a local ring. It records that \Phi preserves unitness, that the maximal ideal of B is the contraction-free image (and contraction) of \mathfrak m_{\widehat A}, that \mathfrak m_B^n is the ideal generated by the image of \mathfrak m^n under A \to \widehat{A} \xrightarrow{\Phi} B, that \Phi carries the image of \mathfrak m into \mathfrak m_B, and finally gives a k-algebra isomorphism quotientMaximalIdealPowAlgEquivOfAlgEquiv : B/\mathfrak m_B^n \simeq A/\mathfrak m^n sending the class of \Phi(a) to the class of a.
Relation to Mathlib
All of this is built on Mathlib's AdicCompletion, its evaluation maps eval and evalₐ, and Mathlib's local-ring results for adic completions (isLocalRing_of_fg, maximalIdeal_eq_map, IsAdicComplete.le_jacobson_bot); what is added here are the level-n kernel identifications, the unit criteria for 1+x and u+x, the k-algebra isomorphisms \widehat{A}/\mathfrak m_{\widehat A}^n \simeq A/\mathfrak m^n, and their transport along an algebra isomorphism of \widehat A with another local algebra.
Where it is used
These identifications are the basic bookkeeping for working with complete Noetherian local coefficient and deformation rings: they let one compute in \widehat{A} modulo powers of its maximal ideal by computing in A/\mathfrak m^n, and to move such computations across an abstract presentation \widehat{A} \simeq B of the completion.
References
- M. F. Atiyah and I. G. Macdonald, Introduction to Commutative Algebra, Addison-Wesley, 1969, Chapter 10
- H. Matsumura, Commutative Ring Theory, Cambridge Studies in Advanced Mathematics 8, Cambridge University Press, 1986
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 209 lines
- 27 declarations
- used in the statements of 15 theorems and imported by 80 proofs
- imports 0 definition modules
Source file: Definitions/Def_AdicCompletionLocalRing.lean
Imports
- only Mathlib
Declarations
- theorem
AdicCompletion.evalₐ_algebraMap - theorem
AdicCompletion.mem_ker_evalₐ_iff - theorem
AdicCompletion.ker_evalₐ_eq_map_pow - theorem
AdicCompletion.exists_eq_algebraMap_add - theorem
AdicCompletion.isUnit_one_add_of_mem_map - theorem
AdicCompletion.isUnit_add_of_mem_map - theorem
AdicCompletion.isUnit_of_isUnit_algebraMap - theorem
AdicCompletion.isUnit_one_add_of_mem_map_maximalIdeal - theorem
AdicCompletion.maximalIdeal_fg - instance
AdicCompletion.instIsLocalRingMaximalIdeal - theorem
AdicCompletion.maximalIdeal_pow_eq_ker_evalₐ - theorem
AdicCompletion.maximalIdeal_eq_ker_evalₐ_one - theorem
AdicCompletion.mem_maximalIdeal_iff - def
AdicCompletion.quotientMaximalIdealPowAlgHom - theorem
AdicCompletion.quotientMaximalIdealPowAlgHom_mk - theorem
AdicCompletion.quotientMaximalIdealPowAlgHom_bijective - def
AdicCompletion.quotientMaximalIdealPowAlgEquiv - theorem
AdicCompletion.quotientMaximalIdealPowAlgEquiv_mk - theorem
AdicCompletion.quotientMaximalIdealPowAlgEquiv_mk_algebraMap - theorem
AdicCompletion.isUnit_algEquiv_iff - theorem
AdicCompletion.comap_maximalIdeal_algEquiv - theorem
AdicCompletion.map_maximalIdeal_algEquiv - theorem
AdicCompletion.maximalIdeal_eq_map_algEquiv - theorem
AdicCompletion.maximalIdeal_pow_eq_map_algEquiv - theorem
AdicCompletion.algEquiv_algebraMap_mem_maximalIdeal - def
AdicCompletion.quotientMaximalIdealPowAlgEquivOfAlgEquiv - theorem
AdicCompletion.quotientMaximalIdealPowAlgEquivOfAlgEquiv_mk
Source
import Mathlib.RingTheory.AdicCompletion.Completeness ↗ import Mathlib.RingTheory.AdicCompletion.LocalRing ↗ import Mathlib.RingTheory.LocalRing.MaximalIdeal.Basic ↗ import Mathlib.RingTheory.Ideal.Quotient.Operations ↗ import Mathlib.RingTheory.Noetherian.Defs ↗ set_option autoImplicit false open IsLocalRing namespace AdicCompletion variable {A : Type*} [CommRing A] section Kernel variable (I : Ideal A) theorem evalₐ_algebraMap (n : ℕ) (a : A) : evalₐ I n (algebraMap A (AdicCompletion I A) a) = Ideal.Quotient.mk _ a := by rw [algebraMap_apply, Algebra.algebraMap_self, RingHom.id_apply, evalₐ_of] theorem mem_ker_evalₐ_iff (n : ℕ) (x : AdicCompletion I A) : x ∈ RingHom.ker (evalₐ I n) ↔ x ∈ LinearMap.ker (eval I A n) := by have h : (I ^ n • ⊤ : Ideal A) = I ^ n := by rw [smul_eq_mul, Ideal.mul_top] rw [RingHom.mem_ker, LinearMap.mem_ker] constructor · intro hx; rw [← factor_evalₐ_eq_eval I x h.ge, hx]; exact RingHom.map_zero _ · intro hx; rw [← factor_eval_eq_evalₐ I x h.le, hx]; exact LinearMap.map_zero _ theorem ker_evalₐ_eq_map_pow (hI : I.FG) (n : ℕ) : RingHom.ker (evalₐ I n) = (I ^ n).map (algebraMap A (AdicCompletion I A)) := by ext x rw [mem_ker_evalₐ_iff, ← pow_smul_top_eq_ker_eval hI, Ideal.smul_top_eq_map, Submodule.restrictScalars_mem] theorem exists_eq_algebraMap_add (hI : I.FG) (n : ℕ) (x : AdicCompletion I A) : ∃ a : A, ∃ y ∈ (I ^ n).map (algebraMap A (AdicCompletion I A)), x = algebraMap A (AdicCompletion I A) a + y := by obtain ⟨a, ha⟩ := Ideal.Quotient.mk_surjective (evalₐ I n x) refine ⟨a, x - algebraMap A _ a, ?_, by ring⟩ rw [← ker_evalₐ_eq_map_pow I hI, RingHom.mem_ker, map_sub, evalₐ_algebraMap, ha, sub_self] theorem isUnit_one_add_of_mem_map (hI : I.FG) {x : AdicCompletion I A} (hx : x ∈ I.map (algebraMap A (AdicCompletion I A))) : IsUnit (1 + x) := by haveI : IsAdicComplete (I.map (algebraMap A (AdicCompletion I A))) (AdicCompletion I A) := (IsAdicComplete.map_algebraMap_iff I (AdicCompletion I A)).mpr (isAdicComplete hI) have h := Ideal.mem_jacobson_bot.mp (IsAdicComplete.le_jacobson_bot _ hx) 1 rwa [mul_one, add_comm] at h theorem isUnit_add_of_mem_map (hI : I.FG) {u x : AdicCompletion I A} (hu : IsUnit u) (hx : x ∈ I.map (algebraMap A (AdicCompletion I A))) : IsUnit (u + x) := by have e : u + x = u * (1 + ↑hu.unit⁻¹ * x) := by rw [mul_add, mul_one, ← mul_assoc, IsUnit.mul_val_inv, one_mul] rw [e] exact hu.mul (isUnit_one_add_of_mem_map I hI (Ideal.mul_mem_left _ _ hx)) end Kernel section Local variable [IsLocalRing A] theorem isUnit_of_isUnit_algebraMap {a : A} (h : IsUnit (algebraMap A (AdicCompletion (maximalIdeal A) A) a)) : IsUnit a := by by_contra ha have hmem : a ∈ maximalIdeal A ^ 1 := by rw [pow_one]; exact (mem_maximalIdeal a).mpr ha have h1 := h.map (evalₐ (maximalIdeal A) 1) rw [evalₐ_algebraMap, Ideal.Quotient.eq_zero_iff_mem.mpr hmem, isUnit_zero_iff] at h1 exact (maximalIdeal.isMaximal A).ne_top ((pow_one (maximalIdeal A)).symm.trans (Ideal.Quotient.zero_eq_one_iff.mp h1)) theorem isUnit_one_add_of_mem_map_maximalIdeal (h𝔪 : (maximalIdeal A).FG) {x : AdicCompletion (maximalIdeal A) A} (hx : x ∈ (maximalIdeal A).map (algebraMap A (AdicCompletion (maximalIdeal A) A))) : IsUnit (1 + x) := isUnit_one_add_of_mem_map _ h𝔪 hx variable [IsNoetherianRing A] theorem maximalIdeal_fg : (maximalIdeal A).FG := IsNoetherian.noetherian _ instance instIsLocalRingMaximalIdeal : IsLocalRing (AdicCompletion (maximalIdeal A) A) := isLocalRing_of_fg maximalIdeal_fg theorem maximalIdeal_pow_eq_ker_evalₐ (n : ℕ) : maximalIdeal (AdicCompletion (maximalIdeal A) A) ^ n = RingHom.ker (evalₐ (maximalIdeal A) n) := by rw [maximalIdeal_eq_map, ← Ideal.map_pow, ker_evalₐ_eq_map_pow _ maximalIdeal_fg] theorem maximalIdeal_eq_ker_evalₐ_one : maximalIdeal (AdicCompletion (maximalIdeal A) A) = RingHom.ker (evalₐ (maximalIdeal A) 1) := by rw [← maximalIdeal_pow_eq_ker_evalₐ, pow_one] theorem mem_maximalIdeal_iff (x : AdicCompletion (maximalIdeal A) A) : x ∈ maximalIdeal (AdicCompletion (maximalIdeal A) A) ↔ evalₐ (maximalIdeal A) 1 x = 0 := by rw [maximalIdeal_eq_ker_evalₐ_one, RingHom.mem_ker] section Scalars variable (k : Type*) [CommRing k] [Algebra k A] noncomputable def quotientMaximalIdealPowAlgHom (n : ℕ) : (AdicCompletion (maximalIdeal A) A ⧸ maximalIdeal (AdicCompletion (maximalIdeal A) A) ^ n) →ₐ[k] A ⧸ maximalIdeal A ^ n := Ideal.Quotient.liftₐ _ ((evalₐ (maximalIdeal A) n).restrictScalars k) fun x hx => by rwa [maximalIdeal_pow_eq_ker_evalₐ, RingHom.mem_ker] at hx theorem quotientMaximalIdealPowAlgHom_mk (n : ℕ) (x : AdicCompletion (maximalIdeal A) A) : quotientMaximalIdealPowAlgHom k n (Ideal.Quotient.mk _ x) = evalₐ (maximalIdeal A) n x := rfl theorem quotientMaximalIdealPowAlgHom_bijective (n : ℕ) : Function.Bijective (quotientMaximalIdealPowAlgHom (A := A) k n) := by constructor · intro x y hxy obtain ⟨x, rfl⟩ := Ideal.Quotient.mk_surjective x obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective y rw [quotientMaximalIdealPowAlgHom_mk, quotientMaximalIdealPowAlgHom_mk] at hxy refine Ideal.Quotient.eq.mpr ?_ rw [maximalIdeal_pow_eq_ker_evalₐ, RingHom.mem_ker, map_sub, hxy, sub_self] · intro z obtain ⟨x, rfl⟩ := surjective_evalₐ (maximalIdeal A) n z exact ⟨Ideal.Quotient.mk _ x, rfl⟩ noncomputable def quotientMaximalIdealPowAlgEquiv (n : ℕ) : (AdicCompletion (maximalIdeal A) A ⧸ maximalIdeal (AdicCompletion (maximalIdeal A) A) ^ n) ≃ₐ[k] A ⧸ maximalIdeal A ^ n := AlgEquiv.ofBijective _ (quotientMaximalIdealPowAlgHom_bijective k n) theorem quotientMaximalIdealPowAlgEquiv_mk (n : ℕ) (x : AdicCompletion (maximalIdeal A) A) : quotientMaximalIdealPowAlgEquiv k n (Ideal.Quotient.mk _ x) = evalₐ (maximalIdeal A) n x := rfl theorem quotientMaximalIdealPowAlgEquiv_mk_algebraMap (n : ℕ) (a : A) : quotientMaximalIdealPowAlgEquiv k n (Ideal.Quotient.mk _ (algebraMap A _ a)) = Ideal.Quotient.mk _ a := by rw [quotientMaximalIdealPowAlgEquiv_mk, evalₐ_algebraMap] end Scalars end Local section Transport variable [IsLocalRing A] [IsNoetherianRing A] variable {k : Type*} [CommRing k] [Algebra k A] {B : Type*} [CommRing B] [IsLocalRing B] [Algebra k B] variable (Φ : AdicCompletion (maximalIdeal A) A ≃ₐ[k] B) omit [IsNoetherianRing A] [IsLocalRing B] in theorem isUnit_algEquiv_iff (x : AdicCompletion (maximalIdeal A) A) : IsUnit (Φ x) ↔ IsUnit x := ⟨fun h => by simpa using h.map Φ.symm, fun h => h.map Φ⟩ theorem comap_maximalIdeal_algEquiv : (maximalIdeal B).comap (Φ : AdicCompletion (maximalIdeal A) A →+* B) = maximalIdeal (AdicCompletion (maximalIdeal A) A) := by ext x show Φ x ∈ maximalIdeal B ↔ x ∈ maximalIdeal _ rw [mem_maximalIdeal, mem_maximalIdeal, mem_nonunits_iff, mem_nonunits_iff, isUnit_algEquiv_iff] theorem map_maximalIdeal_algEquiv : (maximalIdeal (AdicCompletion (maximalIdeal A) A)).map (Φ : AdicCompletion (maximalIdeal A) A →+* B) = maximalIdeal B := by rw [← comap_maximalIdeal_algEquiv Φ] exact Ideal.map_comap_of_surjective _ Φ.surjective _ theorem maximalIdeal_eq_map_algEquiv : maximalIdeal B = (maximalIdeal A).map ((Φ : AdicCompletion (maximalIdeal A) A →+* B).comp (algebraMap A (AdicCompletion (maximalIdeal A) A))) := by rw [← Ideal.map_map, ← maximalIdeal_eq_map, map_maximalIdeal_algEquiv] theorem maximalIdeal_pow_eq_map_algEquiv (n : ℕ) : maximalIdeal B ^ n = (maximalIdeal A ^ n).map ((Φ : AdicCompletion (maximalIdeal A) A →+* B).comp (algebraMap A (AdicCompletion (maximalIdeal A) A))) := by rw [Ideal.map_pow, ← maximalIdeal_eq_map_algEquiv] theorem algEquiv_algebraMap_mem_maximalIdeal {a : A} (ha : a ∈ maximalIdeal A) : Φ (algebraMap A _ a) ∈ maximalIdeal B := by rw [maximalIdeal_eq_map_algEquiv Φ] exact Ideal.mem_map_of_mem _ ha noncomputable def quotientMaximalIdealPowAlgEquivOfAlgEquiv (n : ℕ) : (B ⧸ maximalIdeal B ^ n) ≃ₐ[k] A ⧸ maximalIdeal A ^ n := (Ideal.quotientEquivAlg (maximalIdeal (AdicCompletion (maximalIdeal A) A) ^ n) (maximalIdeal B ^ n) Φ (by rw [Ideal.map_pow, map_maximalIdeal_algEquiv])).symm.trans (quotientMaximalIdealPowAlgEquiv k n) theorem quotientMaximalIdealPowAlgEquivOfAlgEquiv_mk (n : ℕ) (a : A) : quotientMaximalIdealPowAlgEquivOfAlgEquiv Φ n (Ideal.Quotient.mk _ (Φ (algebraMap A _ a))) = Ideal.Quotient.mk _ a := by rw [quotientMaximalIdealPowAlgEquivOfAlgEquiv, AlgEquiv.trans_apply, ← Ideal.quotientEquivAlg_mk (I := maximalIdeal (AdicCompletion (maximalIdeal A) A) ^ n) (J := maximalIdeal B ^ n) (f := Φ) (hIJ := by rw [Ideal.map_pow, map_maximalIdeal_algEquiv]), AlgEquiv.symm_apply_apply, quotientMaximalIdealPowAlgEquiv_mk_algebraMap] end Transport end AdicCompletion #print axioms AdicCompletion.ker_evalₐ_eq_map_pow #print axioms AdicCompletion.isUnit_one_add_of_mem_map #print axioms AdicCompletion.instIsLocalRingMaximalIdeal #print axioms AdicCompletion.maximalIdeal_eq_map #print axioms AdicCompletion.quotientMaximalIdealPowAlgEquiv #print axioms AdicCompletion.maximalIdeal_eq_map_algEquiv #print axioms AdicCompletion.quotientMaximalIdealPowAlgEquivOfAlgEquiv
Statements phrased using this module (15)
- Adic completion of a DVR is a complete DVR
IsDiscreteValuationRing.adicCompletion_isDomain_isDiscreteValuationRing_isAdicComplete0 below · depth 24 - Base change of a cyclotomic Drinfeld chart witness
ModularCurve.FullLevel.AuxLevel.exists_ringEquiv_adicCompletion_stalk_drinfeldChart_baseChange_of_cyclotomicWitness_of_isAlgClosed248 below · depth 29 - Per-node conclusion at the K₀-traces of all ends
ModularCurve.FullLevel.pernodeConclusion_traces_of_rigidDescentHyps1,284 below · depth 29 - Complete DVR with uniformiser and residues from A is widehatA
IsDiscreteValuationRing.exists_ringEquiv_adicCompletion_apply_eq_algebraMap_of_maximalIdeal_eq_span_map_of_forall_exists_sub_mem0 below · depth 30 - Lifting an unramified complete DVR into an adic completion
IsLocalRing.exists_ringHom_adicCompletion_of_isDiscreteValuationRing_of_maximalIdeal_eq_map_of_residueField2 below · depth 30 - Base change of the Gauss-branch criterion on a Drinfeld chart
ModularCurve.FullLevel.AuxLevel.forall_mem_comap_drinfeldChart_iff_forall_coeff_mem_maximalIdeal_baseChange_of_cyclotomic4 below · depth 30 - Base change of the Drinfeld-chart tame inertia law
ModularCurve.FullLevel.AuxLevel.inertia_drinfeldChart_baseChange_semilinear_linearPart_of_cyclotomicWitness_inertia_of_isAlgClosed123 below · depth 30 - Drinfeld formal chart at a supersingular point over general constants
ModularCurve.FullLevel.AuxLevelOne.exists_ringEquiv_adicCompletion_stalk_drinfeldChart_baseChange_of_cyclotomicWitness_of_isAlgClosed_of_isPrimitiveRoot_mul_of_dvd248 below · depth 30 - Per-node conclusion at one end of the descended model
ModularCurve.FullLevel.pernodeConclusion_of_pernodeHyps_of_rigidDescentHyps57 below · depth 30 - Primes of ̂ R contracting to 𝔪
AdicCompletion.eq_maximalIdeal_of_comap_algebraMap_eq_maximalIdeal0 below · depth 31 - Local homomorphisms out of an adic completion agree on R
AdicCompletion.ringHom_eq_of_map_maximalIdeal_le_of_forall_apply_algebraMap_eq0 below · depth 31 - Gauss-valuation anchor transported from the cyclotomic witness
ModularCurve.FullLevel.AuxLevelOne.forall_mem_comap_drinfeldChart_iff_forall_coeff_mem_maximalIdeal_baseChange_of_cyclotomic_of_isPrimitiveRoot_mul_of_dvd4 below · depth 31 - Base change of a cyclotomic Drinfeld-chart inertia witness
ModularCurve.FullLevel.AuxLevelOne.inertia_drinfeldChart_baseChange_semilinear_linearPart_of_cyclotomicWitness_inertia_of_isAlgClosed_of_isPrimitiveRoot_mul_of_dvd123 below · depth 31 - Descended per-node crossing data at a supersingular end, q=3
ModularCurve.FullLevel.Diamond.pernodeConclusion_of_pernodeHyps_of_rigidChart_linkedScalars_of_eq_three_of_dvd57 below · depth 31 - Descended per-node block at one end, q=2
ModularCurve.FullLevel.Diamond.pernodeConclusion_of_pernodeHyps_of_rigidChart_linkedScalars_of_eq_two_of_dvd57 below · depth 31