@@ -3,29 +3,19 @@ Copyright (c) 2018 Chris Hughes. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Chris Hughes
5
5
-/
6
- import algebra.char_p.algebra
7
- import field_theory.intermediate_field
8
- import ring_theory.adjoin.field
6
+ import field_theory.normal
9
7
10
8
/-!
11
9
# Splitting fields
12
10
13
- This file introduces the notion of a splitting field of a polynomial and provides an embedding from
14
- a splitting field to any field that splits the polynomial. A polynomial `f : K[X]` splits
15
- over a field extension `L` of `K` if it is zero or all of its irreducible factors over `L` have
16
- degree `1`. A field extension of `K` of a polynomial `f : K[X]` is called a splitting field
17
- if it is the smallest field extension of `K` such that `f` splits.
11
+ In this file we prove the existence and uniqueness of splitting fields.
18
12
19
13
## Main definitions
20
14
21
15
* `polynomial.splitting_field f`: A fixed splitting field of the polynomial `f`.
22
- * `polynomial.is_splitting_field`: A predicate on a field to be a splitting field of a polynomial
23
- `f`.
24
16
25
17
## Main statements
26
18
27
- * `polynomial.is_splitting_field.lift`: An embedding of a splitting field of the polynomial `f` into
28
- another field such that `f` splits.
29
19
* `polynomial.is_splitting_field.alg_equiv`: Every splitting field of a polynomial `f` is isomorphic
30
20
to `splitting_field f` and thus, being a splitting field is unique up to isomorphism.
31
21
@@ -484,81 +474,16 @@ adjoin_roots f
484
474
485
475
end splitting_field
486
476
487
- variables (K L) [algebra K L]
488
- /-- Typeclass characterising splitting fields. -/
489
- class is_splitting_field (f : K[X]) : Prop :=
490
- (splits [] : splits (algebra_map K L) f)
491
- (adjoin_roots [] : algebra.adjoin K (↑(f.map (algebra_map K L)).roots.to_finset : set L) = ⊤)
477
+ end splitting_field
492
478
493
479
namespace is_splitting_field
494
480
481
+ variables (K L) [algebra K L]
482
+
495
483
variables {K}
496
484
instance splitting_field (f : K[X]) : is_splitting_field K (splitting_field f) f :=
497
485
⟨splitting_field.splits f, splitting_field.adjoin_roots f⟩
498
486
499
- section scalar_tower
500
-
501
- variables {K L F} [algebra F K] [algebra F L] [is_scalar_tower F K L]
502
-
503
- variables {K}
504
- instance map (f : F[X]) [is_splitting_field F L f] :
505
- is_splitting_field K L (f.map $ algebra_map F K) :=
506
- ⟨by { rw [splits_map_iff, ← is_scalar_tower.algebra_map_eq], exact splits L f },
507
- subalgebra.restrict_scalars_injective F $
508
- by { rw [map_map, ← is_scalar_tower.algebra_map_eq, subalgebra.restrict_scalars_top,
509
- eq_top_iff, ← adjoin_roots L f, algebra.adjoin_le_iff],
510
- exact λ x hx, @algebra.subset_adjoin K _ _ _ _ _ _ hx }⟩
511
-
512
- variables {K} (L)
513
- theorem splits_iff (f : K[X]) [is_splitting_field K L f] :
514
- polynomial.splits (ring_hom.id K) f ↔ (⊤ : subalgebra K L) = ⊥ :=
515
- ⟨λ h, eq_bot_iff.2 $ adjoin_roots L f ▸ (roots_map (algebra_map K L) h).symm ▸
516
- algebra.adjoin_le_iff.2 (λ y hy,
517
- let ⟨x, hxs, hxy⟩ := finset.mem_image.1 (by rwa multiset.to_finset_map at hy) in
518
- hxy ▸ set_like.mem_coe.2 $ subalgebra.algebra_map_mem _ _),
519
- λ h, @ring_equiv.to_ring_hom_refl K _ ▸
520
- ring_equiv.self_trans_symm (ring_equiv.of_bijective _ $ algebra.bijective_algebra_map_iff.2 h) ▸
521
- by { rw ring_equiv.to_ring_hom_trans, exact splits_comp_of_splits _ _ (splits L f) }⟩
522
-
523
- theorem mul (f g : F[X]) (hf : f ≠ 0 ) (hg : g ≠ 0 ) [is_splitting_field F K f]
524
- [is_splitting_field K L (g.map $ algebra_map F K)] :
525
- is_splitting_field F L (f * g) :=
526
- ⟨(is_scalar_tower.algebra_map_eq F K L).symm ▸ splits_mul _
527
- (splits_comp_of_splits _ _ (splits K f))
528
- ((splits_map_iff _ _).1 (splits L $ g.map $ algebra_map F K)),
529
- by rw [polynomial.map_mul, roots_mul (mul_ne_zero (map_ne_zero hf : f.map (algebra_map F L) ≠ 0 )
530
- (map_ne_zero hg)), multiset.to_finset_add, finset.coe_union,
531
- algebra.adjoin_union_eq_adjoin_adjoin,
532
- is_scalar_tower.algebra_map_eq F K L, ← map_map,
533
- roots_map (algebra_map K L) ((splits_id_iff_splits $ algebra_map F K).2 $ splits K f),
534
- multiset.to_finset_map, finset.coe_image, algebra.adjoin_algebra_map, adjoin_roots,
535
- algebra.map_top, is_scalar_tower.adjoin_range_to_alg_hom, ← map_map, adjoin_roots,
536
- subalgebra.restrict_scalars_top]⟩
537
-
538
- end scalar_tower
539
-
540
- /-- Splitting field of `f` embeds into any field that splits `f`. -/
541
- def lift [algebra K F] (f : K[X]) [is_splitting_field K L f]
542
- (hf : polynomial.splits (algebra_map K F) f) : L →ₐ[K] F :=
543
- if hf0 : f = 0 then (algebra.of_id K F).comp $
544
- (algebra.bot_equiv K L : (⊥ : subalgebra K L) →ₐ[K] K).comp $
545
- by { rw ← (splits_iff L f).1 (show f.splits (ring_hom.id K), from hf0.symm ▸ splits_zero _),
546
- exact algebra.to_top } else
547
- alg_hom.comp (by { rw ← adjoin_roots L f, exact classical.choice (lift_of_splits _ $ λ y hy,
548
- have aeval y f = 0 , from (eval₂_eq_eval_map _).trans $
549
- (mem_roots $ by exact map_ne_zero hf0).1 (multiset.mem_to_finset.mp hy),
550
- ⟨is_algebraic_iff_is_integral.1 ⟨f, hf0, this ⟩,
551
- splits_of_splits_of_dvd _ hf0 hf $ minpoly.dvd _ _ this ⟩) })
552
- algebra.to_top
553
-
554
- theorem finite_dimensional (f : K[X]) [is_splitting_field K L f] : finite_dimensional K L :=
555
- ⟨@algebra.top_to_submodule K L _ _ _ ▸ adjoin_roots L f ▸
556
- fg_adjoin_of_finite (finset.finite_to_set _) (λ y hy,
557
- if hf : f = 0
558
- then by { rw [hf, polynomial.map_zero, roots_zero] at hy, cases hy }
559
- else is_algebraic_iff_is_integral.1 ⟨f, hf, (eval₂_eq_eval_map _).trans $
560
- (mem_roots $ by exact map_ne_zero hf).1 (multiset.mem_to_finset.mp hy)⟩)⟩
561
-
562
487
instance (f : K[X]) : _root_.finite_dimensional K f.splitting_field :=
563
488
finite_dimensional f.splitting_field f
564
489
@@ -582,39 +507,12 @@ begin
582
507
exact ring_hom.injective (lift L f $ splits (splitting_field f) f : L →+* f.splitting_field)
583
508
end
584
509
585
- lemma of_alg_equiv [algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [is_splitting_field K F p] :
586
- is_splitting_field K L p :=
587
- begin
588
- split,
589
- { rw ← f.to_alg_hom.comp_algebra_map,
590
- exact splits_comp_of_splits _ _ (splits F p) },
591
- { rw [←(algebra.range_top_iff_surjective f.to_alg_hom).mpr f.surjective,
592
- ←root_set, adjoin_root_set_eq_range (splits F p), root_set, adjoin_roots F p] },
593
- end
594
-
595
510
end is_splitting_field
596
511
597
- end splitting_field
598
-
599
512
end polynomial
600
513
601
- namespace intermediate_field
514
+ section normal
602
515
603
- open polynomial
604
-
605
- variables [field K] [field L] [algebra K L] {p : K[X]}
606
-
607
- lemma splits_of_splits {F : intermediate_field K L} (h : p.splits (algebra_map K L))
608
- (hF : ∀ x ∈ p.root_set L, x ∈ F) : p.splits (algebra_map K F) :=
609
- begin
610
- simp_rw [root_set, finset.mem_coe, multiset.mem_to_finset] at hF,
611
- rw splits_iff_exists_multiset,
612
- refine ⟨multiset.pmap subtype.mk _ hF, map_injective _ (algebra_map F L).injective _⟩,
613
- conv_lhs { rw [polynomial.map_map, ←is_scalar_tower.algebra_map_eq,
614
- eq_prod_roots_of_splits h, ←multiset.pmap_eq_map _ _ _ hF] },
615
- simp_rw [polynomial.map_mul, polynomial.map_multiset_prod,
616
- multiset.map_pmap, polynomial.map_sub, map_C, map_X],
617
- refl,
618
- end
516
+ instance [field F] (p : F[X]) : normal F p.splitting_field := normal.of_is_splitting_field p
619
517
620
- end intermediate_field
518
+ end normal
0 commit comments