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:Sis generated by adjoining a specified root off : R[X]toRis_adjoin_root_monic S f:Sis 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]toSis_adjoin_root.root: the specific root adjoined toRto 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 →+* TtoS →+* Tis_adjoin_root_monic.mod_by_monic_hom: a unique representative inR[X]iffis monic
Main results #
adjoin_root.is_adjoin_rootandadjoin_root.is_adjoin_root_monic:adjoin_rootsatisfies the conditions onis_adjoin_root(_monic)is_adjoin_root_monic.power_basis: therootgenerates a power basis onSoverRis_adjoin_root.aequiv: algebra isomorphism showing adjoining a root gives a unique ring up to isomorphismis_adjoin_root.of_equiv: transferis_adjoin_rootacross an algebra isomorphismis_adjoin_root_eq.minpoly_eq: the minimal polynomial of the adjoined root offis equal tof, iffis irreducible and monic, andRis 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 fs 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 ith 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.