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.

def AdjoinRoot {R : Type u} [CommRing R] (f : Polynomial R) :

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
    Instances For
      Equations
        Equations

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

          Equations
            Instances For
              theorem AdjoinRoot.induction_on {R : Type u} [CommRing R] (f : Polynomial R) {C : AdjoinRoot fProp} (x : AdjoinRoot f) (ih : ∀ (p : Polynomial R), C ((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
                Instances For
                  instance AdjoinRoot.instSMulAdjoinRoot {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [DistribSMul S R] [IsScalarTower S R R] :
                  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 (mk f) x = (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 (of f) x = (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) :
                    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) :
                    instance AdjoinRoot.instAlgebra {R : Type u} {S : Type v} [CommRing R] (f : Polynomial R) [CommSemiring S] [Algebra S R] :

                    R[x]/(f) is R-algebra

                    Stacks Tag 09FX (second part)

                    Equations

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

                      Equations
                        Instances For
                          @[simp]
                          theorem AdjoinRoot.mkₐ_toRingHom {R : Type u} [CommRing R] (f : Polynomial R) :
                          (mkₐ f) = mk f
                          @[simp]
                          theorem AdjoinRoot.coe_mkₐ {R : Type u} [CommRing R] (f : Polynomial R) :
                          (mkₐ f) = (mk f)
                          @[simp]

                          The adjoined root.

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

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

                                theorem AdjoinRoot.algHom_ext_iff {R : Type u} {S : Type v} [CommRing R] {f : Polynomial R} [Semiring S] [Algebra R S] {g₁ g₂ : AdjoinRoot f →ₐ[R] S} :
                                g₁ = g₂ g₁ (root f) = g₂ (root f)
                                @[simp]
                                theorem AdjoinRoot.mk_eq_mk {R : Type u} [CommRing R] {f g h : Polynomial R} :
                                (mk f) g = (mk f) h f g - h
                                @[simp]
                                theorem AdjoinRoot.mk_eq_zero {R : Type u} [CommRing R] {f g : Polynomial R} :
                                (mk f) g = 0 f g
                                @[simp]
                                theorem AdjoinRoot.mk_self {R : Type u} [CommRing R] {f : Polynomial R} :
                                (mk f) f = 0
                                @[simp]
                                theorem AdjoinRoot.mk_C {R : Type u} [CommRing R] {f : Polynomial R} (x : R) :
                                (mk f) (Polynomial.C x) = (of f) x
                                @[simp]
                                theorem AdjoinRoot.mk_X {R : Type u} [CommRing R] {f : Polynomial R} :
                                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) :
                                (mk f) g 0
                                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) :
                                (mk f) g 0
                                @[simp]
                                theorem AdjoinRoot.aeval_eq {R : Type u} [CommRing R] {f : Polynomial R} (p : Polynomial R) :
                                (Polynomial.aeval (root f)) p = (mk f) p
                                @[simp]
                                theorem AdjoinRoot.eval₂_root {R : Type u} [CommRing R] (f : Polynomial R) :
                                theorem AdjoinRoot.isAlgebraic_root {R : Type u} [CommRing R] {f : Polynomial R} (hf : f 0) :
                                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
                                  Instances For
                                    @[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) :
                                    (lift i a h) ((mk f) g) = Polynomial.eval₂ i a g
                                    @[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) :
                                    (lift i a h) (root f) = a
                                    @[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} :
                                    (lift i a h) ((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) :
                                    (lift i a h).comp (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
                                      Instances For
                                        @[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) :
                                        (liftHom f x hfx) = lift (algebraMap R S) x hfx
                                        @[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) :
                                        (Polynomial.aeval (ϕ (root f))) f = 0
                                        @[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) :
                                        liftHom f (ϕ (root f)) = ϕ
                                        @[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} :
                                        (liftHom f a hfx) ((mk f) g) = (Polynomial.aeval a) g
                                        @[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) :
                                        (liftHom f a hfx) (root f) = a
                                        @[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} :
                                        (liftHom f a hfx) ((of f) x) = (algebraMap R S) x
                                        @[simp]
                                        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)] :

                                          If R is a field and f is irreducible, then AdjoinRoot f is a field

                                          Stacks Tag 09FX (first part, see also 09FI)

                                          Equations
                                            theorem AdjoinRoot.coe_injective {K : Type w} [Field K] {f : Polynomial K} (h : f.degree 0) :
                                            theorem AdjoinRoot.isIntegral_root' {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
                                              Instances For
                                                @[simp]
                                                theorem AdjoinRoot.modByMonicHom_mk {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) (f : Polynomial R) :
                                                (modByMonicHom hg) ((mk g) f) = f %ₘ 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
                                                  Instances For
                                                    theorem AdjoinRoot.powerBasisAux'_repr_symm_apply {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) (c : Fin g.natDegree →₀ R) :
                                                    (powerBasisAux' hg).repr.symm c = (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) :
                                                    ((powerBasisAux' hg).repr f) i = ((modByMonicHom hg) f).coeff i
                                                    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
                                                      Instances For
                                                        @[simp]
                                                        theorem AdjoinRoot.powerBasis'_gen {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) :
                                                        @[simp]
                                                        theorem AdjoinRoot.powerBasis'_dim {R : Type u} [CommRing R] {g : Polynomial R} (hg : g.Monic) :

                                                        An unwrapped version of AdjoinRoot.free_of_monic for better discoverability.

                                                        An unwrapped version of AdjoinRoot.finite_of_monic for better discoverability.

                                                        theorem AdjoinRoot.isIntegral_root {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :
                                                        def AdjoinRoot.powerBasisAux {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :

                                                        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
                                                          Instances For
                                                            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
                                                              Instances For
                                                                @[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) :
                                                                theorem AdjoinRoot.minpoly_powerBasis_gen_of_monic {K : Type w} [Field K] {f : Polynomial K} (hf : f.Monic) (hf' : 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
                                                                  Instances For
                                                                    @[simp]
                                                                    theorem AdjoinRoot.Minpoly.coe_toAdjoin {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] {x : S} :
                                                                    (toAdjoin R x) = (liftHom (minpoly R x) x, )
                                                                    @[deprecated AdjoinRoot.Minpoly.coe_toAdjoin (since := "2025-07-21")]
                                                                    theorem AdjoinRoot.Minpoly.toAdjoin_apply {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] {x : S} :
                                                                    (toAdjoin R x) = (liftHom (minpoly R x) x, )

                                                                    Alias of AdjoinRoot.Minpoly.coe_toAdjoin.

                                                                    @[deprecated AdjoinRoot.Minpoly.coe_toAdjoin (since := "2025-07-21")]
                                                                    theorem AdjoinRoot.Minpoly.toAdjoin_apply' {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] {x : S} :
                                                                    (toAdjoin R x) = (liftHom (minpoly R x) x, )

                                                                    Alias of AdjoinRoot.Minpoly.coe_toAdjoin.

                                                                    theorem AdjoinRoot.Minpoly.coe_toAdjoin_mk_X {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] {x : S} :
                                                                    ((toAdjoin R x) ((mk (minpoly R x)) Polynomial.X)) = x
                                                                    @[deprecated AdjoinRoot.Minpoly.coe_toAdjoin_mk_X (since := "2025-07-21")]
                                                                    theorem AdjoinRoot.Minpoly.toAdjoin.apply_X {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] {x : S} :
                                                                    ((toAdjoin R x) ((mk (minpoly R x)) Polynomial.X)) = x

                                                                    Alias of AdjoinRoot.Minpoly.coe_toAdjoin_mk_X.

                                                                    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 (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
                                                                      Instances For
                                                                        @[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 (root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :
                                                                        (equiv' g pb h₁ h₂) = (liftHom g pb.gen h₂)
                                                                        @[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 (root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :
                                                                        (equiv' g pb h₁ h₂).symm = (pb.lift (root g) h₁)
                                                                        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 (root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :
                                                                        (equiv' g pb h₁ h₂) = 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 (root g)) (minpoly R pb.gen) = 0) (h₂ : (Polynomial.aeval pb.gen) g = 0) :
                                                                        (equiv' g pb h₁ h₂).symm = pb.lift (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
                                                                          Instances For

                                                                            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
                                                                              Instances For

                                                                                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
                                                                                  Instances For

                                                                                    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
                                                                                      Instances For

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

                                                                                        Equations
                                                                                          Instances For

                                                                                            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
                                                                                              Instances For

                                                                                                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.