Skip to content

Commit ab9003c

Browse files
committed
Begin to generalise Frobenius argument to Bourbaki's version
1 parent 842e6b1 commit ab9003c

File tree

1 file changed

+290
-0
lines changed

1 file changed

+290
-0
lines changed
+290
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
-- Frobenius elements following Joel Riou's idea to use a very general lemma
2+
-- from Bourbaki comm alg
3+
-- (Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
4+
-- (see https://leanprover.zulipchat.com/#narrow/stream/416277-FLT/topic/Outstanding.20Tasks.2C.20V4/near/449562398)
5+
6+
7+
import Mathlib.RingTheory.Ideal.Pointwise
8+
import Mathlib.RingTheory.Ideal.Over
9+
import Mathlib.FieldTheory.Normal
10+
11+
variable {A : Type*} [CommRing A]
12+
{B : Type*} [CommRing B] [Algebra A B] [Algebra.IsIntegral A B]
13+
{G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
14+
15+
open scoped algebraMap
16+
17+
variable (hGalois : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)
18+
19+
section part_a
20+
21+
variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
22+
(hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
23+
24+
open scoped Pointwise
25+
26+
private lemma norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc
27+
g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := sorry -- this is `smul_finprod` after we bump mathlib
28+
_ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
29+
fun x ↦ smul_smul g x b
30+
31+
theorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]
32+
(I : Ideal S) [hI : I.IsPrime] (f : R → S) :
33+
∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := by
34+
have := Fintype.ofFinite R
35+
rw [finprod_eq_prod_of_fintype, Finset.prod_eq_multiset_prod, hI.multiset_prod_mem_iff_exists_mem]
36+
simp
37+
38+
-- (Part a of Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
39+
theorem part_a
40+
(hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
41+
(hGalois : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a) :
42+
∃ g : G, Q = g • P := by
43+
cases nonempty_fintype G
44+
suffices ∃ g : G, Q ≤ g • P by
45+
obtain ⟨g, hg⟩ := this
46+
use g
47+
by_contra! hQ
48+
have : Q < g • P := lt_of_le_of_ne hg hQ
49+
obtain ⟨x, hxP, hxQ⟩ := Set.exists_of_ssubset <| this
50+
apply (Ideal.comap_lt_comap_of_integral_mem_sdiff (R := A) hg ⟨hxP, hxQ⟩ <|
51+
Algebra.isIntegral_def.1 inferInstance x).ne
52+
rw [← hPQ]
53+
ext x
54+
specialize hGalois (algebraMap A B x)
55+
have := hGalois.2 ⟨x, rfl⟩
56+
simp only [Ideal.mem_comap]
57+
nth_rw 2 [← this]
58+
exact Ideal.smul_mem_pointwise_smul_iff.symm
59+
suffices ∃ g ∈ (⊤ : Finset G), Q ≤ g • P by
60+
convert this; simp
61+
rw [← Ideal.subset_union_prime 1 1 <| fun g _ _ _ ↦ ?_]; swap
62+
· exact Ideal.map_isPrime_of_equiv (MulSemiringAction.toRingEquiv _ _ g)
63+
intro x hx
64+
specialize hGalois (∏ᶠ σ : G, σ • x)
65+
obtain ⟨a, ha⟩ := hGalois.1 (norm_fixed _)
66+
have : (a : B) ∈ Q := by
67+
rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem]
68+
use 1
69+
simpa using hx
70+
have : (a : B) ∈ P := by
71+
unfold Algebra.cast
72+
rwa [← Ideal.mem_comap, hPQ, Ideal.mem_comap]
73+
rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem] at this
74+
obtain ⟨σ, hσ⟩ : ∃ σ : G, σ • x ∈ P := this
75+
simp only [Finset.top_eq_univ, Finset.coe_univ, Set.mem_univ, Set.iUnion_true, Set.mem_iUnion,
76+
SetLike.mem_coe]
77+
use σ⁻¹
78+
rwa [Ideal.mem_inv_pointwise_smul_iff]
79+
80+
end part_a
81+
82+
section normal_elements
83+
84+
variable (K : Type*) [Field K] {L : Type*} [Field L] [Algebra K L]
85+
86+
open Polynomial
87+
-- Do we have this?
88+
def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
89+
90+
namespace IsNormalElement
91+
92+
lemma iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
93+
IsNormalElement K x ↔
94+
∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
95+
constructor
96+
· intro h
97+
exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
98+
· rintro ⟨P, hPmonic, hPeval, hPsplits⟩
99+
-- need min poly divides P and then it should all be over
100+
sorry
101+
102+
lemma prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
103+
(hx : IsNormalElement K x) (hy : IsNormalElement K y) :
104+
IsNormalElement K (x * y) := by
105+
rw [iff_exists_monic_splits K hxint] at hx
106+
obtain ⟨Px, hx1, hx2, hx3⟩ := hx
107+
rw [iff_exists_monic_splits K hyint] at hy
108+
obtain ⟨Py, hy1, hy2, hy3⟩ := hy
109+
rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
110+
-- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
111+
-- Do we have this? Is it the resultant or something?
112+
sorry
113+
114+
-- API
115+
116+
end IsNormalElement
117+
118+
end normal_elements
119+
120+
section part_b
121+
122+
-- set-up for part (b) of the lemma. G acts on B with invariants A (or more precisely the
123+
-- image of A). Warning: `P` was a prime ideal of `B` in part (a) but it's a prime ideal
124+
-- of `A` here, in fact it's Q ∩ A, the preimage of Q in A.
125+
126+
/-
127+
All I want to say is:
128+
129+
B ---> B / Q -----> L = Frac(B/Q)
130+
/\ /\ /\
131+
| | |
132+
| | |
133+
A ---> A / P ----> K = Frac(A/P)
134+
135+
-/
136+
variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
137+
--#synth Algebra A (B ⧸ Q) #exit -- works
138+
--#synth IsScalarTower A B (B ⧸ Q) #exit-- works
139+
-- (hPQ : Ideal.comap (algebraMap A B) P = p) -- we will *prove* this from the
140+
-- commutativity of the diagram! This is a trick I learnt from Jou who apparently
141+
-- learnt it from Amelia
142+
[Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)]
143+
-- So now we know the left square commutes.
144+
-- Amelia's trick: commutativity of this diagram implies P ⊇ Q ∩ A
145+
-- And the fact that K and L are fields implies A / P -> B / Q is injective
146+
-- and thus P = Q ∩ A
147+
-- Let's now make the right square. First `L`
148+
(L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]
149+
-- Now top left triangle: A / P → B / Q → L commutes
150+
[Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
151+
-- now introduce K
152+
(K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
153+
-- now make bottom triangle commute
154+
[Algebra K L] [IsScalarTower (A ⧸ P) K L]
155+
-- So now both squares commute.
156+
157+
-- do I need this?
158+
-- [Algebra A K] [IsScalarTower A (A ⧸ P) K]
159+
160+
-- Do I need this:
161+
-- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]
162+
163+
lemma Ideal.Quotient.eq_zero_iff_mem' (x : A) :
164+
algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
165+
Ideal.Quotient.eq_zero_iff_mem
166+
167+
-- not sure if we need this but let's prove it just to check our setup is OK
168+
open IsScalarTower in
169+
example : --[Algebra A k] [IsScalarTower A (A ⧸ p) k] [Algebra k K] [IsScalarTower (A ⧸ p) k K]
170+
--[Algebra A K] [IsScalarTower A k K] :
171+
Ideal.comap (algebraMap A B) Q = P := by
172+
ext x
173+
simp only [Ideal.mem_comap]
174+
rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']
175+
rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]
176+
rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]
177+
rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]
178+
rw [← algebraMap_apply A B (B ⧸ Q), algebraMap_apply A (A ⧸ P) (B ⧸ Q)]
179+
rw [← algebraMap_apply (A ⧸ P) K L, algebraMap_apply (A ⧸ P) (B ⧸ Q) L]
180+
181+
open Polynomial BigOperators
182+
183+
variable (G) in
184+
/-- `F : B[X]` defined to be a product of linear factors `(X - τ • α)`; where
185+
`τ` runs over `L ≃ₐ[K] L`, and `α : B` is an element which generates `(B ⧸ Q)ˣ`
186+
and lies in `τ • Q` for all `τ ∉ (decomposition_subgroup_Ideal' A K L B Q)`.-/
187+
private noncomputable abbrev F (b : B) : B[X] := ∏ᶠ τ : G, (X - C (τ • b))
188+
189+
private lemma F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
190+
191+
private lemma F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
192+
σ • F G b = σ • ∏ᶠ τ : G, (X - C (τ • b)) := by rfl
193+
_ = ∏ᶠ τ : G, σ • (X - C (τ • b)) := sorry -- smul_prod for finprod
194+
_ = ∏ᶠ τ : G, (X - C ((σ * τ) • b)) := by simp [smul_sub, smul_smul]; congr; ext t; congr 2; sorry -- is this missing??
195+
_ = ∏ᶠ τ' : G, (X - C (τ' • b)) := sorry -- Finite.finprod_bijective (fun τ ↦ σ * τ)
196+
-- (Group.mulLeft_bijective σ) _ _ (fun _ ↦ rfl)
197+
_ = F G b := by rw [F_spec]
198+
199+
private lemma F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
200+
simp [F_spec, eval_prod]; sorry -- missing lemma? Finprod.prod_eq_zero (Finset.mem_univ (1 : G))]
201+
202+
open scoped algebraMap
203+
204+
noncomputable local instance : Algebra A[X] B[X] :=
205+
RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
206+
207+
-- PR?
208+
@[simp, norm_cast]
209+
lemma coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
210+
map_monomial _
211+
212+
private lemma F_descent (hGalois : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a) (b : B) :
213+
∃ M : A[X], (M : B[X]) = F G b := by
214+
choose f hf using fun b ↦ (hGalois b).mp
215+
classical
216+
let f' : B → A := fun b ↦ if h : ∀ σ : G, σ • b = b then f b h else 37
217+
use (∑ x ∈ (F G b).support, (monomial x) (f' ((F G b).coeff x)))
218+
ext N
219+
push_cast
220+
simp_rw [finset_sum_coeff, ← lcoeff_apply, lcoeff_apply, coeff_monomial]
221+
simp only [Finset.sum_ite_eq', mem_support_iff, ne_eq, ite_not, f']
222+
symm
223+
split
224+
· next h => exact h
225+
· next h1 =>
226+
rw [dif_pos <| fun σ ↦ ?_]
227+
· refine hf ?_ ?_
228+
· nth_rw 2 [← F_smul_eq_self σ]
229+
rfl
230+
231+
variable (G) in
232+
noncomputable def M (b : B) : A[X] := (F_descent hGalois b).choose
233+
234+
lemma M_spec (b : B) : ((M G hGalois b : A[X]) : B[X]) = F G b := (F_descent hGalois b).choose_spec
235+
236+
lemma M_eval_eq_zero (b : B) : (M G hGalois b).eval₂ (algebraMap A[X] B[X]) b = 0 := by
237+
sorry -- follows from `F_eval_eq_zero`
238+
239+
lemma Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]
240+
[CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]
241+
(h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := by
242+
-- ratio of two algebraic numbers is algebraic (follows from reciprocal of algebraic number
243+
-- is algebraic; proof is "reverse the min poly")
244+
sorry
245+
246+
-- (Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
247+
theorem part_b1 : Algebra.IsAlgebraic K L := by
248+
/-
249+
Because of `IsFractionRing (B ⧸ P) K` and the previous lemma it suffices to show that every
250+
element of B/P is algebraic over k, and this is because you can lift to b ∈ B and then
251+
use `M` above.
252+
-/
253+
sorry
254+
255+
256+
257+
theorem part_b2 : Normal K L := by
258+
/-
259+
Let's temporarily say that an *element* of `K` is _normal_ if it is the root of a monic poly
260+
in `k[X]` all of whose roots are in `K`. Then `K/k` is normal iff all elements are normal
261+
(if `t` is a root of `P ∈ k[X]` then the min poly of `t` must divide `P`).
262+
I claim that the product of two normal elements is normal. Indeed if `P` and `Q` are monic polys
263+
in `k[X]` with roots `xᵢ` and `yⱼ` then there's another monic poly in `k[X]` whose roots are
264+
the products `xᵢyⱼ`. Also the reciprocal of a nonzero normal element is normal (reverse the
265+
polynomial and take the reciprocals of all the roots). This is enough.
266+
-/
267+
sorry
268+
269+
-- yikes! Don't have Ideal.Quotient.map or Ideal.Quotient.congr??
270+
open scoped Pointwise
271+
def foo : MulAction.stabilizer G Q →* ((B ⧸ Q) ≃ₐ[A ⧸ P] (B ⧸ Q)) where
272+
toFun gh := {
273+
toFun := sorry
274+
invFun := sorry
275+
left_inv := sorry
276+
right_inv := sorry
277+
map_mul' := sorry
278+
map_add' := sorry
279+
commutes' := sorry
280+
}
281+
map_one' := sorry
282+
map_mul' := sorry
283+
-- definition of canonical map G_P →* (K ≃ₐ[k] K)
284+
285+
-- Main result: it's surjective.
286+
-- Jou proved this (see Frobenius2.lean) assuming (a) K/k simple and (b) P maximal.
287+
-- Bourbaki reduce to maximal case by localizing at P, and use finite + separable = simple
288+
-- on the max separable subextension, but then the argument follows Jou's formalisation
289+
-- in Frobenius2.lean in this directory.
290+
end part_b

0 commit comments

Comments
 (0)