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

Commit df76f43

Browse files
chore(field_theory/splitting_field): split file (#19154)
We split `field_theory.splitting_field` into `field_theory.splitting_field.is_splitting_field` and `field_theory.splitting_field.construction`. This is useful for the port, but also quite a lot of Galois theory should not depend on the existence of splitting fields.
1 parent 3088264 commit df76f43

File tree

8 files changed

+166
-119
lines changed

8 files changed

+166
-119
lines changed

src/field_theory/adjoin.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Authors: Thomas Browning, Patrick Lutz
66

77
import field_theory.intermediate_field
88
import field_theory.separable
9-
import field_theory.splitting_field
9+
import field_theory.splitting_field.is_splitting_field
1010
import ring_theory.tensor_product
1111

1212
/-!

src/field_theory/finite/galois_field.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import algebra.char_p.algebra
88
import data.zmod.algebra
99
import field_theory.finite.basic
1010
import field_theory.galois
11-
import field_theory.splitting_field
11+
import field_theory.splitting_field.is_splitting_field
1212

1313
/-!
1414
# Galois fields

src/field_theory/is_alg_closed/algebraic_closure.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Kenny Lau
66
import algebra.direct_limit
77
import algebra.char_p.algebra
88
import field_theory.is_alg_closed.basic
9+
import field_theory.splitting_field.construction
910

1011
/-!
1112
# Algebraic Closure

src/field_theory/normal.lean

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,11 @@ local attribute [-instance] adjoin_root.has_smul
135135
lemma normal.of_is_splitting_field (p : F[X]) [hFEp : is_splitting_field F E p] : normal F E :=
136136
begin
137137
unfreezingI { rcases eq_or_ne p 0 with rfl | hp },
138-
{ haveI : is_splitting_field F F 0 := ⟨splits_zero _, subsingleton.elim _ _⟩,
139-
exact (alg_equiv.transfer_normal ((is_splitting_field.alg_equiv F 0).trans
140-
(is_splitting_field.alg_equiv E 0).symm)).mp (normal_self F) },
138+
{ have := hFEp.adjoin_roots,
139+
simp only [polynomial.map_zero, roots_zero, multiset.to_finset_zero, finset.coe_empty,
140+
algebra.adjoin_empty] at this,
141+
exact normal.of_alg_equiv (alg_equiv.of_bijective (algebra.of_id F E)
142+
(algebra.bijective_algebra_map_iff.2 this.symm)) },
141143
refine normal_iff.2 (λ x, _),
142144
have hFE : finite_dimensional F E := is_splitting_field.finite_dimensional E p,
143145
have Hx : is_integral F x := is_integral_of_noetherian (is_noetherian.iff_fg.2 hFE) x,
@@ -196,8 +198,6 @@ begin
196198
rw [set.image_singleton, ring_hom.algebra_map_to_algebra, adjoin_root.lift_root]
197199
end
198200

199-
instance (p : F[X]) : normal F p.splitting_field := normal.of_is_splitting_field p
200-
201201
end normal_tower
202202

203203
namespace intermediate_field

src/field_theory/primitive_element.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Thomas Browning, Patrick Lutz
55
-/
66

7-
import field_theory.adjoin
7+
import field_theory.splitting_field.construction
88
import field_theory.is_alg_closed.basic
99
import field_theory.separable
1010
import ring_theory.integral_domain

src/field_theory/splitting_field.lean renamed to src/field_theory/splitting_field/construction.lean

Lines changed: 8 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,19 @@ Copyright (c) 2018 Chris Hughes. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Chris Hughes
55
-/
6-
import algebra.char_p.algebra
7-
import field_theory.intermediate_field
8-
import ring_theory.adjoin.field
6+
import field_theory.normal
97

108
/-!
119
# Splitting fields
1210
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.
1812
1913
## Main definitions
2014
2115
* `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`.
2416
2517
## Main statements
2618
27-
* `polynomial.is_splitting_field.lift`: An embedding of a splitting field of the polynomial `f` into
28-
another field such that `f` splits.
2919
* `polynomial.is_splitting_field.alg_equiv`: Every splitting field of a polynomial `f` is isomorphic
3020
to `splitting_field f` and thus, being a splitting field is unique up to isomorphism.
3121
@@ -484,81 +474,16 @@ adjoin_roots f
484474

485475
end splitting_field
486476

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
492478

493479
namespace is_splitting_field
494480

481+
variables (K L) [algebra K L]
482+
495483
variables {K}
496484
instance splitting_field (f : K[X]) : is_splitting_field K (splitting_field f) f :=
497485
⟨splitting_field.splits f, splitting_field.adjoin_roots f⟩
498486

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-
562487
instance (f : K[X]) : _root_.finite_dimensional K f.splitting_field :=
563488
finite_dimensional f.splitting_field f
564489

@@ -582,39 +507,12 @@ begin
582507
exact ring_hom.injective (lift L f $ splits (splitting_field f) f : L →+* f.splitting_field)
583508
end
584509

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-
595510
end is_splitting_field
596511

597-
end splitting_field
598-
599512
end polynomial
600513

601-
namespace intermediate_field
514+
section normal
602515

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
619517

620-
end intermediate_field
518+
end normal
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/-
2+
Copyright (c) 2018 Chris Hughes. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Chris Hughes
5+
-/
6+
import algebra.char_p.algebra
7+
import field_theory.intermediate_field
8+
import ring_theory.adjoin.field
9+
10+
/-!
11+
# Splitting fields
12+
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.
18+
19+
## Main definitions
20+
21+
* `polynomial.is_splitting_field`: A predicate on a field to be a splitting field of a polynomial
22+
`f`.
23+
24+
## Main statements
25+
26+
* `polynomial.is_splitting_field.lift`: An embedding of a splitting field of the polynomial `f` into
27+
another field such that `f` splits.
28+
29+
-/
30+
31+
noncomputable theory
32+
open_locale classical big_operators polynomial
33+
34+
universes u v w
35+
36+
variables {F : Type u} (K : Type v) (L : Type w)
37+
38+
namespace polynomial
39+
40+
variables [field K] [field L] [field F] [algebra K L]
41+
42+
/-- Typeclass characterising splitting fields. -/
43+
class is_splitting_field (f : K[X]) : Prop :=
44+
(splits [] : splits (algebra_map K L) f)
45+
(adjoin_roots [] : algebra.adjoin K (↑(f.map (algebra_map K L)).roots.to_finset : set L) = ⊤)
46+
47+
variables {K L F}
48+
49+
namespace is_splitting_field
50+
51+
section scalar_tower
52+
53+
variables [algebra F K] [algebra F L] [is_scalar_tower F K L]
54+
55+
instance map (f : F[X]) [is_splitting_field F L f] :
56+
is_splitting_field K L (f.map $ algebra_map F K) :=
57+
by { rw [splits_map_iff, ← is_scalar_tower.algebra_map_eq], exact splits L f },
58+
subalgebra.restrict_scalars_injective F $
59+
by { rw [map_map, ← is_scalar_tower.algebra_map_eq, subalgebra.restrict_scalars_top,
60+
eq_top_iff, ← adjoin_roots L f, algebra.adjoin_le_iff],
61+
exact λ x hx, @algebra.subset_adjoin K _ _ _ _ _ _ hx }⟩
62+
63+
variables (L)
64+
theorem splits_iff (f : K[X]) [is_splitting_field K L f] :
65+
polynomial.splits (ring_hom.id K) f ↔ (⊤ : subalgebra K L) = ⊥ :=
66+
⟨λ h, eq_bot_iff.2 $ adjoin_roots L f ▸ (roots_map (algebra_map K L) h).symm ▸
67+
algebra.adjoin_le_iff.2 (λ y hy,
68+
let ⟨x, hxs, hxy⟩ := finset.mem_image.1 (by rwa multiset.to_finset_map at hy) in
69+
hxy ▸ set_like.mem_coe.2 $ subalgebra.algebra_map_mem _ _),
70+
λ h, @ring_equiv.to_ring_hom_refl K _ ▸
71+
ring_equiv.self_trans_symm (ring_equiv.of_bijective _ $ algebra.bijective_algebra_map_iff.2 h) ▸
72+
by { rw ring_equiv.to_ring_hom_trans, exact splits_comp_of_splits _ _ (splits L f) }⟩
73+
74+
theorem mul (f g : F[X]) (hf : f ≠ 0) (hg : g ≠ 0) [is_splitting_field F K f]
75+
[is_splitting_field K L (g.map $ algebra_map F K)] :
76+
is_splitting_field F L (f * g) :=
77+
⟨(is_scalar_tower.algebra_map_eq F K L).symm ▸ splits_mul _
78+
(splits_comp_of_splits _ _ (splits K f))
79+
((splits_map_iff _ _).1 (splits L $ g.map $ algebra_map F K)),
80+
by rw [polynomial.map_mul, roots_mul (mul_ne_zero (map_ne_zero hf : f.map (algebra_map F L) ≠ 0)
81+
(map_ne_zero hg)), multiset.to_finset_add, finset.coe_union,
82+
algebra.adjoin_union_eq_adjoin_adjoin,
83+
is_scalar_tower.algebra_map_eq F K L, ← map_map,
84+
roots_map (algebra_map K L) ((splits_id_iff_splits $ algebra_map F K).2 $ splits K f),
85+
multiset.to_finset_map, finset.coe_image, algebra.adjoin_algebra_map, adjoin_roots,
86+
algebra.map_top, is_scalar_tower.adjoin_range_to_alg_hom, ← map_map, adjoin_roots,
87+
subalgebra.restrict_scalars_top]⟩
88+
89+
end scalar_tower
90+
91+
variable (L)
92+
93+
/-- Splitting field of `f` embeds into any field that splits `f`. -/
94+
def lift [algebra K F] (f : K[X]) [is_splitting_field K L f]
95+
(hf : polynomial.splits (algebra_map K F) f) : L →ₐ[K] F :=
96+
if hf0 : f = 0 then (algebra.of_id K F).comp $
97+
(algebra.bot_equiv K L : (⊥ : subalgebra K L) →ₐ[K] K).comp $
98+
by { rw ← (splits_iff L f).1 (show f.splits (ring_hom.id K), from hf0.symm ▸ splits_zero _),
99+
exact algebra.to_top } else
100+
alg_hom.comp (by { rw ← adjoin_roots L f, exact classical.choice (lift_of_splits _ $ λ y hy,
101+
have aeval y f = 0, from (eval₂_eq_eval_map _).trans $
102+
(mem_roots $ by exact map_ne_zero hf0).1 (multiset.mem_to_finset.mp hy),
103+
⟨is_algebraic_iff_is_integral.1 ⟨f, hf0, this⟩,
104+
splits_of_splits_of_dvd _ hf0 hf $ minpoly.dvd _ _ this⟩) })
105+
algebra.to_top
106+
107+
theorem finite_dimensional (f : K[X]) [is_splitting_field K L f] : finite_dimensional K L :=
108+
⟨@algebra.top_to_submodule K L _ _ _ ▸ adjoin_roots L f ▸
109+
fg_adjoin_of_finite (finset.finite_to_set _) (λ y hy,
110+
if hf : f = 0
111+
then by { rw [hf, polynomial.map_zero, roots_zero] at hy, cases hy }
112+
else is_algebraic_iff_is_integral.1 ⟨f, hf, (eval₂_eq_eval_map _).trans $
113+
(mem_roots $ by exact map_ne_zero hf).1 (multiset.mem_to_finset.mp hy)⟩)⟩
114+
115+
lemma of_alg_equiv [algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [is_splitting_field K F p] :
116+
is_splitting_field K L p :=
117+
begin
118+
split,
119+
{ rw ← f.to_alg_hom.comp_algebra_map,
120+
exact splits_comp_of_splits _ _ (splits F p) },
121+
{ rw [←(algebra.range_top_iff_surjective f.to_alg_hom).mpr f.surjective,
122+
←root_set, adjoin_root_set_eq_range (splits F p), root_set, adjoin_roots F p] },
123+
end
124+
125+
end is_splitting_field
126+
127+
end polynomial
128+
129+
namespace intermediate_field
130+
131+
open polynomial
132+
133+
variables {K L} [field K] [field L] [algebra K L] {p : K[X]}
134+
135+
lemma splits_of_splits {F : intermediate_field K L} (h : p.splits (algebra_map K L))
136+
(hF : ∀ x ∈ p.root_set L, x ∈ F) : p.splits (algebra_map K F) :=
137+
begin
138+
simp_rw [root_set, finset.mem_coe, multiset.mem_to_finset] at hF,
139+
rw splits_iff_exists_multiset,
140+
refine ⟨multiset.pmap subtype.mk _ hF, map_injective _ (algebra_map F L).injective _⟩,
141+
conv_lhs { rw [polynomial.map_map, ←is_scalar_tower.algebra_map_eq,
142+
eq_prod_roots_of_splits h, ←multiset.pmap_eq_map _ _ _ hF] },
143+
simp_rw [polynomial.map_mul, polynomial.map_multiset_prod,
144+
multiset.map_pmap, polynomial.map_sub, map_C, map_X],
145+
refl,
146+
end
147+
148+
end intermediate_field

src/ring_theory/polynomial/gauss_lemma.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Copyright (c) 2020 Aaron Anderson. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Aaron Anderson
55
-/
6-
import field_theory.splitting_field
6+
import field_theory.splitting_field.construction
77
import ring_theory.int.basic
88
import ring_theory.localization.integral
99
import ring_theory.integrally_closed

0 commit comments

Comments
 (0)