Skip to content

Commit ef6aea9

Browse files
committed
tidying up
1 parent 74da612 commit ef6aea9

File tree

1 file changed

+58
-40
lines changed

1 file changed

+58
-40
lines changed

FLT/MathlibExperiments/FrobeniusRiou.lean

+58-40
Original file line numberDiff line numberDiff line change
@@ -85,39 +85,44 @@ section normal_elements
8585
variable (K : Type*) [Field K] {L : Type*} [Field L] [Algebra K L]
8686

8787
open Polynomial
88-
-- Do we have this?
89-
def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
90-
91-
namespace IsNormalElement
92-
93-
theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
94-
IsNormalElement K x ↔
95-
∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
96-
constructor
97-
· intro h
98-
exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
99-
· rintro ⟨P, hPmonic, hPeval, hPsplits⟩
100-
-- need min poly divides P and then it should all be over
101-
sorry
102-
103-
theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
104-
(hx : IsNormalElement K x) (hy : IsNormalElement K y) :
105-
IsNormalElement K (x * y) := by
106-
rw [iff_exists_monic_splits K hxint] at hx
107-
obtain ⟨Px, hx1, hx2, hx3⟩ := hx
108-
rw [iff_exists_monic_splits K hyint] at hy
109-
obtain ⟨Py, hy1, hy2, hy3⟩ := hy
110-
rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
111-
-- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
112-
-- Do we have this?
113-
-- Is this even the best way to go about this?
114-
sorry
11588

116-
-- API
89+
-- I've commented out the next section because ACL suggested
90+
-- reading up-to-date Bourbaki here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/poly.20whose.20roots.20are.20the.20products.20of.20the.20roots.20of.20polys/near/468585267
91+
-- and apparently this will avoid the def below.
92+
93+
-- def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
94+
95+
-- namespace IsNormalElement
96+
97+
-- theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
98+
-- IsNormalElement K x ↔
99+
-- ∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
100+
-- constructor
101+
-- · intro h
102+
-- exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
103+
-- · rintro ⟨P, hPmonic, hPeval, hPsplits⟩
104+
-- -- need min poly divides P and then it should all be over
105+
-- sorry -- presumably some form of this is in the library
106+
107+
-- theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
108+
-- (hx : IsNormalElement K x) (hy : IsNormalElement K y) :
109+
-- IsNormalElement K (x * y) := by
110+
-- rw [iff_exists_monic_splits K hxint] at hx
111+
-- obtain ⟨Px, hx1, hx2, hx3⟩ := hx
112+
-- rw [iff_exists_monic_splits K hyint] at hy
113+
-- obtain ⟨Py, hy1, hy2, hy3⟩ := hy
114+
-- rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
115+
-- -- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
116+
-- -- Do we have this?
117+
-- -- Is this even the best way to go about this?
118+
-- -- Note: Chambert-Loir says there's a proof in Bourbaki
119+
-- sorry
117120

118-
end IsNormalElement
121+
-- -- API
119122

120-
end normal_elements
123+
-- end IsNormalElement
124+
125+
-- end normal_elements
121126

122127
section part_b
123128

@@ -208,8 +213,10 @@ private theorem F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
208213
private theorem F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
209214
let foo := Fintype.ofFinite G
210215
simp [F_spec, eval_prod]
211-
-- need eval finprod = finprod eval
216+
-- need eval finprod = finprod eval (missing?)
212217
-- then use `finprod_eq_zero _ (1 : G)`
218+
-- maths proof: evaluating the finite product at b clearly gives 0 because
219+
-- the term corresponding to τ=1 is 0
213220
sorry
214221

215222

@@ -256,23 +263,29 @@ theorem M_eval_eq_zero (b : B) : (M G hGalois b).eval₂ (algebraMap A[X] B[X])
256263
theorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]
257264
[CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]
258265
(h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := by
259-
-- ratio of two algebraic numbers is algebraic (follows from reciprocal of algebraic number
260-
-- is algebraic; proof is "reverse the min poly", don't know if we have it)
266+
-- ratio of two algebraic numbers is algebraic (follows from product of alg numbers is
267+
-- alg, which we surely have, and reciprocal of algebraic number
268+
-- is algebraic; proof of the latter is "reverse the min poly", don't know if we have it)
261269
sorry
262270

263271
-- (Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
264272
theorem part_b1 : Algebra.IsAlgebraic K L := by
265273
/-
266-
Because of `IsFractionRing (B ⧸ P) K` and the previous lemma it suffices to show that every
267-
element of B/P is algebraic over k, and this is because you can lift to b ∈ B and then
268-
use `M` above.
274+
Because of `IsFractionRing (B ⧸ Q) K` and the previous lemma it suffices to show that every
275+
element of B/Q is algebraic over k, and this is because you can lift to b ∈ B and then
276+
use `M` above (which needs to be coerced to A/P and then to K)
269277
-/
270278
sorry
271279

272280

273281

274282
theorem part_b2 : Normal K L := by
275283
/-
284+
285+
See discussion at
286+
https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/poly.20whose.20roots.20are.20the.20products.20of.20the.20roots.20of.20polys/near/468585267
287+
288+
Maybe I won't formalise the below proof then (which I made up):
276289
Let's temporarily say that an *element* of `K` is _normal_ if it is the root of a monic poly
277290
in `k[X]` all of whose roots are in `K`. Then `K/k` is normal iff all elements are normal
278291
(if `t` is a root of `P ∈ k[X]` then the min poly of `t` must divide `P`).
@@ -285,6 +298,10 @@ theorem part_b2 : Normal K L := by
285298

286299
open scoped Pointwise
287300

301+
-- Basic API for what we're doing here. Writing down a map from the stabiliser of Q to
302+
-- the residual Galois group `L ≃ₐ[K] L`, where L=Frac(B/Q) and K=Frac(A/P).
303+
-- Hopefully sorrys aren't too hard
304+
288305
def foo (g : G) (hg : g • Q = Q) : B ⧸ Q ≃+* B ⧸ Q :=
289306
Ideal.quotientEquiv Q Q (MulSemiringAction.toRingEquiv G B g) hg.symm
290307

@@ -311,9 +328,10 @@ theorem main_result : Function.Surjective
311328
sorry
312329

313330

314-
-- In Frobenius2.lean in this dir (Jou's FM24 project) there's a proof of this assuming B/Q is
315-
-- finite and P is maximal.
331+
-- In Frobenius2.lean in this dir (Jou's FM24 project) there's a proof of surjectivity
332+
-- assuming B/Q is finite and P is maximal.
316333
-- Bourbaki reduce to maximal case by localizing at P, and use finite + separable = simple
317-
-- on the max separable subextension, but then the argument follows Jou's formalisation
318-
-- in Frobenius2.lean in this directory.
334+
-- on the max separable subextension, but then the argument in Bourbaki closely
335+
-- follows Jou's formalisation in Frobenius2.lean in this directory, so this work will
336+
-- be useful later.
319337
end part_b

0 commit comments

Comments
 (0)