|
| 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