Module

GeometricStalkTensorLocal.lean

Nyll.EtaleFundamentalGroups.StrictHenselian.GeometricStalkTensorLocal
3 declarations indexed from sourceView source ↗

Closed-point local rings of a base-changed geometric stalk

Let H be the actual geometric etale stalk of R, and let T be a strictly Henselian local R-algebra. At any prime of T ⊗[R] H over the closed point of T, the map from T to the local ring is an isomorphism.

The proof uses actual affine etale representatives of individual germs. After base change to T, the selected local factor of each representative is finite etale and hence equal to T. Tensor induction handles numerators; localness handles denominators, and faithful flatness gives injectivity. No local-ring comparison or alternate presentation of the stalk is assumed.

This is the local algebra needed for the double and triple overlaps in Stacks Project, Lemma 58.10.6 (https://stacks.math.columbia.edu/tag/0BSB).

Imports13
Imported by2

Declarations

EtaleFundamentalGroups.StrictHenselian.etale_hom_exists_base_preimage
Source context 5 commands

Surrounding namespaces, section variables, and local commands at this declaration.

noncomputable section
open AlgebraicGeometry CategoryTheory
open scoped TensorProduct
namespace EtaleFundamentalGroups.StrictHenselian
universe u
theorem etale_hom_exists_base_preimage
    {T E L : Type u} [CommRing T] [CommRing E] [CommRing L]
    [Algebra T E] [Algebra T L] [HenselianLocalRing T] [IsLocalRing L]
    [IsSepClosed (IsLocalRing.ResidueField T)] [Algebra.Etale T E]
    [IsLocalHom (algebraMap T L)] (g : E →ₐ[T] L) (e : E) :
    ∃ t : T, algebraMap T L t = g e
EtaleFundamentalGroups.StrictHenselian.geometricStalk_hom_exists_strictHenselian_preimage

Any map from the actual geometric stalk into a local algebra of a strictly Henselian ring takes every germ into the image of that ring. The compatibility equation is the ordinary base-ring square of the map.

Source context 5 commands

Surrounding namespaces, section variables, and local commands at this declaration.

noncomputable section
open AlgebraicGeometry CategoryTheory
open scoped TensorProduct
namespace EtaleFundamentalGroups.StrictHenselian
universe u
theorem geometricStalk_hom_exists_strictHenselian_preimage
    {R Ω T L : Type u} [CommRing R] [Field Ω] [CommRing T] [CommRing L]
    [Algebra R T] [Algebra R L] [Algebra T L] [IsScalarTower R T L]
    [HenselianLocalRing T] [IsLocalRing L]
    [IsSepClosed (IsLocalRing.ResidueField T)]
    [IsLocalHom (algebraMap T L)] (φ : R →+* Ω)
    (g : geometricStalk (Spec.map (CommRingCat.ofHom φ)) →+* L)
    (hg : g.comp (geometricStalkStructureMap φ) = algebraMap R L)
    (a : geometricStalk (Spec.map (CommRingCat.ofHom φ))) :
    ∃ t : T, algebraMap T L t = g a
EtaleFundamentalGroups.StrictHenselian.geometricStalk_tensor_localizationAtPrime_bijective

The actual base-changed geometric stalk has the strictly Henselian base as local ring at every point above its closed point.

Source context 5 commands

Surrounding namespaces, section variables, and local commands at this declaration.

noncomputable section
open AlgebraicGeometry CategoryTheory
open scoped TensorProduct
namespace EtaleFundamentalGroups.StrictHenselian
universe u
theorem geometricStalk_tensor_localizationAtPrime_bijective
    {R Ω T : Type u} [CommRing R] [Field Ω] [CommRing T] [Algebra R T]
    [HenselianLocalRing T] [IsSepClosed (IsLocalRing.ResidueField T)]
    (φ : R →+* Ω) :
    let H := geometricStalk (Spec.map (CommRingCat.ofHom φ))
    let : Algebra R H := (geometricStalkStructureMap φ).toAlgebra
    ∀ (q : Ideal (T ⊗[R] H)) [q.IsPrime]
      [q.LiesOver (IsLocalRing.maximalIdeal T)],
      Function.Bijective (algebraMap T (Localization.AtPrime q)) := by
  intro H hH q hq hqover
  let B := T ⊗[R] H
  let L := Localization.AtPrime q
  have : Module.Flat R H := geometricStalkStructureMap_flat φ
  have : IsLocalHom (algebraMap T L) :=
    isLocalHom_algebraMap_localizationAtPrime_of_liesOver_maximalIdeal q
  have : Module.FaithfullyFlat T L := Module.FaithfullyFlat.of_flat_of_isLocalHom
  refine ⟨FaithfulSMul.algebraMap_injective T L, ?_⟩
  let g : H →+* L := (algebraMap B L).comp
    (Algebra.TensorProduct.includeRight : H →ₐ[R] B).toRingHom
  have hg : g.comp (geometricStalkStructureMap φ) = algebraMap R L := by
    apply RingHom.ext
    intro r
    have hcoeff : (Algebra.TensorProduct.includeRight : H →ₐ[R] B)
        (algebraMap R H r) = algebraMap R B r :=
      (Algebra.TensorProduct.includeRight : H →ₐ[R] B).commutes r
    exact (congrArg (algebraMap B L) hcoeff).trans
      (IsScalarTower.algebraMap_apply R B L r).symm
  have hpreimage (b : B) : ∃ t : T, algebraMap T L t = algebraMap B L b := by
    induction b using TensorProduct.inductionOn with
    | tmul t a =>
      obtain ⟨r, hr⟩ := geometricStalk_hom_exists_strictHenselian_preimage
        (R := R) (Ω := Ω) (T := T) (L := L) φ g hg a
      refine ⟨t * r, ?_⟩
      calc
        algebraMap T L (t * r) = algebraMap T L t * g a := by rw [map_mul, hr]
        _ = algebraMap B L ((t ⊗ₜ[R] (1 : H)) * (1 ⊗ₜ[R] a)) := by
          rw [map_mul]
          change algebraMap T L t * g a =
            algebraMap B L (algebraMap T B t) * g a
          rw [← IsScalarTower.algebraMap_apply]
        _ = algebraMap B L (t ⊗ₜ[R] a) := by
          rw [Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul]
    | add b c hb hc =>
      obtain ⟨t, ht⟩ := hb
      obtain ⟨r, hr⟩ := hc
      exact ⟨t + r, by rw [map_add, ht, hr, map_add]⟩
  intro x
  obtain ⟨b, s, rfl⟩ := IsLocalization.exists_mk'_eq q.primeCompl x
  obtain ⟨t, ht⟩ := hpreimage b
  obtain ⟨d, hd⟩ := hpreimage s
  have hdunit : IsUnit d := IsLocalHom.map_nonunit d
    (hd.symm ▸ IsLocalization.map_units L s)
  obtain ⟨dunit, hdunit⟩ := hdunit
  refine ⟨t * ↑(dunit⁻¹), ?_⟩
  apply IsLocalization.eq_mk'_iff_mul_eq.mpr
  rw [← hd, ← hdunit, ← map_mul, mul_assoc, Units.inv_mul, mul_one, ht]