Documentation

Mathlib.RingTheory.AdjoinRoot

Adjoining roots of polynomials #

This file defines the commutative ring AdjoinRoot 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 AdjoinRoot f is constructed.

We suggest stating results on IsAdjoinRoot instead of AdjoinRoot to achieve higher generality, since IsAdjoinRoot works for all different constructions of R[α] including AdjoinRoot f = R[X]/(f) itself.

Main definitions and results #

The main definitions are in the AdjoinRoot namespace.

Equations
theorem AdjoinRoot.nontrivial {R : Type u} [CommRing R] (f : Polynomial R) [IsDomain R] (h : f.degree 0) :

Ring homomorphism from R[x] to AdjoinRoot f sending X to the root.

Equations
theorem AdjoinRoot.induction_on {R : Type u} [CommRing R] (f : Polynomial R) {C : AdjoinRoot fProp} (x : AdjoinRoot f) (ih : ∀ (p : Polynomial R), C ((AdjoinRoot.mk f) p)) :
C x
def AdjoinRoot.of {R : Type u} [CommRing R] (f : Polynomial R) :

Embedding of the original ring R into AdjoinRoot f.

Equations
@[simp]
theorem AdjoinRoot.smul_mk {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [DistribSMul S R] [IsScalarTower S R R] (a : S) (x : Polynomial R) :
a (AdjoinRoot.mk f) x = (AdjoinRoot.mk f) (a x)
theorem AdjoinRoot.smul_of {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [DistribSMul S R] [IsScalarTower S R R] (a : S) (x : R) :
a (AdjoinRoot.of f) x = (AdjoinRoot.of f) (a x)
instance AdjoinRoot.instIsScalarTower {R : Type u} [CommRing R] (R₁ : Type u_1) (R₂ : Type u_2) [SMul R₁ R₂] [DistribSMul R₁ R] [DistribSMul R₂ R] [IsScalarTower R₁ R R] [IsScalarTower R₂ R R] [IsScalarTower R₁ R₂ R] (f : Polynomial R) :
Equations
  • =
instance AdjoinRoot.instSMulCommClass {R : Type u} [CommRing R] (R₁ : Type u_1) (R₂ : Type u_2) [DistribSMul R₁ R] [DistribSMul R₂ R] [IsScalarTower R₁ R R] [IsScalarTower R₂ R R] [SMulCommClass R₁ R₂ R] (f : Polynomial R) :
Equations
  • =
Equations
  • =

The adjoined root.

Equations
instance AdjoinRoot.hasCoeT {R : Type u} [CommRing R] {f : Polynomial R} :
Equations
theorem AdjoinRoot.algHom_ext_iff {R : Type u} {S : Type v} [CommRing R] {f : Polynomial R} [Semiring S] [Algebra R S] {g₁ : AdjoinRoot f →ₐ[R] S} {g₂ : AdjoinRoot f →ₐ[R] S} :
g₁ = g₂ g₁ (AdjoinRoot.root f) = g₂ (AdjoinRoot.root f)
theorem AdjoinRoot.algHom_ext {R : Type u} {S : Type v} [CommRing R] {f : Polynomial R} [Semiring S] [Algebra R S] {g₁ : AdjoinRoot f →ₐ[R] S} {g₂ : AdjoinRoot f →ₐ[R] S} (h : g₁ (AdjoinRoot.root f) = g₂ (AdjoinRoot.root f)) :
g₁ = g₂

Two R-AlgHom from AdjoinRoot f to the same R-algebra are the same iff they agree on root f.

@[simp]
theorem AdjoinRoot.mk_eq_mk {R : Type u} [CommRing R] {f : Polynomial R} {g : Polynomial R} {h : Polynomial R} :
(AdjoinRoot.mk f) g = (AdjoinRoot.mk f) h f g - h
@[simp]
theorem AdjoinRoot.mk_eq_zero {R : Type u} [CommRing R] {f : Polynomial R} {g : Polynomial R} :
(AdjoinRoot.mk f) g = 0 f g
@[simp]
theorem AdjoinRoot.mk_self {R : Type u} [CommRing R] {f : Polynomial R} :
@[simp]
theorem AdjoinRoot.mk_C {R : Type u} [CommRing R] {f : Polynomial R} (x : R) :
(AdjoinRoot.mk f) (Polynomial.C x) = (AdjoinRoot.of f) x
@[simp]
theorem AdjoinRoot.mk_X {R : Type u} [CommRing R] {f : Polynomial R} :
(AdjoinRoot.mk f) Polynomial.X = AdjoinRoot.root f
theorem AdjoinRoot.mk_ne_zero_of_degree_lt {R : Type u} [CommRing R] {f : Polynomial R} (hf : f.Monic) {g : Polynomial R} (h0 : g 0) (hd : g.degree < f.degree) :
theorem AdjoinRoot.mk_ne_zero_of_natDegree_lt {R : Type u} [CommRing R] {f : Polynomial R} (hf : f.Monic) {g : Polynomial R} (h0 : g 0) (hd : g.natDegree < f.natDegree) :
def AdjoinRoot.lift {R : Type u} {S : Type v} [CommRing R] {f : Polynomial R} [CommRing S] (i : R →+* S) (x : S) (h : Polynomial.eval₂ i x f = 0) :

Lift a ring homomorphism i : R →+* S to AdjoinRoot f →+* S.

Equations
@[simp]
theorem AdjoinRoot.lift_mk {R : Type u} {S : Type v} [CommRing R] {f : Polynomial R} [CommRing S] {i : R →+* S} {a : S} (h : Polynomial.eval₂ i a f = 0) (g : Polynomial R) :
@[simp]
theorem AdjoinRoot.lift_root {R : Type u} {S : Type v} [CommRing R] {f : Polynomial R} [CommRing S] {i : R →+* S} {a : S} (h : Polynomial.eval₂ i a f = 0) :
@[simp]
theorem AdjoinRoot.lift_of {R : Type u} {S : Type v} [CommRing R] {f : Polynomial R} [CommRing S] {i : R →+* S} {a : S} (h : Polynomial.eval₂ i a f = 0) {x : R} :
(AdjoinRoot.lift i a h) ((AdjoinRoot.of f) x) = i x
@[simp]
theorem AdjoinRoot.lift_comp_of {R : Type u} {S : Type v} [CommRing R] {f : Polynomial R} [CommRing S] {i : R →+* S} {a : S} (h : Polynomial.eval₂ i a f = 0) :
(AdjoinRoot.lift i a h).comp (AdjoinRoot.of f) = i
def AdjoinRoot.liftHom {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [CommRing S] [Algebra R S] (x : S) (hfx : (Polynomial.aeval x) f = 0) :

Produce an algebra homomorphism AdjoinRoot f →ₐ[R] S sending root f to a root of f in S.

Equations
@[simp]
theorem AdjoinRoot.coe_liftHom {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [CommRing S] [Algebra R S] (x : S) (hfx : (Polynomial.aeval x) f = 0) :
@[simp]
theorem AdjoinRoot.aeval_algHom_eq_zero {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [CommRing S] [Algebra R S] (ϕ : AdjoinRoot f →ₐ[R] S) :
@[simp]
theorem AdjoinRoot.liftHom_eq_algHom {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (f : Polynomial R) (ϕ : AdjoinRoot f →ₐ[R] S) :
@[simp]
theorem AdjoinRoot.liftHom_mk {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [CommRing S] {a : S} [Algebra R S] (hfx : (Polynomial.aeval a) f = 0) {g : Polynomial R} :
@[simp]
theorem AdjoinRoot.liftHom_root {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [CommRing S] {a : S} [Algebra R S] (hfx : (Polynomial.aeval a) f = 0) :
@[simp]
theorem AdjoinRoot.liftHom_of {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [CommRing S] {a : S} [Algebra R S] (hfx : (Polynomial.aeval a) f = 0) {x : R} :
(AdjoinRoot.liftHom f a hfx) ((AdjoinRoot.of f) x) = (algebraMap R S) x
@[simp]
theorem AdjoinRoot.root_isInv {R : Type u} [CommRing R] (r : R) :
(AdjoinRoot.of (Polynomial.C r * Polynomial.X - 1)) r * AdjoinRoot.root (Polynomial.C r * Polynomial.X - 1) = 1
theorem AdjoinRoot.algHom_subsingleton {R : Type u} [CommRing R] {S : Type u_1} [CommRing S] [Algebra R S] {r : R} :
Subsingleton (AdjoinRoot (Polynomial.C r * Polynomial.X - 1) →ₐ[R] S)
instance AdjoinRoot.span_maximal_of_irreducible {K : Type w} [Field K] {f : Polynomial K} [Fact (Irreducible f)] :
(Ideal.span {f}).IsMaximal
Equations
  • =
noncomputable instance AdjoinRoot.instGroupWithZero {K : Type w} [Field K] {f : Polynomial K} [Fact (Irreducible f)] :
Equations
noncomputable instance AdjoinRoot.instField {K : Type w} [Field K] {f : Polynomial K} [Fact (Irreducible f)] :
Equations
theorem AdjoinRoot.coe_injective {K : Type w} [Field K] {f : Polynomial K} (h : f.degree 0) :
theorem AdjoinRoot.mul_div_root_cancel {K : Type w} [Field K] (f : Polynomial K) [Fact (Irreducible f)] :
(Polynomial.X - Polynomial.C (AdjoinRoot.root f)) * (Polynomial.map (AdjoinRoot.of f) f / (Polynomial.X - Polynomial.C (AdjoinRoot.root f))) = Polynomial.map (AdjoinRoot.of f) f
theorem AdjoinRoot.isIntegral_root' {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) :
def AdjoinRoot.modByMonicHom {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) :

AdjoinRoot.modByMonicHom sends the equivalence class of f mod g to f %ₘ g.

This is a well-defined right inverse to AdjoinRoot.mk, see AdjoinRoot.mk_leftInverse.

Equations
@[simp]
theorem AdjoinRoot.modByMonicHom_mk {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) (f : Polynomial R) :
def AdjoinRoot.powerBasisAux' {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) :
Basis (Fin g.natDegree) R (AdjoinRoot g)

The elements 1, root g, ..., root g ^ (d - 1) form a basis for AdjoinRoot g, where g is a monic polynomial of degree d.

Equations
  • One or more equations did not get rendered due to their size.
theorem AdjoinRoot.powerBasisAux'_repr_symm_apply {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) (c : Fin g.natDegree →₀ R) :
(AdjoinRoot.powerBasisAux' hg).repr.symm c = (AdjoinRoot.mk g) (∑ i : Fin g.natDegree, (Polynomial.monomial i) (c i))
@[simp]
theorem AdjoinRoot.powerBasisAux'_repr_apply_to_fun {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) (f : AdjoinRoot g) (i : Fin g.natDegree) :
((AdjoinRoot.powerBasisAux' hg).repr f) i = ((AdjoinRoot.modByMonicHom hg) f).coeff i
@[simp]
theorem AdjoinRoot.powerBasis'_dim {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) :
(AdjoinRoot.powerBasis' hg).dim = g.natDegree
@[simp]
theorem AdjoinRoot.powerBasis'_gen {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) :
def AdjoinRoot.powerBasis' {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) :

The power basis 1, root g, ..., root g ^ (d - 1) for AdjoinRoot g, where g is a monic polynomial of degree d.

Equations
theorem AdjoinRoot.minpoly_root {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :
minpoly K (AdjoinRoot.root f) = f * Polynomial.C f.leadingCoeff⁻¹
def AdjoinRoot.powerBasisAux {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :
Basis (Fin f.natDegree) K (AdjoinRoot f)

The elements 1, root f, ..., root f ^ (d - 1) form a basis for AdjoinRoot f, where f is an irreducible polynomial over a field of degree d.

Equations
@[simp]
theorem AdjoinRoot.powerBasis_gen {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :
@[simp]
theorem AdjoinRoot.powerBasis_dim {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :
(AdjoinRoot.powerBasis hf).dim = f.natDegree
def AdjoinRoot.powerBasis {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :

The power basis 1, root f, ..., root f ^ (d - 1) for AdjoinRoot f, where f is an irreducible polynomial over a field of degree d.

Equations
theorem AdjoinRoot.minpoly_powerBasis_gen {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :
minpoly K (AdjoinRoot.powerBasis hf).gen = f * Polynomial.C f.leadingCoeff⁻¹
theorem AdjoinRoot.minpoly_powerBasis_gen_of_monic {K : Type w} [Field K] {f : Polynomial K} (hf : f.Monic) (hf' : optParam (f 0) ) :
def AdjoinRoot.Minpoly.toAdjoin (R : Type u) {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (x : S) :

The surjective algebra morphism R[X]/(minpoly R x) → R[x]. If R is a integrally closed domain and x is integral, this is an isomorphism, see minpoly.equivAdjoin.

Equations
theorem AdjoinRoot.Minpoly.toAdjoin_apply' {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] {x : S} (a : AdjoinRoot (minpoly R x)) :
(AdjoinRoot.Minpoly.toAdjoin R x) a = (AdjoinRoot.liftHom (minpoly R x) x, ) a
theorem AdjoinRoot.Minpoly.toAdjoin.apply_X {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] {x : S} :
(AdjoinRoot.Minpoly.toAdjoin R x) ((AdjoinRoot.mk (minpoly R x)) Polynomial.X) = x,
@[simp]
theorem AdjoinRoot.equiv'_symm_apply {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (g : Polynomial R) (pb : PowerBasis R S) (h₁ : (Polynomial.aeval (AdjoinRoot.root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :
(AdjoinRoot.equiv' g pb h₁ h₂).symm = (pb.lift (AdjoinRoot.root g) h₁)
@[simp]
theorem AdjoinRoot.equiv'_apply {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (g : Polynomial R) (pb : PowerBasis R S) (h₁ : (Polynomial.aeval (AdjoinRoot.root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :
(AdjoinRoot.equiv' g pb h₁ h₂) = (AdjoinRoot.liftHom g pb.gen h₂)
def AdjoinRoot.equiv' {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (g : Polynomial R) (pb : PowerBasis R S) (h₁ : (Polynomial.aeval (AdjoinRoot.root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :

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 AdjoinRoot g.

Compare PowerBasis.equivOfRoot, which would require h₂ : aeval pb.gen (minpoly R (root g)) = 0; that minimal polynomial is not guaranteed to be identical to g.

Equations
  • One or more equations did not get rendered due to their size.
theorem AdjoinRoot.equiv'_toAlgHom {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (g : Polynomial R) (pb : PowerBasis R S) (h₁ : (Polynomial.aeval (AdjoinRoot.root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :
(AdjoinRoot.equiv' g pb h₁ h₂) = AdjoinRoot.liftHom g pb.gen h₂
theorem AdjoinRoot.equiv'_symm_toAlgHom {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (g : Polynomial R) (pb : PowerBasis R S) (h₁ : (Polynomial.aeval (AdjoinRoot.root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :
(AdjoinRoot.equiv' g pb h₁ h₂).symm = pb.lift (AdjoinRoot.root g) h₁
def AdjoinRoot.equiv (L : Type u_1) (F : Type u_2) [Field F] [CommRing L] [IsDomain L] [Algebra F L] (f : Polynomial F) (hf : f 0) :
(AdjoinRoot f →ₐ[F] L) { x : L // x f.aroots L }

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

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).

Equations

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

Equations

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
  • One or more equations did not get rendered due to their size.

The natural isomorphism R[α]/I[α] ≅ (R/I)[X]/(f mod I) for α a root of f : R[X] and I : Ideal R.

Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem PowerBasis.quotientEquivQuotientMinpolyMap_symm_apply {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (pb : PowerBasis R S) (I : Ideal R) :
∀ (a : Polynomial (R I) Ideal.span {Polynomial.map (Ideal.Quotient.mk I) (minpoly R pb.gen)}), (pb.quotientEquivQuotientMinpolyMap I).symm a = (↑(AlgEquiv.ofRingEquiv )).symm ((↑(AdjoinRoot.quotEquivQuotMap (minpoly R pb.gen) I)).symm a)
@[simp]
theorem PowerBasis.quotientEquivQuotientMinpolyMap_apply {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (pb : PowerBasis R S) (I : Ideal R) :
∀ (a : S Ideal.map (algebraMap R S) I), (pb.quotientEquivQuotientMinpolyMap I) a = (AdjoinRoot.quotAdjoinRootEquivQuotPolynomialQuot I (minpoly R pb.gen)) ((Ideal.quotientMap (Ideal.map (AdjoinRoot.of (minpoly R pb.gen)) I) (↑(AdjoinRoot.equiv' (minpoly R pb.gen) pb )).symm ) a)
noncomputable def PowerBasis.quotientEquivQuotientMinpolyMap {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (pb : PowerBasis R S) (I : Ideal R) :

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).

Equations
theorem PowerBasis.quotientEquivQuotientMinpolyMap_apply_mk {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (pb : PowerBasis R S) (I : Ideal R) (g : Polynomial R) :
(pb.quotientEquivQuotientMinpolyMap I) ((Ideal.Quotient.mk (Ideal.map (algebraMap R S) I)) ((Polynomial.aeval pb.gen) g)) = (Ideal.Quotient.mk (Ideal.span {Polynomial.map (Ideal.Quotient.mk I) (minpoly R pb.gen)})) (Polynomial.map (Ideal.Quotient.mk I) g)
theorem PowerBasis.quotientEquivQuotientMinpolyMap_symm_apply_mk {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (pb : PowerBasis R S) (I : Ideal R) (g : Polynomial R) :
(pb.quotientEquivQuotientMinpolyMap I).symm ((Ideal.Quotient.mk (Ideal.span {Polynomial.map (Ideal.Quotient.mk I) (minpoly R pb.gen)})) (Polynomial.map (Ideal.Quotient.mk I) g)) = (Ideal.Quotient.mk (Ideal.map (algebraMap R S) I)) ((Polynomial.aeval pb.gen) g)

If L / K is an integral extension, K is a domain, L is a field, then any irreducible polynomial over L divides some monic irreducible polynomial over K.