Module

ProfiniteIntegerFiniteQuotient.lean

Nyll.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient
21 declarations indexed from sourceView source ↗

Finite quotient reductions of profinite integers

This module extends the concrete ZHat reduction maps to every finite-index additive quotient of ℤ. The construction first identifies such a subgroup with the multiples of its index, then uses the existing reduction to ZMod and Mathlib's ZMod.lift.

Imports6
Imported by1

Declarations

ClassFormation.finiteIndexNormalAddSubgroup_eq_zmultiples_index
Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem finiteIndexNormalAddSubgroup_eq_zmultiples_index
    (H : FiniteIndexNormalAddSubgroup ℤ) :
    H.toAddSubgroup =
      AddSubgroup.zmultiples (H.toAddSubgroup.index : ℤ)
ClassFormation.finiteIndexNormalAddSubgroup_index_pos
Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem finiteIndexNormalAddSubgroup_index_pos
    (H : FiniteIndexNormalAddSubgroup ℤ) :
    0 < H.toAddSubgroup.index
ClassFormation.finiteIndexNormalAddSubgroup_index_mem
Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem finiteIndexNormalAddSubgroup_index_mem
    (H : FiniteIndexNormalAddSubgroup ℤ) :
    (H.toAddSubgroup.index : ℤ) ∈ H.toAddSubgroup
ClassFormation.zHatFiniteIndexQuotientReduction
Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
def zHatFiniteIndexQuotientReduction
    (H : FiniteIndexNormalAddSubgroup ℤ) :
    ZMod H.toAddSubgroup.index →+ ℤ ⧸ H.toAddSubgroup
ClassFormation.zHatReductionToFiniteIndexQuotient

The canonical reduction of ZHat to the finite quotient of ℤ by H.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
def zHatReductionToFiniteIndexQuotient
    (H : FiniteIndexNormalAddSubgroup ℤ) :
    ZHat →ₜ+ ℤ ⧸ H.toAddSubgroup
ClassFormation.zHatReductionToFiniteIndexQuotient_intCast

The finite quotient reduction extends the ordinary quotient map on integers.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatReductionToFiniteIndexQuotient_intCast
    (H : FiniteIndexNormalAddSubgroup ℤ) (a : ℤ) :
    zHatReductionToFiniteIndexQuotient H (a : ZHat) =
      QuotientAddGroup.mk' H.toAddSubgroup a
ClassFormation.zHatFiniteIndexQuotientDiagramLeg

The reduction to a finite-index quotient, regarded as a leg of the finite-quotient diagram defining Mathlib's profinite completion of ℤ.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
def zHatFiniteIndexQuotientDiagramLeg
    (H : FiniteIndexNormalAddSubgroup ℤ) :
    zHatProfiniteAddGrp ⟶
      (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)).obj H
ClassFormation.zHatFiniteIndexQuotientDiagramLeg_intCast

The diagram leg agrees with quotient reduction on the dense copy of the integers in ZHat.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatFiniteIndexQuotientDiagramLeg_intCast
    (H : FiniteIndexNormalAddSubgroup ℤ) (a : ℤ) :
    (zHatFiniteIndexQuotientDiagramLeg H).hom (a : ZHat) =
      QuotientAddGroup.mk' H.toAddSubgroup a
ClassFormation.zHatFiniteIndexQuotientDiagramLeg_naturality

The finite-quotient reductions form a cone over the diagram of finite index quotients of ℤ.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatFiniteIndexQuotientDiagramLeg_naturality
    {H K : FiniteIndexNormalAddSubgroup ℤ} (f : H ⟶ K) :
    zHatFiniteIndexQuotientDiagramLeg H ≫
        (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)).map f =
      zHatFiniteIndexQuotientDiagramLeg K
ClassFormation.zHatFiniteIndexQuotientCone

The finite quotient reductions of ZHat are a cone over the finite-index quotient diagram used by Mathlib to define the profinite completion of ℤ.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
def zHatFiniteIndexQuotientCone :
    Cone (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)) where
  pt := zHatProfiniteAddGrp
  π :=
    { app := zHatFiniteIndexQuotientDiagramLeg
      naturality := by
        intro H K f
        change 𝟙 zHatProfiniteAddGrp ≫ zHatFiniteIndexQuotientDiagramLeg K =
          zHatFiniteIndexQuotientDiagramLeg H ≫
            (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)).map f
        simpa only [Category.id_comp] using
          (zHatFiniteIndexQuotientDiagramLeg_naturality f).symm }
ClassFormation.zHatToIntegerProfiniteCompletion

The continuous additive map from ZHat to Mathlib's profinite completion of the additive group of integers, induced by its finite quotient reductions.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
def zHatToIntegerProfiniteCompletion :
    zHatProfiniteAddGrp ⟶
      ProfiniteAddGrp.ProfiniteCompletion.completion (AddGrpCat.of ℤ)
ClassFormation.zHatToIntegerProfiniteCompletion_fac

Projecting the induced map to a finite quotient recovers its reduction map.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatToIntegerProfiniteCompletion_fac
    (H : FiniteIndexNormalAddSubgroup ℤ) :
    zHatToIntegerProfiniteCompletion ≫
        (ProfiniteAddGrp.limitCone
          (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ))).π.app H =
      zHatFiniteIndexQuotientDiagramLeg H
ClassFormation.zHatToIntegerProfiniteCompletion_intCast

On ordinary integers, the induced map is Mathlib's canonical completion map.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatToIntegerProfiniteCompletion_intCast
    (a : ℤ) :
    zHatToIntegerProfiniteCompletion (a : ZHat) =
      ProfiniteAddGrp.ProfiniteCompletion.etaFn (AddGrpCat.of ℤ) a
ClassFormation.zHatFiniteIndexQuotientReduction_injective
Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatFiniteIndexQuotientReduction_injective
    (H : FiniteIndexNormalAddSubgroup ℤ) :
    Function.Injective (zHatFiniteIndexQuotientReduction H)
ClassFormation.zHatToIntegerProfiniteCompletion_injective
Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatToIntegerProfiniteCompletion_injective :
    Function.Injective
      (fun z : ZHat => zHatToIntegerProfiniteCompletion z) := by
  intro x y hxy
  apply ZHat.ext
  intro n hn
  have hnatAbs : (n : ℤ).natAbs = n := by
    cases n <;> rfl
  let H : FiniteIndexNormalAddSubgroup ℤ :=
    { toAddSubgroup := AddSubgroup.zmultiples (n : ℤ)
      isFiniteIndex' :=
        ⟨by
          simpa only [Int.index_zmultiples, hnatAbs] using
            Nat.ne_of_gt hn⟩ }
  have hindex : H.toAddSubgroup.index = n := by
    simp only [H, Int.index_zmultiples, hnatAbs]
  have hprojection := congrArg
    (fun z =>
      ((ProfiniteAddGrp.limitCone
        (ProfiniteAddGrp.ProfiniteCompletion.diagram
          (AddGrpCat.of ℤ))).π.app H).hom z)
    hxy
  have hleg :
      (zHatFiniteIndexQuotientDiagramLeg H).hom x =
        (zHatFiniteIndexQuotientDiagramLeg H).hom y := by
    calc
      (zHatFiniteIndexQuotientDiagramLeg H).hom x =
          ((ProfiniteAddGrp.limitCone
            (ProfiniteAddGrp.ProfiniteCompletion.diagram
              (AddGrpCat.of ℤ))).π.app H).hom
            (zHatToIntegerProfiniteCompletion x) :=
        (ConcreteCategory.congr_hom
          (zHatToIntegerProfiniteCompletion_fac H) x).symm
      _ = ((ProfiniteAddGrp.limitCone
            (ProfiniteAddGrp.ProfiniteCompletion.diagram
              (AddGrpCat.of ℤ))).π.app H).hom
            (zHatToIntegerProfiniteCompletion y) := hprojection
      _ = (zHatFiniteIndexQuotientDiagramLeg H).hom y :=
        ConcreteCategory.congr_hom
          (zHatToIntegerProfiniteCompletion_fac H) y
  have hreduction :
      zHatReduction H.toAddSubgroup.index
          (finiteIndexNormalAddSubgroup_index_pos H) x =
        zHatReduction H.toAddSubgroup.index
          (finiteIndexNormalAddSubgroup_index_pos H) y := by
    apply zHatFiniteIndexQuotientReduction_injective H
    change zHatReductionToFiniteIndexQuotient H x =
      zHatReductionToFiniteIndexQuotient H y
    exact hleg
  have hreductionAll :
      ∀ hm : 0 < H.toAddSubgroup.index,
        zHatReduction H.toAddSubgroup.index hm x =
          zHatReduction H.toAddSubgroup.index hm y := by
    intro hm
    exact hreduction
  have hreductionAtN :
      ∀ hm : 0 < n,
        zHatReduction n hm x = zHatReduction n hm y :=
    hindex ▸ hreductionAll
  exact hreductionAtN hn
ClassFormation.zHatToIntegerProfiniteCompletion_surjective
Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatToIntegerProfiniteCompletion_surjective :
    Function.Surjective
      (fun z : ZHat => zHatToIntegerProfiniteCompletion z) := by
  have hsubset :
      Set.range
          (ProfiniteAddGrp.ProfiniteCompletion.etaFn
            (AddGrpCat.of ℤ)) ⊆
        Set.range (fun z : ZHat => zHatToIntegerProfiniteCompletion z) := by
    rintro _ ⟨a, rfl⟩
    exact ⟨(a : ZHat), zHatToIntegerProfiniteCompletion_intCast a⟩
  have hdense : DenseRange
      (fun z : ZHat => zHatToIntegerProfiniteCompletion z) :=
    (ProfiniteAddGrp.ProfiniteCompletion.denseRange
      (G := AddGrpCat.of ℤ)).mono hsubset
  have hclosed : IsClosed
      (Set.range (fun z : ZHat => zHatToIntegerProfiniteCompletion z)) :=
    zHatToIntegerProfiniteCompletion.hom.continuous_toFun.isClosedMap.isClosed_range
  rw [← Set.range_eq_univ, ← closure_eq_iff_isClosed.mpr hclosed,
    Dense.closure_eq hdense]
ClassFormation.zHatContinuousAddEquivIntegerProfiniteCompletion

The canonical topological additive equivalence between ZHat and the profinite completion of the additive group of integers.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
def zHatContinuousAddEquivIntegerProfiniteCompletion :
    ZHat ≃ₜ+
      ProfiniteAddGrp.ProfiniteCompletion.completion (AddGrpCat.of ℤ)
ClassFormation.zHatContinuousAddEquivIntegerProfiniteCompletion_apply

The forward map of the completion equivalence is the finite-quotient comparison map.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatContinuousAddEquivIntegerProfiniteCompletion_apply (z : ZHat) :
    zHatContinuousAddEquivIntegerProfiniteCompletion z =
      zHatToIntegerProfiniteCompletion z
ClassFormation.integerProfiniteCompletionToZHat

The canonical continuous additive map from the profinite completion of the integers back to ZHat.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
def integerProfiniteCompletionToZHat :
    ProfiniteAddGrp.ProfiniteCompletion.completion (AddGrpCat.of ℤ) ⟶
      zHatProfiniteAddGrp
ClassFormation.integerProfiniteCompletionToZHat_etaFn

The map from the profinite completion to ZHat extends the ordinary integer embedding.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem integerProfiniteCompletionToZHat_etaFn (a : ℤ) :
    integerProfiniteCompletionToZHat
        (ProfiniteAddGrp.ProfiniteCompletion.etaFn (AddGrpCat.of ℤ) a) =
      (a : ZHat)
ClassFormation.zHatContinuousAddEquivIntegerProfiniteCompletion_symm_apply

The inverse map of the completion equivalence is the canonical comparison map back to ZHat.

Source context 3 commands

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

namespace ClassFormation
open CategoryTheory CategoryTheory.Limits
noncomputable section
theorem zHatContinuousAddEquivIntegerProfiniteCompletion_symm_apply
    (x : ProfiniteAddGrp.ProfiniteCompletion.completion
      (AddGrpCat.of ℤ)) :
    zHatContinuousAddEquivIntegerProfiniteCompletion.symm x =
      integerProfiniteCompletionToZHat x