A predicate on adjoining roots of polynomial #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
This file defines a predicate is_adjoin_root S f
, which states that the ring S
can be
constructed by adjoining a specified root of the polynomial f : R[X]
to R
.
This predicate is useful when the same ring can be generated by adjoining the root of different
polynomials, and you want to vary which polynomial you're considering.
The results in this file are intended to mirror those in ring_theory.adjoin_root
,
in order to provide an easier way to translate results from one to the other.
Motivation #
adjoin_root
presents one construction of a ring R[α]
. However, it is possible to obtain
rings of this form in many ways, such as number_field.ring_of_integers ℚ(√-5)
,
or algebra.adjoin R {α, α^2}
, or intermediate_field.adjoin R {α, 2 - α}
,
or even if we want to view ℂ
as adjoining a root of X^2 + 1
to ℝ
.
Main definitions #
The two main predicates in this file are:
is_adjoin_root S f
:S
is generated by adjoining a specified root off : R[X]
toR
is_adjoin_root_monic S f
:S
is generated by adjoining a root of the monic polynomialf : R[X]
toR
Using is_adjoin_root
to map into S
:
is_adjoin_root.map
: inclusion fromR[X]
toS
is_adjoin_root.root
: the specific root adjoined toR
to giveS
Using is_adjoin_root
to map out of S
:
is_adjoin_root.repr
: choose a non-unique representative inR[X]
is_adjoin_root.lift
,is_adjoin_root.lift_hom
: lift a morphismR →+* T
toS →+* T
is_adjoin_root_monic.mod_by_monic_hom
: a unique representative inR[X]
iff
is monic
Main results #
adjoin_root.is_adjoin_root
andadjoin_root.is_adjoin_root_monic
:adjoin_root
satisfies the conditions onis_adjoin_root
(_monic
)is_adjoin_root_monic.power_basis
: theroot
generates a power basis onS
overR
is_adjoin_root.aequiv
: algebra isomorphism showing adjoining a root gives a unique ring up to isomorphismis_adjoin_root.of_equiv
: transferis_adjoin_root
across an algebra isomorphismis_adjoin_root_eq.minpoly_eq
: the minimal polynomial of the adjoined root off
is equal tof
, iff
is irreducible and monic, andR
is a GCD domain
- map : polynomial R →+* S
- map_surjective : function.surjective ⇑(self.map)
- ker_map : ring_hom.ker self.map = ideal.span {f}
- algebra_map_eq : algebra_map R S = self.map.comp polynomial.C
is_adjoin_root S f
states that the ring S
can be constructed by adjoining a specified root
of the polynomial f : R[X]
to R
.
Compare power_basis R S
, which does not explicitly specify which polynomial we adjoin a root of
(in particular f
does not need to be the minimal polynomial of the root we adjoin),
and adjoin_root
which constructs a new type.
This is not a typeclass because the choice of root given S
and f
is not unique.
Instances for is_adjoin_root
- is_adjoin_root.has_sizeof_inst
- to_is_adjoin_root : is_adjoin_root S f
- monic : f.monic
is_adjoin_root_monic S f
states that the ring S
can be constructed by adjoining a specified
root of the monic polynomial f : R[X]
to R
.
As long as f
is monic, there is a well-defined representation of elements of S
as polynomials
in R[X]
of degree lower than deg f
(see mod_by_monic_hom
and coeff
). In particular,
we have is_adjoin_root_monic.power_basis
.
Bundling monic
into this structure is very useful when working with explicit f
s such as
X^2 - C a * X - C b
since it saves you carrying around the proofs of monicity.
Instances for is_adjoin_root_monic
- is_adjoin_root_monic.has_sizeof_inst
(h : is_adjoin_root S f).root
is the root of f
that can be adjoined to generate S
.
Equations
- h.root = ⇑(h.map) polynomial.X
Choose an arbitrary representative so that h.map (h.repr x) = x
.
If f
is monic, use is_adjoin_root_monic.mod_by_monic_hom
for a unique choice of representative.
repr
preserves zero, up to multiples of f
repr
preserves addition, up to multiples of f
Extensionality of the is_adjoin_root
structure itself. See is_adjoin_root_monic.ext_elem
for extensionality of the ring elements.
Extensionality of the is_adjoin_root
structure itself. See is_adjoin_root_monic.ext_elem
for extensionality of the ring elements.
Auxiliary lemma for is_adjoin_root.lift
Lift a ring homomorphism R →+* T
to S →+* T
by specifying a root x
of f
in T
,
where S
is given by adjoining a root of f
to R
.
Equations
- is_adjoin_root.lift i x hx h = {to_fun := λ (z : S), polynomial.eval₂ i x (h.repr z), map_one' := _, map_mul' := _, map_zero' := _, map_add' := _}
Auxiliary lemma for apply_eq_lift
Unicity of lift
: a map that agrees on R
and h.root
agrees with lift
everywhere.
Lift the algebra map R → T
to S →ₐ[R] T
by specifying a root x
of f
in T
,
where S
is given by adjoining a root of f
to R
.
Equations
- is_adjoin_root.lift_hom x hx' h = {to_fun := (is_adjoin_root.lift (algebra_map R T) x hx' h).to_fun, map_one' := _, map_mul' := _, map_zero' := _, map_add' := _, commutes' := _}
Unicity of lift_hom
: a map that agrees on h.root
agrees with lift_hom
everywhere.
adjoin_root f
is indeed given by adjoining a root of f
.
Equations
- adjoin_root.is_adjoin_root f = {map := adjoin_root.mk f, map_surjective := _, ker_map := _, algebra_map_eq := _}
adjoin_root f
is indeed given by adjoining a root of f
. If f
is monic this is more
powerful than adjoin_root.is_adjoin_root
.
Equations
- adjoin_root.is_adjoin_root_monic f hf = {to_is_adjoin_root := {map := (adjoin_root.is_adjoin_root f).map, map_surjective := _, ker_map := _, algebra_map_eq := _}, monic := hf}
is_adjoin_root.mod_by_monic_hom
sends the equivalence class of f
mod g
to f %ₘ g
.
Equations
- h.mod_by_monic_hom = {to_fun := λ (x : S), h.to_is_adjoin_root.repr x %ₘ f, map_add' := _, map_smul' := _}
The basis on S
generated by powers of h.root
.
Auxiliary definition for is_adjoin_root_monic.power_basis
.
Equations
- h.basis = {repr := {to_fun := λ (x : S), finsupp.comap_domain coe (⇑(h.mod_by_monic_hom) x).to_finsupp _, map_add' := _, map_smul' := _, inv_fun := λ (g : fin f.nat_degree →₀ R), ⇑(h.to_is_adjoin_root.map) {to_finsupp := finsupp.map_domain coe g}, left_inv := _, right_inv := _}}
If f
is monic, the powers of h.root
form a basis.
Equations
- h.power_basis = {gen := h.to_is_adjoin_root.root, dim := f.nat_degree, basis := h.basis, basis_eq_pow := _}
is_adjoin_root_monic.lift_polyₗ
lifts a linear map on polynomials to a linear map on S
.
Equations
- h.lift_polyₗ g = g.comp h.mod_by_monic_hom
is_adjoin_root_monic.coeff h x i
is the i
th coefficient of the representative of x : S
.
Equations
- h.coeff = h.lift_polyₗ {to_fun := polynomial.coeff ring.to_semiring, map_add' := _, map_smul' := _}
Adjoining a root gives a unique ring up to algebra isomorphism.
This is the converse of is_adjoin_root.of_equiv
: this turns an is_adjoin_root
into an
alg_equiv
, and is_adjoin_root.of_equiv
turns an alg_equiv
into an is_adjoin_root
.
Transfer is_adjoin_root
across an algebra isomorphism.
This is the converse of is_adjoin_root.aequiv
: this turns an alg_equiv
into an is_adjoin_root
,
and is_adjoin_root.aequiv
turns an is_adjoin_root
into an alg_equiv
.