Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 1cb9727

Browse files
committed
feat(field_theory/galois): Separable splitting field is Galois (#5347)
Proves that a splitting field of a separable polynomial is Galois by showing that it has lots of automorphisms. Co-authored-by: tb65536 <tb65536@users.noreply.github.com>
1 parent e22fb94 commit 1cb9727

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

src/field_theory/galois.lean

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,87 @@ begin
306306
{ exact polynomial.map_ne_zero (minimal_polynomial.ne_zero h2) }
307307
end
308308

309+
lemma of_fixed_field_eq_bot [finite_dimensional F E]
310+
(h : intermediate_field.fixed_field (⊤ : subgroup (E ≃ₐ[F] E)) = ⊥) : is_galois F E :=
311+
begin
312+
rw [←is_galois_iff_is_galois_bot, ←h],
313+
exact is_galois.of_fixed_field E (⊤ : subgroup (E ≃ₐ[F] E)),
314+
end
315+
316+
lemma of_card_aut_eq_findim [finite_dimensional F E]
317+
(h : fintype.card (E ≃ₐ[F] E) = findim F E) : is_galois F E :=
318+
begin
319+
apply of_fixed_field_eq_bot,
320+
have p : 0 < findim (intermediate_field.fixed_field (⊤ : subgroup (E ≃ₐ[F] E))) E := findim_pos,
321+
rw [←intermediate_field.findim_eq_one_iff, ←mul_left_inj' (ne_of_lt p).symm, findim_mul_findim,
322+
←h, one_mul, intermediate_field.findim_fixed_field_eq_card],
323+
exact fintype.card_congr { to_fun := λ g, ⟨g, subgroup.mem_top g⟩, inv_fun := coe,
324+
left_inv := λ g, rfl, right_inv := λ _, by { ext, refl } },
325+
end
326+
327+
variables {F} {E} {p : polynomial F}
328+
329+
lemma of_separable_splitting_field_aux [hFE : finite_dimensional F E]
330+
[sp : p.is_splitting_field F E] (hp : p.separable) (K : intermediate_field F E) {x : E}
331+
(hx : x ∈ (p.map (algebra_map F E)).roots) :
332+
fintype.card ((↑K⟮x⟯ : intermediate_field F E) →ₐ[F] E) =
333+
fintype.card (K →ₐ[F] E) * findim K K⟮x⟯ :=
334+
begin
335+
have h : is_integral K x := is_integral_of_is_scalar_tower x (is_integral_of_noetherian hFE x),
336+
have h1 : p ≠ 0 := λ hp, by rwa [hp, polynomial.map_zero, polynomial.roots_zero] at hx,
337+
have h2 : (minimal_polynomial h) ∣ p.map (algebra_map F K),
338+
{ apply minimal_polynomial.dvd,
339+
rw [polynomial.aeval_def, polynomial.eval₂_map, ←polynomial.eval_map],
340+
exact (polynomial.mem_roots (polynomial.map_ne_zero h1)).mp hx },
341+
let key_equiv : ((↑K⟮x⟯ : intermediate_field F E) →ₐ[F] E) ≃ Σ (f : K →ₐ[F] E),
342+
@alg_hom K K⟮x⟯ E _ _ _ _ (ring_hom.to_algebra f) :=
343+
equiv.trans (alg_equiv.arrow_congr (intermediate_field.lift2_alg_equiv K⟮x⟯) (alg_equiv.refl))
344+
alg_hom_equiv_sigma,
345+
haveI : Π (f : K →ₐ[F] E), fintype (@alg_hom K K⟮x⟯ E _ _ _ _ (ring_hom.to_algebra f)) := λ f, by
346+
{ apply fintype.of_injective (sigma.mk f) (λ _ _ H, eq_of_heq ((sigma.mk.inj H).2)),
347+
exact fintype.of_equiv _ key_equiv },
348+
rw [fintype.card_congr key_equiv, fintype.card_sigma, intermediate_field.adjoin.findim h],
349+
apply finset.sum_const_nat,
350+
intros f hf,
351+
rw ← @intermediate_field.card_alg_hom_adjoin_integral K _ E _ _ x E _ (ring_hom.to_algebra f) h,
352+
{ apply fintype.card_congr, refl },
353+
{ exact polynomial.separable.of_dvd ((polynomial.separable_map (algebra_map F K)).mpr hp) h2 },
354+
{ refine polynomial.splits_of_splits_of_dvd _ (polynomial.map_ne_zero h1) _ h2,
355+
rw [polynomial.splits_map_iff, ←is_scalar_tower.algebra_map_eq],
356+
exact sp.splits },
357+
end
358+
359+
lemma of_separable_splitting_field [sp : p.is_splitting_field F E] (hp : p.separable) :
360+
is_galois F E :=
361+
begin
362+
haveI hFE : finite_dimensional F E := polynomial.is_splitting_field.finite_dimensional E p,
363+
let s := (p.map (algebra_map F E)).roots.to_finset,
364+
have adjoin_root := intermediate_field.ext (subalgebra.ext_iff.mp (eq.trans (top_le_iff.mp
365+
(eq.trans_le sp.adjoin_roots.symm (intermediate_field.algebra_adjoin_le_adjoin F ↑s)))
366+
intermediate_field.top_to_subalgebra.symm)),
367+
let P : intermediate_field F E → Prop := λ K, fintype.card (K →ₐ[F] E) = findim F K,
368+
suffices : P (intermediate_field.adjoin F ↑s),
369+
{ rw adjoin_root at this,
370+
apply of_card_aut_eq_findim,
371+
rw ← eq.trans this (linear_equiv.findim_eq intermediate_field.top_equiv.to_linear_equiv),
372+
exact fintype.card_congr (equiv.trans (alg_equiv_equiv_alg_hom F E)
373+
(alg_equiv.arrow_congr intermediate_field.top_equiv.symm alg_equiv.refl)) },
374+
apply intermediate_field.induction_on_adjoin_finset s P,
375+
{ have key := intermediate_field.card_alg_hom_adjoin_integral F
376+
(show is_integral F (0 : E), by exact is_integral_zero),
377+
rw [minimal_polynomial.zero, polynomial.nat_degree_X] at key,
378+
specialize key polynomial.separable_X (polynomial.splits_X (algebra_map F E)),
379+
rw [←@subalgebra.findim_bot F E _ _ _, ←intermediate_field.bot_to_subalgebra] at key,
380+
refine eq.trans _ key,
381+
apply fintype.card_congr,
382+
rw intermediate_field.adjoin_zero },
383+
intros K x hx hK,
384+
simp only [P] at *,
385+
rw [of_separable_splitting_field_aux hp K (multiset.mem_to_finset.mp hx),
386+
hK, findim_mul_findim],
387+
exact (linear_equiv.findim_eq (intermediate_field.lift2_alg_equiv K⟮x⟯).to_linear_equiv).symm,
388+
end
389+
309390
end is_galois
310391

311392
end galois_equivalent_definitions

0 commit comments

Comments
 (0)