Skip to content

Commit fd68cd6

Browse files
committed
chore(FunctionField): rename vars when constant field is not nec. finite (#37894)
Asked by @MichaelStollBayreuth [here](#37447 (comment)). I've also slightly adjusted the doc to reflect this. I used the notation which I know from Rosen - Number Theory in Function Field. Co-authored-by: Xavier Genereux <xaviergenereux@hotmail.com>
1 parent ab80b70 commit fd68cd6

File tree

1 file changed

+103
-103
lines changed

1 file changed

+103
-103
lines changed

Mathlib/NumberTheory/FunctionField.lean

Lines changed: 103 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@ This file defines a function field and the ring of integers corresponding to it.
1818
1919
## Main definitions
2020
21-
- `FunctionField Fq F` states that `F` is a function field over the (finite) field `Fq`,
22-
i.e. it is a finite extension of the field of rational functions in one variable over `Fq`.
21+
- `FunctionField F K` states that `K` is a function field over the field `F`,
22+
i.e. it is a finite extension of the field of rational functions in one variable over `F`.
2323
- `FunctionField.ringOfIntegers` defines the ring of integers corresponding to a function field
24-
as the integral closure of `Fq[X]` in the function field.
25-
- `FunctionField.inftyValuation` : The place at infinity on `Fq(t)` is the nonarchimedean
26-
valuation on `Fq(t)` with uniformizer `1/t`.
27-
- `FunctionField.FqtInfty` : The completion `Fq((t⁻¹))` of `Fq(t)` with respect to the
24+
as the integral closure of `F[X]` in the function field.
25+
- `FunctionField.inftyValuation` : The place at infinity on `F(t)` is the nonarchimedean
26+
valuation on `F(t)` with uniformizer `1/t`.
27+
- `FunctionField.FqtInfty` : The completion `F((t⁻¹))` of `F(t)` with respect to the
2828
valuation at infinity.
2929
3030
## Implementation notes
3131
The definitions that involve a field of fractions choose a canonical field of fractions,
32-
but are independent of that choice. We also omit assumptions like `Finite Fq` or
33-
`IsScalarTower Fq[X] (FractionRing Fq[X]) F` in definitions,
32+
but are independent of that choice. We also omit assumptions like
33+
`IsScalarTower F[X] (FractionRing F[X]) K` in definitions,
3434
adding them back in lemmas when they are needed.
3535
3636
## References
@@ -49,189 +49,189 @@ noncomputable section
4949

5050
open scoped nonZeroDivisors Polynomial WithZero
5151

52-
variable (Fq F : Type*) [Field Fq] [Field F]
52+
variable (F K : Type*) [Field F] [Field K]
5353

54-
/-- `F` is a function field over the finite field `Fq` if it is a finite
55-
extension of the field of rational functions in one variable over `Fq`.
54+
/-- `K` is a function field over the field `F` if it is a finite
55+
extension of the field of rational functions in one variable over `F`.
5656
57-
Note that `F` can be a function field over multiple, non-isomorphic, `Fq`.
57+
Note that `K` can be a function field over multiple, non-isomorphic, `F`.
5858
-/
59-
abbrev FunctionField [Algebra (RatFunc Fq) F] : Prop :=
60-
FiniteDimensional (RatFunc Fq) F
61-
62-
/-- `F` is a function field over `Fq` iff it is a finite extension of `Fq(t)`. -/
63-
theorem functionField_iff (Fqt : Type*) [Field Fqt] [Algebra Fq[X] Fqt]
64-
[IsFractionRing Fq[X] Fqt] [Algebra (RatFunc Fq) F] [Algebra Fqt F] [Algebra Fq[X] F]
65-
[IsScalarTower Fq[X] Fqt F] [IsScalarTower Fq[X] (RatFunc Fq) F] :
66-
FunctionField Fq F ↔ FiniteDimensional Fqt F := by
67-
let e := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
68-
have : ∀ (c) (x : F), e c • x = c • x := by
59+
abbrev FunctionField [Algebra (RatFunc F) K] : Prop :=
60+
FiniteDimensional (RatFunc F) K
61+
62+
/-- `K` is a function field over `F` iff it is a finite extension of `F(t)`. -/
63+
theorem functionField_iff (Ft : Type*) [Field Ft] [Algebra F[X] Ft]
64+
[IsFractionRing F[X] Ft] [Algebra (RatFunc F) K] [Algebra Ft K] [Algebra F[X] K]
65+
[IsScalarTower F[X] Ft K] [IsScalarTower F[X] (RatFunc F) K] :
66+
FunctionField F K ↔ FiniteDimensional Ft K := by
67+
let e := IsLocalization.algEquiv F[X]⁰ (RatFunc F) Ft
68+
have : ∀ (c) (x : K), e c • x = c • x := by
6969
intro c x
7070
rw [Algebra.smul_def, Algebra.smul_def]
7171
congr
72-
refine congr_fun (f := fun c => algebraMap Fqt F (e c)) ?_ c
73-
refine IsLocalization.ext (nonZeroDivisors Fq[X]) _ _ ?_ ?_ ?_ ?_ ?_ <;> intros <;>
72+
refine congr_fun (f := fun c => algebraMap Ft K (e c)) ?_ c
73+
refine IsLocalization.ext (nonZeroDivisors F[X]) _ _ ?_ ?_ ?_ ?_ ?_ <;> intros <;>
7474
simp only [map_one, map_mul, AlgEquiv.commutes, ← IsScalarTower.algebraMap_apply]
7575
constructor <;> intro h
76-
· let b := Module.finBasis (RatFunc Fq) F
76+
· let b := Module.finBasis (RatFunc F) K
7777
exact (b.mapCoeffs e this).finiteDimensional_of_finite
78-
· let b := Module.finBasis Fqt F
78+
· let b := Module.finBasis Ft K
7979
refine (b.mapCoeffs e.symm ?_).finiteDimensional_of_finite
8080
intro c x; convert (this (e.symm c) x).symm; simp only [e.apply_symm_apply]
8181

8282
namespace FunctionField
8383

84-
theorem algebraMap_injective [Algebra Fq[X] F] [Algebra (RatFunc Fq) F]
85-
[IsScalarTower Fq[X] (RatFunc Fq) F] : Function.Injective (⇑(algebraMap Fq[X] F)) := by
86-
rw [IsScalarTower.algebraMap_eq Fq[X] (RatFunc Fq) F]
87-
exact (algebraMap (RatFunc Fq) F).injective.comp (IsFractionRing.injective Fq[X] (RatFunc Fq))
84+
theorem algebraMap_injective [Algebra F[X] K] [Algebra (RatFunc F) K]
85+
[IsScalarTower F[X] (RatFunc F) K] : Function.Injective (⇑(algebraMap F[X] K)) := by
86+
rw [IsScalarTower.algebraMap_eq F[X] (RatFunc F) K]
87+
exact (algebraMap (RatFunc F) K).injective.comp (IsFractionRing.injective F[X] (RatFunc F))
8888

8989
/-- The function field analogue of `NumberField.ringOfIntegers`:
90-
`FunctionField.ringOfIntegers Fq Fqt F` is the integral closure of `Fq[t]` in `F`.
90+
`FunctionField.ringOfIntegers F K` is the integral closure of `F[X]` in `K`.
9191
92-
We don't actually assume `F` is a function field over `Fq` in the definition,
92+
We don't actually assume `K` is a function field over `F` in the definition,
9393
only when proving its properties.
9494
-/
95-
def ringOfIntegers [Algebra Fq[X] F] :=
96-
integralClosure Fq[X] F
95+
def ringOfIntegers [Algebra F[X] K] :=
96+
integralClosure F[X] K
9797

9898
namespace ringOfIntegers
9999

100-
variable [Algebra Fq[X] F]
100+
variable [Algebra F[X] K]
101101

102-
instance : IsDomain (ringOfIntegers Fq F) :=
103-
(ringOfIntegers Fq F).isDomain
102+
instance : IsDomain (ringOfIntegers F K) :=
103+
(ringOfIntegers F K).isDomain
104104

105-
instance : IsIntegralClosure (ringOfIntegers Fq F) Fq[X] F :=
105+
instance : IsIntegralClosure (ringOfIntegers F K) F[X] K :=
106106
integralClosure.isIntegralClosure _ _
107107

108-
variable [Algebra (RatFunc Fq) F] [IsScalarTower Fq[X] (RatFunc Fq) F]
108+
variable [Algebra (RatFunc F) K] [IsScalarTower F[X] (RatFunc F) K]
109109

110-
theorem algebraMap_injective : Function.Injective (⇑(algebraMap Fq[X] (ringOfIntegers Fq F))) := by
111-
have hinj : Function.Injective (⇑(algebraMap Fq[X] F)) := by
112-
rw [IsScalarTower.algebraMap_eq Fq[X] (RatFunc Fq) F]
113-
exact (algebraMap (RatFunc Fq) F).injective.comp (IsFractionRing.injective Fq[X] (RatFunc Fq))
114-
rw [injective_iff_map_eq_zero (algebraMap Fq[X] (↥(ringOfIntegers Fq F)))]
110+
theorem algebraMap_injective : Function.Injective (⇑(algebraMap F[X] (ringOfIntegers F K))) := by
111+
have hinj : Function.Injective (⇑(algebraMap F[X] K)) := by
112+
rw [IsScalarTower.algebraMap_eq F[X] (RatFunc F) K]
113+
exact (algebraMap (RatFunc F) K).injective.comp (IsFractionRing.injective F[X] (RatFunc F))
114+
rw [injective_iff_map_eq_zero (algebraMap F[X] (↥(ringOfIntegers F K)))]
115115
intro p hp
116116
rw [← Subtype.coe_inj, Subalgebra.coe_zero] at hp
117-
rw [injective_iff_map_eq_zero (algebraMap Fq[X] F)] at hinj
117+
rw [injective_iff_map_eq_zero (algebraMap F[X] K)] at hinj
118118
exact hinj p hp
119119

120-
theorem not_isField : ¬IsField (ringOfIntegers Fq F) := by
121-
simpa [← (IsIntegralClosure.isIntegral_algebra Fq[X] F).isField_iff_isField
122-
(algebraMap_injective Fq F)] using
123-
Polynomial.not_isField Fq
120+
theorem not_isField : ¬IsField (ringOfIntegers F K) := by
121+
simpa [← (IsIntegralClosure.isIntegral_algebra F[X] K).isField_iff_isField
122+
(algebraMap_injective F K)] using
123+
Polynomial.not_isField F
124124

125-
variable [FunctionField Fq F]
125+
variable [FunctionField F K]
126126

127-
instance : IsFractionRing (ringOfIntegers Fq F) F :=
128-
integralClosure.isFractionRing_of_finite_extension (RatFunc Fq) F
127+
instance : IsFractionRing (ringOfIntegers F K) K :=
128+
integralClosure.isFractionRing_of_finite_extension (RatFunc F) K
129129

130-
instance : IsIntegrallyClosed (ringOfIntegers Fq F) :=
131-
integralClosure.isIntegrallyClosedOfFiniteExtension (RatFunc Fq)
130+
instance : IsIntegrallyClosed (ringOfIntegers F K) :=
131+
integralClosure.isIntegrallyClosedOfFiniteExtension (RatFunc F)
132132

133-
instance [Algebra.IsSeparable (RatFunc Fq) F] : IsNoetherian Fq[X] (ringOfIntegers Fq F) :=
134-
IsIntegralClosure.isNoetherian _ (RatFunc Fq) F _
133+
instance [Algebra.IsSeparable (RatFunc F) K] : IsNoetherian F[X] (ringOfIntegers F K) :=
134+
IsIntegralClosure.isNoetherian _ (RatFunc F) K _
135135

136-
instance [Algebra.IsSeparable (RatFunc Fq) F] : IsDedekindDomain (ringOfIntegers Fq F) :=
137-
IsIntegralClosure.isDedekindDomain Fq[X] (RatFunc Fq) F _
136+
instance [Algebra.IsSeparable (RatFunc F) K] : IsDedekindDomain (ringOfIntegers F K) :=
137+
IsIntegralClosure.isDedekindDomain F[X] (RatFunc F) K _
138138

139139
end ringOfIntegers
140140

141-
/-! ### The place at infinity on Fq(t) -/
141+
/-! ### The place at infinity on F(t) -/
142142

143143

144144
section InftyValuation
145145

146146
open Multiplicative WithZero
147147

148-
variable [DecidableEq (RatFunc Fq)]
148+
variable [DecidableEq (RatFunc F)]
149149

150-
/-- The valuation at infinity is the nonarchimedean valuation on `Fq(t)` with uniformizer `1/t`.
151-
Explicitly, if `f/g ∈ Fq(t)` is a nonzero quotient of polynomials, its valuation at infinity is
150+
/-- The valuation at infinity is the nonarchimedean valuation on `F(t)` with uniformizer `1/t`.
151+
Explicitly, if `f/g ∈ F(t)` is a nonzero quotient of polynomials, its valuation at infinity is
152152
`exp (degree(f) - degree(g))`. -/
153-
def inftyValuationDef (r : RatFunc Fq) : ℤᵐ⁰ :=
153+
def inftyValuationDef (r : RatFunc F) : ℤᵐ⁰ :=
154154
if r = 0 then 0 else exp r.intDegree
155155

156-
theorem InftyValuation.map_zero' : inftyValuationDef Fq 0 = 0 :=
156+
theorem InftyValuation.map_zero' : inftyValuationDef F 0 = 0 :=
157157
if_pos rfl
158158

159-
theorem InftyValuation.map_one' : inftyValuationDef Fq 1 = 1 :=
159+
theorem InftyValuation.map_one' : inftyValuationDef F 1 = 1 :=
160160
(if_neg one_ne_zero).trans <| by simp
161161

162-
theorem InftyValuation.map_mul' (x y : RatFunc Fq) :
163-
inftyValuationDef Fq (x * y) = inftyValuationDef Fq x * inftyValuationDef Fq y := by
162+
theorem InftyValuation.map_mul' (x y : RatFunc F) :
163+
inftyValuationDef F (x * y) = inftyValuationDef F x * inftyValuationDef F y := by
164164
rw [inftyValuationDef, inftyValuationDef, inftyValuationDef]
165165
by_cases hx : x = 0
166166
· rw [hx, zero_mul, if_pos (Eq.refl _), zero_mul]
167167
· by_cases hy : y = 0
168168
· rw [hy, mul_zero, if_pos (Eq.refl _), mul_zero]
169169
· simp_all [RatFunc.intDegree_mul]
170170

171-
theorem InftyValuation.map_add_le_max' (x y : RatFunc Fq) :
172-
inftyValuationDef Fq (x + y) ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y) := by
171+
theorem InftyValuation.map_add_le_max' (x y : RatFunc F) :
172+
inftyValuationDef F (x + y) ≤ max (inftyValuationDef F x) (inftyValuationDef F y) := by
173173
by_cases hx : x = 0
174174
· rw [hx, zero_add]
175175
conv_rhs => rw [inftyValuationDef, if_pos (Eq.refl _)]
176-
rw [max_eq_right (WithZero.zero_le (inftyValuationDef Fq y))]
176+
rw [max_eq_right (WithZero.zero_le (inftyValuationDef F y))]
177177
· by_cases hy : y = 0
178178
· rw [hy, add_zero]
179179
conv_rhs => rw [max_comm, inftyValuationDef, if_pos (Eq.refl _)]
180-
rw [max_eq_right (WithZero.zero_le (inftyValuationDef Fq x))]
180+
rw [max_eq_right (WithZero.zero_le (inftyValuationDef F x))]
181181
· by_cases hxy : x + y = 0
182182
· rw [inftyValuationDef, if_pos hxy]; exact zero_le'
183183
· rw [inftyValuationDef, inftyValuationDef, inftyValuationDef, if_neg hx, if_neg hy,
184184
if_neg hxy]
185185
simpa using RatFunc.intDegree_add_le hy hxy
186186

187187
@[simp]
188-
theorem inftyValuation_of_nonzero {x : RatFunc Fq} (hx : x ≠ 0) :
189-
inftyValuationDef Fq x = exp x.intDegree := by
188+
theorem inftyValuation_of_nonzero {x : RatFunc F} (hx : x ≠ 0) :
189+
inftyValuationDef F x = exp x.intDegree := by
190190
rw [inftyValuationDef, if_neg hx]
191191

192-
/-- The valuation at infinity on `Fq(t)`. -/
193-
def inftyValuation : Valuation (RatFunc Fq) ℤᵐ⁰ where
194-
toFun := inftyValuationDef Fq
195-
map_zero' := InftyValuation.map_zero' Fq
196-
map_one' := InftyValuation.map_one' Fq
197-
map_mul' := InftyValuation.map_mul' Fq
198-
map_add_le_max' := InftyValuation.map_add_le_max' Fq
192+
/-- The valuation at infinity on `F(t)`. -/
193+
def inftyValuation : Valuation (RatFunc F) ℤᵐ⁰ where
194+
toFun := inftyValuationDef F
195+
map_zero' := InftyValuation.map_zero' F
196+
map_one' := InftyValuation.map_one' F
197+
map_mul' := InftyValuation.map_mul' F
198+
map_add_le_max' := InftyValuation.map_add_le_max' F
199199

200-
theorem inftyValuation_apply {x : RatFunc Fq} : inftyValuation Fq x = inftyValuationDef Fq x :=
200+
theorem inftyValuation_apply {x : RatFunc F} : inftyValuation F x = inftyValuationDef F x :=
201201
rfl
202202

203203
@[simp]
204-
theorem inftyValuation.C {k : Fq} (hk : k ≠ 0) :
205-
inftyValuation Fq (RatFunc.C k) = 1 := by
204+
theorem inftyValuation.C {k : F} (hk : k ≠ 0) :
205+
inftyValuation F (RatFunc.C k) = 1 := by
206206
simp [inftyValuation_apply, hk]
207207

208208
@[simp]
209-
theorem inftyValuation.X : inftyValuation Fq RatFunc.X = exp 1 := by
209+
theorem inftyValuation.X : inftyValuation F RatFunc.X = exp 1 := by
210210
simp [inftyValuation_apply, inftyValuationDef, if_neg RatFunc.X_ne_zero, RatFunc.intDegree_X]
211211

212-
lemma inftyValuation.X_zpow (m : ℤ) : inftyValuation Fq (RatFunc.X ^ m) = exp m := by simp
212+
lemma inftyValuation.X_zpow (m : ℤ) : inftyValuation F (RatFunc.X ^ m) = exp m := by simp
213213

214-
theorem inftyValuation.X_inv : inftyValuation Fq (1 / RatFunc.X) = exp (-1) := by
214+
theorem inftyValuation.X_inv : inftyValuation F (1 / RatFunc.X) = exp (-1) := by
215215
rw [one_div, ← zpow_neg_one, inftyValuation.X_zpow]
216216

217217
-- Dropped attribute `@[simp]` due to issue described here:
218218
-- https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/.60synthInstance.2EmaxHeartbeats.60.20error.20but.20only.20in.20.60simpNF.60
219-
theorem inftyValuation.polynomial {p : Fq[X]} (hp : p ≠ 0) :
220-
inftyValuationDef Fq (algebraMap Fq[X] (RatFunc Fq) p) = exp (p.natDegree : ℤ) := by
219+
theorem inftyValuation.polynomial {p : F[X]} (hp : p ≠ 0) :
220+
inftyValuationDef F (algebraMap F[X] (RatFunc F) p) = exp (p.natDegree : ℤ) := by
221221
rw [inftyValuationDef, if_neg (by simpa), RatFunc.intDegree_polynomial]
222222

223-
instance : Valuation.IsNontrivial (inftyValuation Fq) := ⟨RatFunc.X, by simp⟩
223+
instance : Valuation.IsNontrivial (inftyValuation F) := ⟨RatFunc.X, by simp⟩
224224

225-
instance : Valuation.IsTrivialOn Fq (inftyValuation Fq) :=
225+
instance : Valuation.IsTrivialOn F (inftyValuation F) :=
226226
fun _ hx ↦ by simp [inftyValuation.C _ hx]⟩
227227

228-
/-- The valued field `Fq(t)` with the valuation at infinity. -/
228+
/-- The valued field `F(t)` with the valuation at infinity. -/
229229
@[implicit_reducible]
230-
def inftyValuedFqt : Valued (RatFunc Fq) ℤᵐ⁰ :=
231-
Valued.mk' <| inftyValuation Fq
230+
def inftyValuedFqt : Valued (RatFunc F) ℤᵐ⁰ :=
231+
Valued.mk' <| inftyValuation F
232232

233-
theorem inftyValuedFqt.def {x : RatFunc Fq} :
234-
(inftyValuedFqt Fq).v x = inftyValuationDef Fq x :=
233+
theorem inftyValuedFqt.def {x : RatFunc F} :
234+
(inftyValuedFqt F).v x = inftyValuationDef F x :=
235235
rfl
236236

237237
namespace FqtInfty
@@ -242,20 +242,20 @@ attribute [-instance] RatFunc.valuedRatFunc
242242

243243
/- Locally add the uniform space structure coming from the valuation at infinity. This instance
244244
is scoped in the `FqtInfty` namescape in case it is needed in the future. -/
245-
/-- The uniform space structure on `RatFunc Fq` coming from the valuation at infinity. -/
246-
scoped instance : UniformSpace (RatFunc Fq) := (inftyValuedFqt Fq).toUniformSpace
245+
/-- The uniform space structure on `RatFunc F` coming from the valuation at infinity. -/
246+
scoped instance : UniformSpace (RatFunc F) := (inftyValuedFqt F).toUniformSpace
247247

248-
/-- The completion `Fq((t⁻¹))` of `Fq(t)` with respect to the valuation at infinity. -/
249-
def _root_.FunctionField.FqtInfty := UniformSpace.Completion (RatFunc Fq)
250-
deriving Field, Algebra (RatFunc Fq), Coe (RatFunc Fq), Inhabited
248+
/-- The completion `F((t⁻¹))` of `F(t)` with respect to the valuation at infinity. -/
249+
def _root_.FunctionField.FqtInfty := UniformSpace.Completion (RatFunc F)
250+
deriving Field, Algebra (RatFunc F), Coe (RatFunc F), Inhabited
251251

252252
end FqtInfty
253253

254254
/-- The valuation at infinity on `k(t)` extends to a valuation on `FqtInfty`. -/
255-
instance valuedFqtInfty : Valued (FqtInfty Fq) ℤᵐ⁰ := (inftyValuedFqt Fq).valuedCompletion
255+
instance valuedFqtInfty : Valued (FqtInfty F) ℤᵐ⁰ := (inftyValuedFqt F).valuedCompletion
256256

257-
theorem valuedFqtInfty.def {x : FqtInfty Fq} :
258-
Valued.v x = (inftyValuedFqt Fq).extensionValuation x := rfl
257+
theorem valuedFqtInfty.def {x : FqtInfty F} :
258+
Valued.v x = (inftyValuedFqt F).extensionValuation x := rfl
259259

260260
end InftyValuation
261261

0 commit comments

Comments
 (0)