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 → Land a polynomialfsaying thatfis zero or all of its irreducible factors overLhave 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)wherearanges through its roots.lift_of_splits: IfKandLare field extensions of a fieldFand for some finite subsetSofK, the minimal polynomial of everyx ∈ Ksplits as a polynomial with coefficients inL, thenalgebra.adjoin F Sembeds intoL.polynomial.is_splitting_field.lift: An embedding of a splitting field of the polynomialfinto another field such thatfsplits.polynomial.is_splitting_field.alg_equiv: Every splitting field of a polynomialfis isomorphic tosplitting_field fand 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.