Splitting fields #
This file introduces the notion of a splitting field of a polynomial and provides an embedding from
a splitting field to any field that splits the polynomial. A polynomial f : polynomial K
splits
over a field extension L
of K
if it is zero or all of its irreducible factors over L
have
degree 1
. A field extension of K
of a polynomial f : polynomial K
is called a splitting field
if it is the smallest field extension of K
such that f
splits.
Main definitions #
polynomial.splits i f
: A predicate on a field homomorphismi : K → L
and a polynomialf
saying thatf
is zero or all of its irreducible factors overL
have degree1
.polynomial.splitting_field f
: A fixed splitting field of the polynomialf
.polynomial.is_splitting_field
: A predicate on a field to be a splitting field of a polynomialf
.
Main statements #
polynomial.C_leading_coeff_mul_prod_multiset_X_sub_C
: If a polynomial has as many roots as its degree, it can be written as the product of its leading coefficient with∏ (X - a)
wherea
ranges through its roots.lift_of_splits
: IfK
andL
are field extensions of a fieldF
and for some finite subsetS
ofK
, the minimal polynomial of everyx ∈ K
splits as a polynomial with coefficients inL
, thenalgebra.adjoin F S
embeds intoL
.polynomial.is_splitting_field.lift
: An embedding of a splitting field of the polynomialf
into another field such thatf
splits.polynomial.is_splitting_field.alg_equiv
: Every splitting field of a polynomialf
is isomorphic tosplitting_field f
and thus, being a splitting field is unique up to isomorphism.
A polynomial splits
iff it is zero or all of its irreducible factors have degree
1.
Equations
- polynomial.splits i f = (f = 0 ∨ ∀ {g : L[X]}, irreducible g → g ∣ polynomial.map i f → g.degree = 1)
Pick a root of a polynomial that splits.
Equations
- polynomial.root_of_splits i hf hfd = classical.some _
A polynomial p
that has as many roots as its degree
can be written p = p.leading_coeff * ∏(X - a)
, for a
in p.roots
.
A polynomial splits if and only if it has as many roots as its degree.
If P
is a monic polynomial that splits, then coeff P 0
equals the product of the roots.
If P
is a monic polynomial that splits, then P.next_coeff
equals the sum of the roots.
If p
is the minimal polynomial of a
over F
then F[a] ≃ₐ[F] F[x]/(p)
Equations
- alg_equiv.adjoin_singleton_equiv_adjoin_root_minpoly F x = (alg_equiv.of_bijective ((adjoin_root.lift_hom (minpoly F x) x _).cod_restrict (algebra.adjoin F {x}) _) _).symm
If a subalgebra
is finite_dimensional as a submodule then it is finite_dimensional
.
If K
and L
are field extensions of F
and we have s : finset K
such that
the minimal polynomial of each x ∈ s
splits in L
then algebra.adjoin F s
embeds in L
.
Non-computably choose an irreducible factor from a polynomial.
Equations
- f.factor = dite (∃ (g : K[X]), irreducible g ∧ g ∣ f) (λ (H : ∃ (g : K[X]), irreducible g ∧ g ∣ f), classical.some H) (λ (H : ¬∃ (g : K[X]), irreducible g ∧ g ∣ f), polynomial.X)
Divide a polynomial f by X - C r where r is a root of f in a bigger field extension.
Equations
Auxiliary construction to a splitting field of a polynomial. Uses induction on the degree.
Equations
- polynomial.splitting_field_aux n = n.rec_on (λ (K : Type u) (_x : field K) (_x_1 : K[X]) (_x : _x_1.nat_degree = 0), K) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] (f : K[X]), f.nat_degree = n → Type u) (K : Type u) (_x : field K) (f : K[X]) (hf : f.nat_degree = n.succ), ih f.remove_factor _)
Equations
- polynomial.splitting_field_aux.field n = n.rec_on (λ (K : Type u) (_x : field K) (_x_1 : K[X]) (_x_1 : _x_1.nat_degree = 0), _x) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : K[X]} (hfn : f.nat_degree = n), field (polynomial.splitting_field_aux n f hfn)) (K : Type u) (_x : field K) (f : K[X]) (hf : f.nat_degree = n.succ), ih _)
Equations
- polynomial.splitting_field_aux.inhabited hfn = {default := 37}
Equations
- polynomial.splitting_field_aux.algebra n = n.rec_on (λ (R : Type u_1) (K : Type u) (_x : comm_semiring R) (_x_1 : field K) (_x : algebra R K) (_x_2 : K[X]) (_x_1 : _x_2.nat_degree = 0), _x) (λ (n : ℕ) (ih : Π (R : Type u_1) {K : Type u} [_inst_4 : comm_semiring R] [_inst_5 : field K] [_inst_6 : algebra R K] {f : K[X]} (hfn : f.nat_degree = n), algebra R (polynomial.splitting_field_aux n f hfn)) (R : Type u_1) (K : Type u) (_x : comm_semiring R) (_x_1 : field K) (_x_2 : algebra R K) (f : K[X]) (hfn : f.nat_degree = n.succ), ih R _)
Equations
Equations
A splitting field of a polynomial.
Equations
Equations
This should be an instance globally, but it creates diamonds with the ℕ
and ℤ
actions:
example :
(add_comm_monoid.nat_module : module ℕ (splitting_field f)) =
@algebra.to_module _ _ _ _ (splitting_field.algebra' f) :=
rfl -- fails
example :
(add_comm_group.int_module _ : module ℤ (splitting_field f)) =
@algebra.to_module _ _ _ _ (splitting_field.algebra' f) :=
rfl -- fails
Until we resolve these diamonds, it's more convenient to only turn this instance on with
local attribute [instance]
in places where the benefit of having the instance outweighs the cost.
In the meantime, the splitting_field.algebra
instance below is immune to these particular diamonds
since K = ℕ
and K = ℤ
are not possible due to the field K
assumption. Diamonds in
algebra ℚ (splitting_field f)
instances are still possible, but this is a problem throughout the
library and not unique to this algebra
instance.
Equations
Equations
Embeds the splitting field into any other field that splits the polynomial.
- splits : polynomial.splits (algebra_map K L) f
- adjoin_roots : algebra.adjoin K ↑((polynomial.map (algebra_map K L) f).roots.to_finset) = ⊤
Typeclass characterising splitting fields.
Splitting field of f
embeds into any field that splits f
.
Equations
- polynomial.is_splitting_field.lift L f hf = dite (f = 0) (λ (hf0 : f = 0), (algebra.of_id K F).comp (↑(algebra.bot_equiv K L).comp (_.mpr algebra.to_top))) (λ (hf0 : ¬f = 0), (_.mpr (classical.choice _)).comp algebra.to_top)
Any splitting field is isomorphic to splitting_field f
.