Module

ProfiniteInteger.lean

Nyll.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger
18 declarations indexed from sourceView source ↗

normalized degree and Frobenius theory: the profinite integers

This file supplies the source-producing facts about ℤ̂ used to normalize the surjection in the opening datum of abstract valuation theory. In particular, multiplication by a positive integer identifies ℤ̂ with the closed subgroup n ℤ̂, which is the kernel of reduction modulo n.

Declarations

ClassFormation.proCIntegerOne_pow_nat_injective

Distinct natural powers of the canonical positive generator of ℤ̂ are distinct. This common exponent-uniqueness fact is independent of the later reciprocity constructions that use it.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem proCIntegerOne_pow_nat_injective :
    Function.Injective (fun n : ℕ =>
      (Multiplicative.ofAdd (1 : ZHat)) ^ n) := by
  intro a b hab
  let m := a + b + 1
  have hm : 0 < m := by simp [m]
  have ha : a < m := by omega
  have hb : b < m := by omega
  have habAdd := congrArg Multiplicative.toAdd hab
  have habAdd' : a • (1 : ZHat) = b • (1 : ZHat) := by
    simpa using habAdd
  have habRed := congrArg (fun z : ZHat => zHatReduction m hm z) habAdd'
  have hredOne : zHatReduction m hm (1 : ZHat) = 1 :=
    rfl
  change zHatReduction m hm (a • (1 : ZHat)) =
      zHatReduction m hm (b • (1 : ZHat)) at habRed
  rw [map_nsmul, map_nsmul, hredOne] at habRed
  have hval := congrArg ZMod.val habRed
  simpa [ZMod.val_natCast_of_lt ha, ZMod.val_natCast_of_lt hb] using hval
ClassFormation.zHatMulNat

Multiplication by n on the additive group of the profinite integers.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
def zHatMulNat (n : ℕ) : ContinuousAddMonoidHom ZHat ZHat where
  toFun := fun x => n • x
  map_zero' := nsmul_zero n
  map_add' := fun x y => nsmul_add x y n
  continuous_toFun := continuous_nsmul n
ClassFormation.zHatMulNat_apply

The defining evaluation formula for zHatMulNat is zHatMulNat n x = n • x.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatMulNat_apply (n : ℕ) (x : ZHat) :
    zHatMulNat n x = n • x
ClassFormation.zmod_cast_eq_of_nsmul_eq
Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zmod_cast_eq_of_nsmul_eq
    {n m : ℕ} (hn : 0 < n) {a b : ZMod (n * m)}
    (h : n • a = n • b) :
    ZMod.castHom (show m ∣ n * m from ⟨n, by simp [Nat.mul_comm]⟩) (ZMod m) a =
      ZMod.castHom (show m ∣ n * m from ⟨n, by simp [Nat.mul_comm]⟩) (ZMod m) b := by
  rcases ZMod.intCast_surjective a with ⟨a, rfl⟩
  rcases ZMod.intCast_surjective b with ⟨b, rfl⟩
  rw [ZMod.castHom_apply, ZMod.castHom_apply]
  rw [ZMod.cast_intCast
      (R := ZMod m) (n := n * m) (m := m)
      (show m ∣ n * m from ⟨n, by simp [Nat.mul_comm]⟩) a,
    ZMod.cast_intCast
      (R := ZMod m) (n := n * m) (m := m)
      (show m ∣ n * m from ⟨n, by simp [Nat.mul_comm]⟩) b]
  rw [← sub_eq_zero, ← Int.cast_sub, ZMod.intCast_zmod_eq_zero_iff_dvd]
  have hzero : (n • ((a - b : ℤ) : ZMod (n * m))) = 0 := by
    rw [Int.cast_sub, nsmul_sub, h, sub_self]
  have hdiv : ((n * m : ℕ) : ℤ) ∣ (n : ℤ) * (a - b) := by
    rw [← ZMod.intCast_zmod_eq_zero_iff_dvd]
    simpa [nsmul_eq_mul, Int.cast_natCast, Int.cast_mul] using hzero
  have hn0 : (n : ℤ) ≠ 0 := by exact_mod_cast Nat.ne_of_gt hn
  apply (mul_dvd_mul_iff_left hn0).mp
  simpa [Nat.cast_mul] using hdiv
ClassFormation.zHatMulNat_injective

Multiplication by a positive integer is injective on ℤ̂.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatMulNat_injective {n : ℕ} (hn : 0 < n) :
    Function.Injective (zHatMulNat n)
ClassFormation.isClosed_zHatMulNat_range

The image n ℤ̂ is closed.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem isClosed_zHatMulNat_range (n : ℕ) :
    IsClosed ((zHatMulNat n).toAddMonoidHom.range : Set ZHat)
ClassFormation.zHatReduction_int

Establishes the identity zHatReduction n hn ((Int.castRingHom ZHat) a) = (a : ZMod n).

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatReduction_int (n : ℕ) (hn : 0 < n) (a : ℤ) :
    zHatReduction n hn
        ((Int.castRingHom ZHat) a) =
      (a : ZMod n)
ClassFormation.zHatReduction_surjective

Reduction modulo a positive integer is onto.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatReduction_surjective (n : ℕ) (hn : 0 < n) :
    Function.Surjective (zHatReduction n hn)
ClassFormation.zHatMulNat_int

Establishes the identity zHatMulNat n ((Int.castRingHom ZHat) a) = (Int.castRingHom ZHat) ((n : ℤ) * a).

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatMulNat_int (n : ℕ) (a : ℤ) :
    zHatMulNat n ((Int.castRingHom ZHat) a) =
      (Int.castRingHom ZHat) ((n : ℤ) * a)
ClassFormation.zHatMulNat_range_eq_ker_reduction

The subgroup n ℤ̂ is exactly the kernel of reduction modulo n.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatMulNat_range_eq_ker_reduction (n : ℕ) (hn : 0 < n) :
    (zHatMulNat n).toAddMonoidHom.range =
      (zHatReduction n hn).toAddMonoidHom.ker
ClassFormation.zHatMulNat_range_index

The additive index of n ℤ̂ in ℤ̂ is n.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatMulNat_range_index (n : ℕ) (hn : 0 < n) :
    (zHatMulNat n).toAddMonoidHom.range.index = n
ClassFormation.zHatAddSubgroup_eq_mulNat_range_of_index_ne_zero

Every additive subgroup of finite nonzero index in ℤ̂ is the expected principal subgroup. Closedness is not needed: the quotient is abelian, so its cardinality annihilates every quotient class, and comparison of indices forces equality.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatAddSubgroup_eq_mulNat_range_of_index_ne_zero
    (H : AddSubgroup ZHat) (hH : H.index ≠ 0) :
    H = (zHatMulNat H.index).toAddMonoidHom.range
ClassFormation.zHatAddSubgroup_eq_mulNat_range_of_index_eq

Index-explicit form of the classification of finite-index additive subgroups of ℤ̂.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatAddSubgroup_eq_mulNat_range_of_index_eq
    (H : AddSubgroup ZHat) {n : ℕ} (hn : 0 < n) (hindex : H.index = n) :
    H = (zHatMulNat n).toAddMonoidHom.range
ClassFormation.zHatAddSubgroup_eq_mulNat_range_of_finite_quotient

A subgroup with finite quotient is the subgroup obtained by multiplying by its index.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatAddSubgroup_eq_mulNat_range_of_finite_quotient
    (H : AddSubgroup ZHat) [Finite (ZHat ⧸ H)] :
    H = (zHatMulNat H.index).toAddMonoidHom.range
ClassFormation.zHatMulNatRangeEquiv

Multiplication by n > 0 identifies ℤ̂ continuously with its image.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
def zHatMulNatRangeEquiv (n : ℕ) (hn : 0 < n) :
    ZHat ≃ₜ+ (zHatMulNat n).toAddMonoidHom.range
ClassFormation.zHatDivide

Division by n on the subgroup n ℤ̂.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
def zHatDivide (n : ℕ) (hn : 0 < n) :
    ContinuousAddMonoidHom ((zHatMulNat n).toAddMonoidHom.range) ZHat
ClassFormation.zHatMulNat_zHatDivide

Establishes the identity zHatMulNat n (zHatDivide n hn y) = y.1.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatMulNat_zHatDivide (n : ℕ) (hn : 0 < n)
    (y : (zHatMulNat n).toAddMonoidHom.range) :
    zHatMulNat n (zHatDivide n hn y) = y.1
ClassFormation.zHatDivide_zHatMulNat

Establishes the identity zHatDivide n hn ⟨zHatMulNat n x, ⟨x, rfl⟩⟩ = x.

Source context 2 commands

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

namespace ClassFormation
noncomputable section
theorem zHatDivide_zHatMulNat (n : ℕ) (hn : 0 < n) (x : ZHat) :
    zHatDivide n hn
      ⟨zHatMulNat n x, ⟨x, rfl⟩⟩ = x