7
7
import Mathlib.RingTheory.Ideal.Pointwise
8
8
import Mathlib.RingTheory.Ideal.Over
9
9
import Mathlib.FieldTheory.Normal
10
+ import Mathlib
10
11
11
12
variable {A : Type *} [CommRing A]
12
13
{B : Type *} [CommRing B] [Algebra A B] [Algebra.IsIntegral A B]
@@ -23,8 +24,8 @@ variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
23
24
24
25
open scoped Pointwise
25
26
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 _
28
29
_ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
29
30
fun x ↦ smul_smul g x b
30
31
@@ -89,7 +90,7 @@ def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
89
90
90
91
namespace IsNormalElement
91
92
92
- lemma iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
93
+ theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
93
94
IsNormalElement K x ↔
94
95
∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
95
96
constructor
@@ -99,7 +100,7 @@ lemma iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
99
100
-- need min poly divides P and then it should all be over
100
101
sorry
101
102
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)
103
104
(hx : IsNormalElement K x) (hy : IsNormalElement K y) :
104
105
IsNormalElement K (x * y) := by
105
106
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)
108
109
obtain ⟨Py, hy1, hy2, hy3⟩ := hy
109
110
rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
110
111
-- 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?
112
114
sorry
113
115
114
116
-- API
@@ -160,7 +162,9 @@ variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
160
162
-- Do I need this:
161
163
-- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]
162
164
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) :
164
168
algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
165
169
Ideal.Quotient.eq_zero_iff_mem
166
170
@@ -175,8 +179,10 @@ example : --[Algebra A k] [IsScalarTower A (A ⧸ p) k] [Algebra k K] [IsScalarT
175
179
rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]
176
180
rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]
177
181
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]
180
186
181
187
open Polynomial BigOperators
182
188
@@ -186,30 +192,40 @@ variable (G) in
186
192
and lies in `τ • Q` for all `τ ∉ (decomposition_subgroup_Ideal' A K L B Q)`.-/
187
193
private noncomputable abbrev F (b : B) : B[X] := ∏ᶠ τ : G, (X - C (τ • b))
188
194
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
190
197
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)
197
204
_ = F G b := by rw [F_spec]
198
205
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
+
201
215
202
216
open scoped algebraMap
203
217
204
218
noncomputable local instance : Algebra A[X] B[X] :=
205
219
RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
206
220
207
221
-- PR?
222
+ omit [Algebra.IsIntegral A B] in
208
223
@[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) :=
210
225
map_monomial _
211
226
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) :
213
229
∃ M : A[X], (M : B[X]) = F G b := by
214
230
choose f hf using fun b ↦ (hGalois b).mp
215
231
classical
@@ -231,16 +247,17 @@ private lemma F_descent (hGalois : ∀ (b : B), (∀ (g : G), g • b = b) ↔
231
247
variable (G) in
232
248
noncomputable def M (b : B) : A[X] := (F_descent hGalois b).choose
233
249
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
235
252
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
237
254
sorry -- follows from `F_eval_eq_zero`
238
255
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]
240
257
[CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]
241
258
(h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := by
242
259
-- 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 )
244
261
sorry
245
262
246
263
-- (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
266
283
-/
267
284
sorry
268
285
269
- -- yikes! Don't have Ideal.Quotient.map or Ideal.Quotient.congr??
270
286
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)
281
306
map_one' := sorry
282
307
map_mul' := sorry
283
- -- definition of canonical map G_P →* (K ≃ₐ[ k ] K)
284
308
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.
287
316
-- Bourbaki reduce to maximal case by localizing at P, and use finite + separable = simple
288
317
-- on the max separable subextension, but then the argument follows Jou's formalisation
289
318
-- in Frobenius2.lean in this directory.
0 commit comments