Module

Rank.lean

Nyll.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank
34 declarations indexed from sourceView source ↗

Torsion and rank sources for S-units

This file supplies the algebraic rank and torsion input for S-units. The finite set S contains the finite places; all infinite places are understood to be present.

Imports7
  • Nyll.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces
  • Mathlib.Algebra.Exact.Basic
  • Mathlib.LinearAlgebra.Dimension.Torsion.Finite
  • Mathlib.LinearAlgebra.StdBasis
  • Mathlib.NumberTheory.NumberField.ClassNumber
  • Mathlib.NumberTheory.NumberField.Units.Regulator
  • Mathlib.RingTheory.DedekindDomain.Factorization
Imported by3

Declarations

SUnitGroup.emptyEquivNumberFieldUnits

The group of ordinary units, expressed as S-units for the empty set.

Source context 5 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
def emptyEquivNumberFieldUnits :
    ((∅ : Set (HeightOneSpectrum (𝓞 K))).unit K) ≃* (𝓞 K)ˣ
SUnitGroup.fromNumberFieldUnits

The canonical embedding of ordinary units into the S-unit group.

Source context 5 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
def fromNumberFieldUnits
    (S : Finset (HeightOneSpectrum (𝓞 K))) :
    (𝓞 K)ˣ →* SUnitGroup (K := K) S where
  toFun u :=
    ⟨((emptyEquivNumberFieldUnits (K := K)).symm u : Kˣ),
      fun v _ =>
        Set.unit_valuation_eq_one
          (∅ : Set (HeightOneSpectrum (𝓞 K))) K
          ((emptyEquivNumberFieldUnits (K := K)).symm u) (by simp)⟩
  map_one' := by
    ext
    simp
  map_mul' u v := by
    ext
    simp
SUnitGroup.fromNumberFieldUnits_injective
Source context 5 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
theorem fromNumberFieldUnits_injective
    (S : Finset (HeightOneSpectrum (𝓞 K))) :
    Function.Injective (fromNumberFieldUnits (K := K) S)
SUnitGroup.torsion_eq_rootsOfUnity_range

Torsion in an S-unit group consists exactly of the ordinary roots of unity.

Source context 5 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
theorem torsion_eq_rootsOfUnity_range
    (S : Finset (HeightOneSpectrum (𝓞 K))) :
    CommGroup.torsion (SUnitGroup (K := K) S) =
      Subgroup.map (fromNumberFieldUnits (K := K) S)
        (NumberField.Units.torsion K)
SUnitGroup.divisorCoordinate

The exponent of the principal fractional ideal of an S-unit at a finite place in S.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def divisorCoordinate
    (x : SUnitGroup (K := K) S) (v : S) : ℤ
SUnitGroup.valuation_mk'_eq_exp_neg_count

The valuation of a localization fraction is the exponential of the negative exponent of its principal fractional ideal.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem valuation_mk'_eq_exp_neg_count
    (v : HeightOneSpectrum (𝓞 K)) {n : 𝓞 K} (hn : n ≠ 0)
    (d : (𝓞 K)⁰) :
    v.valuation K (IsLocalization.mk' K n d) =
      WithZero.exp
        (-FractionalIdeal.count K v
          (FractionalIdeal.spanSingleton (𝓞 K)⁰
            (IsLocalization.mk' K n d)))
SUnitGroup.valuation_eq_exp_neg_count

The adic valuation of a field unit is the exponential of the negative exponent of its principal fractional ideal.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem valuation_eq_exp_neg_count
    (x : Kˣ) (v : HeightOneSpectrum (𝓞 K)) :
    v.valuation K (x : K) =
      WithZero.exp
        (-FractionalIdeal.count K v
          (FractionalIdeal.spanSingleton (𝓞 K)⁰ (x : K)))
SUnitGroup.valuation_eq_one_iff_count_eq_zero

A field unit has valuation one exactly when its principal fractional ideal has exponent zero at the place.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem valuation_eq_one_iff_count_eq_zero
    (x : Kˣ) (v : HeightOneSpectrum (𝓞 K)) :
    v.valuation K (x : K) = 1 ↔
      FractionalIdeal.count K v
        (FractionalIdeal.spanSingleton (𝓞 K)⁰ (x : K)) = 0
SUnitGroup.divisorCoordinate_eq_zero_iff
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem divisorCoordinate_eq_zero_iff
    (x : SUnitGroup (K := K) S) (v : S) :
    divisorCoordinate (K := K) S x v = 0 ↔
      (v : HeightOneSpectrum (𝓞 K)).valuation K ((x : Kˣ) : K) = 1
SUnitGroup.divisorCoordinate_mul
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem divisorCoordinate_mul
    (x y : SUnitGroup (K := K) S) (v : S) :
    divisorCoordinate (K := K) S (x * y) v =
      divisorCoordinate (K := K) S x v +
        divisorCoordinate (K := K) S y v
SUnitGroup.divisorCoordinate_one
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem divisorCoordinate_one (v : S) :
    divisorCoordinate (K := K) S 1 v = 0
SUnitGroup.divisor

The additive principal-divisor map on S-units.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def divisor :
    Additive (SUnitGroup (K := K) S) →+
      (S → ℤ) where
  toFun x v := divisorCoordinate (K := K) S (Additive.toMul x) v
  map_zero' := by
    ext v
    exact divisorCoordinate_one (K := K) S v
  map_add' x y := by
    ext v
    exact divisorCoordinate_mul (K := K) S
      (Additive.toMul x) (Additive.toMul y) v
SUnitGroup.divisorLinearMap

The ℤ-linear principal-divisor map on S-units.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def divisorLinearMap :
    Additive (SUnitGroup (K := K) S) →ₗ[ℤ] (S → ℤ)
SUnitGroup.fromNumberFieldUnitsLinearMap

The additive linearization of the ordinary-unit embedding.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def fromNumberFieldUnitsLinearMap :
    Additive (𝓞 K)ˣ →ₗ[ℤ]
      Additive (SUnitGroup (K := K) S)
SUnitGroup.fromNumberFieldUnitsLinearMap_injective
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem fromNumberFieldUnitsLinearMap_injective :
    Function.Injective (fromNumberFieldUnitsLinearMap (K := K) S)
SUnitGroup.valuation_eq_one_of_mem_ker_divisorLinearMap

An S-unit in the kernel of the divisor map has valuation one at every finite place.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem valuation_eq_one_of_mem_ker_divisorLinearMap
    {x : Additive (SUnitGroup (K := K) S)}
    (hx : x ∈ LinearMap.ker (divisorLinearMap (K := K) S))
    (v : HeightOneSpectrum (𝓞 K)) :
    v.valuation K
      ((((Additive.toMul x :
        SUnitGroup (K := K) S) : Kˣ) : K)) = 1
SUnitGroup.kerDivisorToEmptySUnits

An S-unit in the divisor kernel, regarded as an S-unit for the empty set.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def kerDivisorToEmptySUnits
    (x : LinearMap.ker (divisorLinearMap (K := K) S)) :
    ((∅ : Set (HeightOneSpectrum (𝓞 K))).unit K)
SUnitGroup.range_fromNumberFieldUnitsLinearMap_eq_ker_divisorLinearMap

Ordinary units are exactly the kernel of the S-unit divisor map.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section DivisorMap
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem range_fromNumberFieldUnitsLinearMap_eq_ker_divisorLinearMap :
    LinearMap.range (fromNumberFieldUnitsLinearMap (K := K) S) =
      LinearMap.ker (divisorLinearMap (K := K) S)
SUnitGroup.primeIdealPower_classNumber_isPrincipal

The class-number power of a prime ideal is principal.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section PrimePowerSources
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem primeIdealPower_classNumber_isPrincipal (v : S) :
    ((v : HeightOneSpectrum (𝓞 K)).asIdeal ^
      NumberField.classNumber K).IsPrincipal
SUnitGroup.primePowerGenerator

A generator of the principal classNumber K-th power of a prime ideal.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section PrimePowerSources
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def primePowerGenerator (v : S) : 𝓞 K
SUnitGroup.span_primePowerGenerator
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section PrimePowerSources
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem span_primePowerGenerator (v : S) :
    Ideal.span {primePowerGenerator (K := K) S v} =
      (v : HeightOneSpectrum (𝓞 K)).asIdeal ^
        NumberField.classNumber K
SUnitGroup.primePowerGenerator_ne_zero
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section PrimePowerSources
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem primePowerGenerator_ne_zero (v : S) :
    primePowerGenerator (K := K) S v ≠ 0
SUnitGroup.spanSingleton_primePowerGenerator
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section PrimePowerSources
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem spanSingleton_primePowerGenerator (v : S) :
    FractionalIdeal.spanSingleton (𝓞 K)⁰
        (algebraMap (𝓞 K) K (primePowerGenerator (K := K) S v)) =
      ((v : HeightOneSpectrum (𝓞 K)).asIdeal :
        FractionalIdeal (𝓞 K)⁰ K) ^ NumberField.classNumber K
SUnitGroup.primePowerSUnit

An S-unit whose divisor is classNumber K times the basis divisor at v.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section PrimePowerSources
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def primePowerSUnit (v : S) :
    SUnitGroup (K := K) S
SUnitGroup.classNumberBasisVector
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section PrimePowerSources
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def classNumberBasisVector (v : S) : S → ℤ
SUnitGroup.divisorCoordinate_primePowerSUnit
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section PrimePowerSources
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem divisorCoordinate_primePowerSUnit
    (v w : S) :
    divisorCoordinate (K := K) S (primePowerSUnit (K := K) S v) w =
      classNumberBasisVector (K := K) S v w
SUnitGroup.divisorRangeVector
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section Rank
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
def divisorRangeVector (v : S) :
    LinearMap.range (divisorLinearMap (K := K) S)
SUnitGroup.divisorRangeVector_linearIndependent
Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section Rank
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem divisorRangeVector_linearIndependent :
    LinearIndependent ℤ (divisorRangeVector (K := K) S)
SUnitGroup.finrank_divisor_range

The divisor-map range on S-units has rank equal to the number of places in S.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section Rank
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem finrank_divisor_range :
    Module.finrank ℤ
        (LinearMap.range (divisorLinearMap (K := K) S)) =
      S.card
SUnitGroup.moduleFinite

The additive group of S-units is finitely generated over ℤ.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section Rank
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem moduleFinite :
    Module.Finite ℤ (Additive (SUnitGroup (K := K) S))
SUnitGroup.finrank_divisor_ker

The kernel of the S-unit divisor map has the ordinary unit rank.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section Rank
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem finrank_divisor_ker :
    Module.finrank ℤ
        (LinearMap.ker (divisorLinearMap (K := K) S)) =
      NumberField.Units.rank K
SUnitGroup.finrank

The free rank of the S-unit group is the ordinary Dirichlet rank plus the number of finite places in S.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section Rank
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem finrank :
    Module.finrank ℤ (Additive (SUnitGroup (K := K) S)) =
      NumberField.Units.rank K + S.card
SUnitGroup.finrank_modTorsion

The S-unit rank in quotient-by-torsion form.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section Rank
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem finrank_modTorsion :
    Module.finrank ℤ
        (Additive
          (SUnitGroup (K := K) S ⧸
            CommGroup.torsion (SUnitGroup (K := K) S))) =
      NumberField.Units.rank K + S.card
SUnitGroup.finrank_modTorsion_eq_card_infinitePlaces_add_card_sub_one

Cardinality form of the S-unit rank: #S_infinite + #S_finite - 1.

Source context 7 commands

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

noncomputable section
open IsDedekindDomain
open scoped NumberField nonZeroDivisors
variable {K : Type*} [Field K] [NumberField K]
namespace SUnitGroup
section Rank
variable (S : Finset (HeightOneSpectrum (𝓞 K)))
theorem finrank_modTorsion_eq_card_infinitePlaces_add_card_sub_one :
    Module.finrank ℤ
        (Additive
          (SUnitGroup (K := K) S ⧸
            CommGroup.torsion (SUnitGroup (K := K) S))) =
      Fintype.card (NumberField.InfinitePlace K) + S.card - 1