Adjoining roots of polynomials #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
This file defines the commutative ring adjoin_root f
, the ring R[X]/(f) obtained from a
commutative ring R
and a polynomial f : R[X]
. If furthermore R
is a field and f
is
irreducible, the field structure on adjoin_root f
is constructed.
We suggest stating results on is_adjoin_root
instead of adjoin_root
to achieve higher
generality, since is_adjoin_root
works for all different constructions of R[α]
including adjoin_root f = R[X]/(f)
itself.
Main definitions and results #
The main definitions are in the adjoin_root
namespace.
-
mk f : R[X] →+* adjoin_root f
, the natural ring homomorphism. -
of f : R →+* adjoin_root f
, the natural ring homomorphism. -
root f : adjoin_root f
, the image of X in R[X]/(f). -
lift (i : R →+* S) (x : S) (h : f.eval₂ i x = 0) : (adjoin_root f) →+* S
, the ring homomorphism from R[X]/(f) to S extendingi : R →+* S
and sendingX
tox
. -
lift_hom (x : S) (hfx : aeval x f = 0) : adjoin_root f →ₐ[R] S
, the algebra homomorphism from R[X]/(f) to S extendingalgebra_map R S
and sendingX
tox
-
equiv : (adjoin_root f →ₐ[F] E) ≃ {x // x ∈ (f.map (algebra_map F E)).roots}
a bijection between algebra homomorphisms fromadjoin_root
and roots off
inS
Adjoin a root of a polynomial f
to a commutative ring R
. We define the new ring
as the quotient of R[X]
by the principal ideal generated by f
.
Equations
- adjoin_root f = (polynomial R ⧸ ideal.span {f})
Instances for adjoin_root
- adjoin_root.comm_ring
- adjoin_root.inhabited
- adjoin_root.has_smul
- adjoin_root.distrib_smul
- adjoin_root.is_scalar_tower
- adjoin_root.smul_comm_class
- adjoin_root.is_scalar_tower_right
- adjoin_root.distrib_mul_action
- adjoin_root.algebra
- adjoin_root.has_coe_t
- adjoin_root.field
- adjoin_root.is_noetherian_ring
- polynomial.splitting_field_aux.algebra'''
- polynomial.splitting_field_aux.algebra'
- polynomial.splitting_field_aux.scalar_tower'
- adjoin_root.number_field
Equations
Equations
- adjoin_root.inhabited f = {default := 0}
Equations
Ring homomorphism from R[x]
to adjoin_root f
sending X
to the root
.
Equations
- adjoin_root.mk f = ideal.quotient.mk (ideal.span {f})
Embedding of the original ring R
into adjoin_root f
.
Equations
Equations
Equations
Equations
Equations
The adjoined root.
Equations
Equations
- adjoin_root.has_coe_t = {coe := ⇑(adjoin_root.of f)}
Two R
-alg_hom
from adjoin_root f
to the same R
-algebra are the same iff
they agree on root f
.
Lift a ring homomorphism i : R →+* S
to adjoin_root f →+* S
.
Equations
- adjoin_root.lift i x h = ideal.quotient.lift (ideal.span {f}) (polynomial.eval₂_ring_hom i x) _
Produce an algebra homomorphism adjoin_root f →ₐ[R] S
sending root f
to
a root of f
in S
.
Equations
- adjoin_root.lift_hom f x hfx = {to_fun := (adjoin_root.lift (algebra_map R S) x hfx).to_fun, map_one' := _, map_mul' := _, map_zero' := _, map_add' := _, commutes' := _}
Equations
- adjoin_root.field = {add := comm_ring.add (adjoin_root.comm_ring f), add_assoc := _, zero := comm_ring.zero (adjoin_root.comm_ring f), zero_add := _, add_zero := _, nsmul := comm_ring.nsmul (adjoin_root.comm_ring f), nsmul_zero' := _, nsmul_succ' := _, neg := comm_ring.neg (adjoin_root.comm_ring f), sub := comm_ring.sub (adjoin_root.comm_ring f), sub_eq_add_neg := _, zsmul := comm_ring.zsmul (adjoin_root.comm_ring f), zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _, int_cast := comm_ring.int_cast (adjoin_root.comm_ring f), nat_cast := comm_ring.nat_cast (adjoin_root.comm_ring f), one := comm_ring.one (adjoin_root.comm_ring f), nat_cast_zero := _, nat_cast_succ := _, int_cast_of_nat := _, int_cast_neg_succ_of_nat := _, mul := comm_ring.mul (adjoin_root.comm_ring f), mul_assoc := _, one_mul := _, mul_one := _, npow := comm_ring.npow (adjoin_root.comm_ring f), npow_zero' := _, npow_succ' := _, left_distrib := _, right_distrib := _, mul_comm := _, inv := group_with_zero.inv (ideal.quotient.group_with_zero (ideal.span {f})), div := group_with_zero.div (ideal.quotient.group_with_zero (ideal.span {f})), div_eq_mul_inv := _, zpow := group_with_zero.zpow (ideal.quotient.group_with_zero (ideal.span {f})), zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, exists_pair_ne := _, rat_cast := λ (a : ℚ), ⇑(adjoin_root.of f) ↑a, mul_inv_cancel := _, inv_zero := _, rat_cast_mk := _, qsmul := has_smul.smul (adjoin_root.has_smul f), qsmul_eq_mul' := _}
adjoin_root.mod_by_monic_hom
sends the equivalence class of f
mod g
to f %ₘ g
.
This is a well-defined right inverse to adjoin_root.mk
, see adjoin_root.mk_left_inverse
.
Equations
The elements 1, root g, ..., root g ^ (d - 1)
form a basis for adjoin_root g
,
where g
is a monic polynomial of degree d
.
Equations
- adjoin_root.power_basis_aux' hg = basis.of_equiv_fun {to_fun := λ (f : adjoin_root g) (i : fin g.nat_degree), (⇑(adjoin_root.mod_by_monic_hom hg) f).coeff ↑i, map_add' := _, map_smul' := _, inv_fun := λ (c : fin g.nat_degree → R), ⇑(adjoin_root.mk g) (finset.univ.sum (λ (i : fin g.nat_degree), ⇑(polynomial.monomial ↑i) (c i))), left_inv := _, right_inv := _}
This lemma could be autogenerated by @[simps]
but unfortunately that would require
unfolding that causes a timeout.
This lemma could be autogenerated by @[simps]
but unfortunately that would require
unfolding that causes a timeout.
The power basis 1, root g, ..., root g ^ (d - 1)
for adjoin_root g
,
where g
is a monic polynomial of degree d
.
Equations
- adjoin_root.power_basis' hg = {gen := adjoin_root.root g, dim := g.nat_degree, basis := adjoin_root.power_basis_aux' hg, basis_eq_pow := _}
The elements 1, root f, ..., root f ^ (d - 1)
form a basis for adjoin_root f
,
where f
is an irreducible polynomial over a field of degree d
.
Equations
- adjoin_root.power_basis_aux hf = let f' : polynomial K := f * ⇑polynomial.C (f.leading_coeff)⁻¹ in basis.mk _ _
The power basis 1, root f, ..., root f ^ (d - 1)
for adjoin_root f
,
where f
is an irreducible polynomial over a field of degree d
.
Equations
- adjoin_root.power_basis hf = {gen := adjoin_root.root f, dim := f.nat_degree, basis := adjoin_root.power_basis_aux hf, basis_eq_pow := _}
The surjective algebra morphism R[X]/(minpoly R x) → R[x]
.
If R
is a GCD domain and x
is integral, this is an isomorphism,
see adjoin_root.minpoly.equiv_adjoin
.
Equations
- adjoin_root.minpoly.to_adjoin R x = adjoin_root.lift_hom (minpoly R x) ⟨x, _⟩ _
If S
is an extension of R
with power basis pb
and g
is a monic polynomial over R
such that pb.gen
has a minimal polynomial g
, then S
is isomorphic to adjoin_root g
.
Compare power_basis.equiv_of_root
, which would require
h₂ : aeval pb.gen (minpoly R (root g)) = 0
; that minimal polynomial is not
guaranteed to be identical to g
.
If L
is a field extension of F
and f
is a polynomial over F
then the set
of maps from F[x]/(f)
into L
is in bijection with the set of roots of f
in L
.
Equations
- adjoin_root.equiv L F f hf = (adjoin_root.power_basis hf).lift_equiv'.trans ((equiv.refl L).subtype_equiv _)
The natural isomorphism R[α]/(I[α]) ≅ R[α]/((I[x] ⊔ (f)) / (f))
for α
a root of
f : R[X]
and I : ideal R
.
See adjoin_root.quot_map_of_equiv
for the isomorphism with (R/I)[X] / (f mod I)
.
The natural isomorphism R[α]/((I[x] ⊔ (f)) / (f)) ≅ (R[x]/I[x])/((f) ⊔ I[x] / I[x])
for α
a root of f : R[X]
and I : ideal R
The natural isomorphism (R/I)[x]/(f mod I) ≅ (R[x]/I*R[x])/(f mod I[x])
where
f : R[X]
and I : ideal R
Equations
The natural isomorphism R[α]/I[α] ≅ (R/I)[X]/(f mod I)
for α
a root of f : R[X]
and I : ideal R
.
Equations
Promote adjoin_root.quot_adjoin_root_equiv_quot_polynomial_quot
to an alg_equiv.
Equations
Let α
have minimal polynomial f
over R
and I
be an ideal of R
,
then R[α] / (I) = (R[x] / (f)) / pS = (R/p)[x] / (f mod p)
.