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 : K[X]
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 : K[X]
is called a splitting field
if it is the smallest field extension of K
such that f
splits.
Main definitions #
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.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.
Non-computably choose an irreducible factor from a polynomial.
Equations
- f.factor = dite (∃ (g : polynomial K), irreducible g ∧ g ∣ f) (λ (H : ∃ (g : polynomial K), irreducible g ∧ g ∣ f), classical.some H) (λ (H : ¬∃ (g : polynomial K), 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, which removes
n
(arbitrarily-chosen) factors.
Uses recursion on the degree. For better definitional behaviour, structures
including splitting_field_aux
(such as instances) should be defined using
this recursion in each field, rather than defining the whole tuple through
recursion.
Equations
- polynomial.splitting_field_aux n = n.rec_on (λ (K : Type u) (_x : field K) (_x : polynomial K), K) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K], polynomial K → Type u) (K : Type u) (_x : field K) (f : polynomial K), ih f.remove_factor)
Instances for polynomial.splitting_field_aux
- polynomial.splitting_field_aux.has_smul
- polynomial.splitting_field_aux.is_scalar_tower
- polynomial.splitting_field_aux.field
- polynomial.splitting_field_aux.inhabited
- polynomial.splitting_field_aux.algebra
- polynomial.splitting_field_aux.algebra'''
- polynomial.splitting_field_aux.algebra'
- polynomial.splitting_field_aux.algebra''
- polynomial.splitting_field_aux.scalar_tower'
- polynomial.splitting_field_aux.scalar_tower
Instances on splitting_field_aux
#
In order to avoid diamond issues, we have to be careful to define each data field of algebraic
instances on splitting_field_aux
by recursion, rather than defining the whole structure by
recursion at once.
The important detail is that the smul
instances can be lifted before we create the algebraic
instances; if we do not do this, this creates a mutual dependence on both on each other, and it
is impossible to untangle this mess. In order to do this, we need that these smul
instances
are distributive in the sense of distrib_smul
, which is weak enough to be guaranteed at this
stage. This is sufficient to lift an action to adjoin_root f
(remember that this is a quotient,
so these conditions are equivalent to well-definedness), which is all we need.
Splitting fields have a zero.
Equations
- polynomial.splitting_field_aux.zero n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), 0) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields have an addition.
Equations
- polynomial.splitting_field_aux.add n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), has_add.add) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields inherit scalar multiplication.
Equations
- polynomial.splitting_field_aux.smul n = n.rec_on (λ (α : Type u_1) (K : Type u) (fK : field K) (ds : distrib_smul α K) (ist : is_scalar_tower α K K) (f : polynomial K), has_smul.smul) (λ (n : ℕ) (ih : Π (α : Type u_1) {K : Type u} [_inst_4 : field K] [_inst_5 : distrib_smul α K] [_inst_5 : is_scalar_tower α K K] {f : polynomial K}, α → polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (α : Type u_1) (K : Type u) (fK : field K) (ds : distrib_smul α K) (ist : is_scalar_tower α K K) (f : polynomial K), ih α)
Equations
Splitting fields have a negation.
Equations
- polynomial.splitting_field_aux.neg n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), has_neg.neg) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields have subtraction.
Equations
- polynomial.splitting_field_aux.sub n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), has_sub.sub) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields have a one.
Equations
- polynomial.splitting_field_aux.one n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), 1) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields have a multiplication.
Equations
- polynomial.splitting_field_aux.mul n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), has_mul.mul) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields have a power operation.
Equations
- polynomial.splitting_field_aux.npow n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K) (n : ℕ) (x : polynomial.splitting_field_aux 0 f), x ^ n) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, ℕ → polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields have an injection from the base field.
Equations
- polynomial.splitting_field_aux.mk n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), id) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, K → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih ∘ coe)
Splitting fields have an inverse.
Equations
- polynomial.splitting_field_aux.inv n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), has_inv.inv) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields have a division.
Equations
- polynomial.splitting_field_aux.div n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K), has_div.div) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Splitting fields have powers by integers.
Equations
- polynomial.splitting_field_aux.zpow n = n.rec_on (λ (K : Type u) (fK : field K) (f : polynomial K) (n : ℤ) (x : polynomial.splitting_field_aux 0 f), x ^ n) (λ (n : ℕ) (ih : Π {K : Type u} [_inst_4 : field K] {f : polynomial K}, ℤ → polynomial.splitting_field_aux n f → polynomial.splitting_field_aux n f) (K : Type u) (fK : field K) (f : polynomial K), ih)
Equations
- polynomial.splitting_field_aux.field n = {add := polynomial.splitting_field_aux.add n f, add_assoc := _, zero := polynomial.splitting_field_aux.zero n f, zero_add := _, add_zero := _, nsmul := has_smul.smul (polynomial.splitting_field_aux.has_smul ℕ n), nsmul_zero' := _, nsmul_succ' := _, neg := polynomial.splitting_field_aux.neg n f, sub := polynomial.splitting_field_aux.sub n f, sub_eq_add_neg := _, zsmul := has_smul.smul (polynomial.splitting_field_aux.has_smul ℤ n), zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _, int_cast := polynomial.splitting_field_aux.mk n ∘ coe, nat_cast := polynomial.splitting_field_aux.mk n ∘ coe, one := polynomial.splitting_field_aux.one n f, nat_cast_zero := _, nat_cast_succ := _, int_cast_of_nat := _, int_cast_neg_succ_of_nat := _, mul := polynomial.splitting_field_aux.mul n f, mul_assoc := _, one_mul := _, mul_one := _, npow := polynomial.splitting_field_aux.npow n f, npow_zero' := _, npow_succ' := _, left_distrib := _, right_distrib := _, mul_comm := _, inv := polynomial.splitting_field_aux.inv n f, div := polynomial.splitting_field_aux.div n f, div_eq_mul_inv := _, zpow := polynomial.splitting_field_aux.zpow n f, zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, exists_pair_ne := _, rat_cast := polynomial.splitting_field_aux.mk n ∘ coe, mul_inv_cancel := _, inv_zero := _, rat_cast_mk := _, qsmul := has_smul.smul (polynomial.splitting_field_aux.has_smul ℚ n), qsmul_eq_mul' := _}
Equations
The injection from the base field as a ring homomorphism.
Equations
- polynomial.splitting_field_aux.mk_hom n = {to_fun := polynomial.splitting_field_aux.mk n f, map_one' := _, map_mul' := _, map_zero' := _, map_add' := _}
Equations
- polynomial.splitting_field_aux.algebra n R = {to_has_smul := {smul := has_smul.smul (polynomial.splitting_field_aux.has_smul R n)}, to_ring_hom := {to_fun := ⇑((polynomial.splitting_field_aux.mk_hom n).comp (algebra_map R K)), map_one' := _, map_mul' := _, map_zero' := _, map_add' := _}, commutes' := _, smul_def' := _}
A splitting field of a polynomial.
Equations
Instances for polynomial.splitting_field
- polynomial.splitting_field.field
- polynomial.splitting_field.inhabited
- polynomial.splitting_field.algebra'
- polynomial.splitting_field.algebra
- polynomial.splitting_field.char_zero
- polynomial.is_splitting_field.splitting_field
- polynomial.is_splitting_field.polynomial.splitting_field.finite_dimensional
- polynomial.splitting_field.normal
- polynomial.gal.apply_mul_semiring_action
- polynomial.gal.algebra
- polynomial.gal.is_scalar_tower
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
.