Splitting fields #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file we prove the existence and uniqueness of splitting fields.
Main definitions #
polynomial.splitting_field f
: A fixed splitting field of the polynomialf
.
Main statements #
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.
Implementation details #
We construct a splitting_field_aux
without worrying about whether the instances satisfy nice
definitional equalities. Then the actual splitting_field
is defined to be a quotient of a
mv_polynomial
ring by the kernel of the obvious map into splitting_field_aux
. Because the
actual splitting_field
will be a quotient of a mv_polynomial
, it has nice instances on it.
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.
It constructs the type, proves that is a field and algebra over the base field.
Uses recursion on the degree.
Equations
- polynomial.splitting_field_aux_aux n = n.rec_on (λ (K : Type u) (inst : field K) (f : polynomial K), ⟨K, ⟨inst, infer_instance (algebra.id K)⟩⟩) (λ (m : ℕ) (ih : Π {K : Type u} [_inst_4 : field K], polynomial K → (Σ (L : Type u) (inst : field L), algebra K L)) (K : Type u) (inst : field K) (f : polynomial K), let L : Σ (L : Type u) (inst_1 : field L), algebra (adjoin_root f.factor) L := ih f.remove_factor, h₁ : field L.fst := L.snd.fst, h₂ : algebra (adjoin_root f.factor) L.fst := L.snd.snd in ⟨L.fst, ⟨L.snd.fst, ((algebra_map (adjoin_root f.factor) L.fst).comp (adjoin_root.of f.factor)).to_algebra⟩⟩)
Auxiliary construction to a splitting field of a polynomial, which removes
n
(arbitrarily-chosen) factors. It is the type constructed in splitting_field_aux_aux
.
Equations
Instances for polynomial.splitting_field_aux
- 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.polynomial.is_splitting_field
Equations
Equations
Equations
Equations
The natural map from mv_polynomial (f.root_set (splitting_field_aux f.nat_degree f))
to splitting_field_aux f.nat_degree f
sendind a variable to the corresponding root.
Equations
- polynomial.splitting_field_aux.of_mv_polynomial f = mv_polynomial.aeval (λ (i : ↥(f.root_set (polynomial.splitting_field_aux f.nat_degree f))), i.val)
The algebra isomorphism between the quotient of
mv_polynomial (f.root_set (splitting_field_aux f.nat_degree f)) K
by the kernel of
of_mv_polynomial f
and splitting_field_aux f.nat_degree f
. It is used to transport all the
algebraic structures from the latter to f.splitting_field
, that is defined as the former.
A splitting field of a polynomial.
Equations
Instances for polynomial.splitting_field
- polynomial.splitting_field.comm_ring
- polynomial.splitting_field.inhabited
- polynomial.splitting_field.has_smul
- polynomial.splitting_field.algebra
- polynomial.splitting_field.algebra'
- polynomial.splitting_field.is_scalar_tower
- polynomial.splitting_field.field
- polynomial.splitting_field.char_zero
- polynomial.is_splitting_field.splitting_field
- polynomial.is_splitting_field.polynomial.splitting_field.finite_dimensional
- polynomial.is_splitting_field.polynomial.splitting_field.fintype
- polynomial.is_splitting_field.polynomial.splitting_field.no_zero_smul_divisors
- polynomial.splitting_field.normal
- polynomial.gal.apply_mul_semiring_action
- polynomial.gal.algebra
- polynomial.gal.is_scalar_tower
Equations
Equations
Equations
The algebra equivalence with splitting_field_aux
,
which we will use to construct the field structure.
Equations
- polynomial.splitting_field.field f = let e : f.splitting_field ≃ₐ[K] polynomial.splitting_field_aux f.nat_degree f := polynomial.splitting_field.alg_equiv_splitting_field_aux f in {add := comm_ring.add (polynomial.splitting_field.comm_ring f), add_assoc := _, zero := comm_ring.zero (polynomial.splitting_field.comm_ring f), zero_add := _, add_zero := _, nsmul := comm_ring.nsmul (polynomial.splitting_field.comm_ring f), nsmul_zero' := _, nsmul_succ' := _, neg := comm_ring.neg (polynomial.splitting_field.comm_ring f), sub := comm_ring.sub (polynomial.splitting_field.comm_ring f), sub_eq_add_neg := _, zsmul := comm_ring.zsmul (polynomial.splitting_field.comm_ring f), zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _, int_cast := comm_ring.int_cast (polynomial.splitting_field.comm_ring f), nat_cast := comm_ring.nat_cast (polynomial.splitting_field.comm_ring f), one := comm_ring.one (polynomial.splitting_field.comm_ring f), nat_cast_zero := _, nat_cast_succ := _, int_cast_of_nat := _, int_cast_neg_succ_of_nat := _, mul := comm_ring.mul (polynomial.splitting_field.comm_ring f), mul_assoc := _, one_mul := _, mul_one := _, npow := comm_ring.npow (polynomial.splitting_field.comm_ring f), npow_zero' := _, npow_succ' := _, left_distrib := _, right_distrib := _, mul_comm := _, inv := λ (a : f.splitting_field), ⇑(e.symm) (⇑e a)⁻¹, div := division_ring.div._default comm_ring.mul _ comm_ring.one _ _ comm_ring.npow _ _ (λ (a : f.splitting_field), ⇑(e.symm) (⇑e a)⁻¹), div_eq_mul_inv := _, zpow := division_ring.zpow._default comm_ring.mul _ comm_ring.one _ _ comm_ring.npow _ _ (λ (a : f.splitting_field), ⇑(e.symm) (⇑e a)⁻¹), zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, exists_pair_ne := _, rat_cast := λ (a : ℚ), ⇑(algebra_map K f.splitting_field) ↑a, mul_inv_cancel := _, inv_zero := _, rat_cast_mk := _, qsmul := has_smul.smul (polynomial.splitting_field.has_smul f), qsmul_eq_mul' := _}
Embeds the splitting field into any other field that splits the polynomial.
Equations
Any splitting field is isomorphic to splitting_field f
.