@@ -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
3131The 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,
3434adding them back in lemmas when they are needed.
3535
3636## References
@@ -49,189 +49,189 @@ noncomputable section
4949
5050open 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
8282namespace 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,
9393only 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
9898namespace 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
139139end ringOfIntegers
140140
141- /-! ### The place at infinity on Fq (t) -/
141+ /-! ### The place at infinity on F (t) -/
142142
143143
144144section InftyValuation
145145
146146open 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
237237namespace 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
244244is 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
252252end 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
260260end InftyValuation
261261
0 commit comments