Skip to content

Commit 46bf236

Browse files
committed
more sorrys
1 parent b041851 commit 46bf236

File tree

1 file changed

+66
-37
lines changed

1 file changed

+66
-37
lines changed

FLT/mathlibExperiments/FrobeniusRiou.lean

+66-37
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import Mathlib.RingTheory.Ideal.Pointwise
88
import Mathlib.RingTheory.Ideal.Over
99
import Mathlib.FieldTheory.Normal
10+
import Mathlib
1011

1112
variable {A : Type*} [CommRing A]
1213
{B : Type*} [CommRing B] [Algebra A B] [Algebra.IsIntegral A B]
@@ -23,8 +24,8 @@ variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
2324

2425
open scoped Pointwise
2526

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
27+
private theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc
28+
g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod _
2829
_ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
2930
fun x ↦ smul_smul g x b
3031

@@ -89,7 +90,7 @@ def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
8990

9091
namespace IsNormalElement
9192

92-
lemma iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
93+
theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
9394
IsNormalElement K x ↔
9495
∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
9596
constructor
@@ -99,7 +100,7 @@ lemma iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
99100
-- need min poly divides P and then it should all be over
100101
sorry
101102

102-
lemma prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
103+
theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
103104
(hx : IsNormalElement K x) (hy : IsNormalElement K y) :
104105
IsNormalElement K (x * y) := by
105106
rw [iff_exists_monic_splits K hxint] at hx
@@ -108,7 +109,8 @@ lemma prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
108109
obtain ⟨Py, hy1, hy2, hy3⟩ := hy
109110
rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
110111
-- 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+
-- Do we have this?
113+
-- Is this even the best way to go about this?
112114
sorry
113115

114116
-- API
@@ -160,7 +162,9 @@ variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
160162
-- Do I need this:
161163
-- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]
162164

163-
lemma Ideal.Quotient.eq_zero_iff_mem' (x : A) :
165+
-- version of Ideal.Quotient.eq_zero_iff_mem with algebraMap
166+
omit [P.IsPrime] in
167+
theorem Ideal.Quotient.eq_zero_iff_mem' (x : A) :
164168
algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
165169
Ideal.Quotient.eq_zero_iff_mem
166170

@@ -175,8 +179,10 @@ example : --[Algebra A k] [IsScalarTower A (A ⧸ p) k] [Algebra k K] [IsScalarT
175179
rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]
176180
rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]
177181
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]
182+
rw [← algebraMap_apply A B (B ⧸ Q)]
183+
rw [← algebraMap_apply (A ⧸ P) K L]
184+
rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]
185+
rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]
180186

181187
open Polynomial BigOperators
182188

@@ -186,30 +192,40 @@ variable (G) in
186192
and lies in `τ • Q` for all `τ ∉ (decomposition_subgroup_Ideal' A K L B Q)`.-/
187193
private noncomputable abbrev F (b : B) : B[X] := ∏ᶠ τ : G, (X - C (τ • b))
188194

189-
private lemma F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
195+
omit [Finite G] in
196+
private theorem F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
190197

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)
198+
private theorem F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
199+
σ • F G b = σ • ∏ᶠ τ : G, (X - C (τ • b)) := by rw [F_spec]
200+
_ = ∏ᶠ τ : G, σ • (X - C (τ • b)) := smul_finprod _
201+
_ = ∏ᶠ τ : G, (X - C ((σ * τ) • b)) := by simp [smul_sub, smul_smul]
202+
_ = ∏ᶠ τ' : G, (X - C (τ' • b)) := finprod_eq_of_bijective (fun τ ↦ σ * τ)
203+
(Group.mulLeft_bijective σ) (fun _ ↦ rfl)
197204
_ = F G b := by rw [F_spec]
198205

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))]
206+
--example (X : Type) [Finite X] : Fintype X := exact?%
207+
--#check finprod_eq_zero
208+
private theorem F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
209+
let foo := Fintype.ofFinite G
210+
simp [F_spec, eval_prod]
211+
-- need eval finprod = finprod eval
212+
-- then use `finprod_eq_zero _ (1 : G)`
213+
sorry
214+
201215

202216
open scoped algebraMap
203217

204218
noncomputable local instance : Algebra A[X] B[X] :=
205219
RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
206220

207221
-- PR?
222+
omit [Algebra.IsIntegral A B] in
208223
@[simp, norm_cast]
209-
lemma coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
224+
theorem coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
210225
map_monomial _
211226

212-
private lemma F_descent (hGalois : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a) (b : B) :
227+
omit [Algebra.IsIntegral A B] in
228+
private theorem F_descent (hGalois : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a) (b : B) :
213229
∃ M : A[X], (M : B[X]) = F G b := by
214230
choose f hf using fun b ↦ (hGalois b).mp
215231
classical
@@ -231,16 +247,17 @@ private lemma F_descent (hGalois : ∀ (b : B), (∀ (g : G), g • b = b) ↔
231247
variable (G) in
232248
noncomputable def M (b : B) : A[X] := (F_descent hGalois b).choose
233249

234-
lemma M_spec (b : B) : ((M G hGalois b : A[X]) : B[X]) = F G b := (F_descent hGalois b).choose_spec
250+
omit [Algebra.IsIntegral A B] in
251+
theorem M_spec (b : B) : ((M G hGalois b : A[X]) : B[X]) = F G b := (F_descent hGalois b).choose_spec
235252

236-
lemma M_eval_eq_zero (b : B) : (M G hGalois b).eval₂ (algebraMap A[X] B[X]) b = 0 := by
253+
theorem M_eval_eq_zero (b : B) : (M G hGalois b).eval₂ (algebraMap A[X] B[X]) b = 0 := by
237254
sorry -- follows from `F_eval_eq_zero`
238255

239-
lemma Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]
256+
theorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]
240257
[CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]
241258
(h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := by
242259
-- ratio of two algebraic numbers is algebraic (follows from reciprocal of algebraic number
243-
-- is algebraic; proof is "reverse the min poly")
260+
-- is algebraic; proof is "reverse the min poly", don't know if we have it)
244261
sorry
245262

246263
-- (Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
@@ -266,24 +283,36 @@ theorem part_b2 : Normal K L := by
266283
-/
267284
sorry
268285

269-
-- yikes! Don't have Ideal.Quotient.map or Ideal.Quotient.congr??
270286
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-
}
287+
288+
def foo (g : G) (hg : g • Q = Q) : B ⧸ Q ≃+* B ⧸ Q :=
289+
Ideal.quotientEquiv Q Q (MulSemiringAction.toRingEquiv G B g) hg.symm
290+
291+
def bar (g : G) (hg : g • Q = Q) : (B ⧸ Q) ≃ₐ[A ⧸ P] B ⧸ Q where
292+
__ := foo Q g hg
293+
commutes' := sorry
294+
295+
def baz : MulAction.stabilizer G Q →* ((B ⧸ Q) ≃ₐ[A ⧸ P] (B ⧸ Q)) where
296+
toFun gh := bar Q P gh.1 gh.2
297+
map_one' := sorry
298+
map_mul' := sorry
299+
300+
noncomputable def bar2 (e : (B ⧸ Q) ≃ₐ[A ⧸ P] B ⧸ Q) : L ≃ₐ[K] L where
301+
__ := IsFractionRing.fieldEquivOfRingEquiv e.toRingEquiv
302+
commutes' := sorry
303+
304+
noncomputable def baz2 : MulAction.stabilizer G Q →* (L ≃ₐ[K] L) where
305+
toFun gh := bar2 Q P L K (baz Q P gh)
281306
map_one' := sorry
282307
map_mul' := sorry
283-
-- definition of canonical map G_P →* (K ≃ₐ[k] K)
284308

285-
-- Main result: it's surjective.
286-
-- Jou proved this (see Frobenius2.lean) assuming (a) K/k simple and (b) P maximal.
309+
theorem main_result : Function.Surjective
310+
(baz2 Q P L K : MulAction.stabilizer G Q → (L ≃ₐ[K] L)) := by
311+
sorry
312+
313+
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.
287316
-- Bourbaki reduce to maximal case by localizing at P, and use finite + separable = simple
288317
-- on the max separable subextension, but then the argument follows Jou's formalisation
289318
-- in Frobenius2.lean in this directory.

0 commit comments

Comments
 (0)