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

    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 (↑(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
      Instances For
        @[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)

        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₁ : 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} :
          ↑(AdjoinRoot.mk f) f = 0
          @[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
          @[simp]
          theorem AdjoinRoot.aeval_eq {R : Type u} [CommRing R] {f : Polynomial R} (p : Polynomial R) :
          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) :
            @[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) :
            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
            • One or more equations did not get rendered due to their size.
            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) :
              @[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 (ϕ (AdjoinRoot.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) :
              AdjoinRoot.liftHom f (ϕ (AdjoinRoot.root f)) (_ : ↑(Polynomial.aeval (ϕ (AdjoinRoot.root f))) f = 0) = ϕ
              @[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} :
              ↑(AdjoinRoot.liftHom f a hfx) (↑(AdjoinRoot.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) :
              @[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)
              noncomputable instance AdjoinRoot.field {K : Type w} [Field K] {f : Polynomial K} [Fact (Irreducible f)] :
              Equations
              • One or more equations did not get rendered due to their size.
              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

              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
              • One or more equations did not get rendered due to their size.
              Instances For
                @[simp]
                theorem AdjoinRoot.modByMonicHom_mk {R : Type u} [CommRing R] {g : Polynomial R} (hg : Polynomial.Monic g) (f : Polynomial R) :

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

                  The power basis 1, root g, ..., root g ^ (d - 1) 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.
                  Instances For
                    theorem AdjoinRoot.minpoly_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
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      @[simp]
                      theorem AdjoinRoot.powerBasis_gen {K : Type w} [Field K] {f : Polynomial K} (hf : f 0) :
                      @[simp]
                      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
                      • One or more equations did not get rendered due to their size.
                      Instances For
                        theorem AdjoinRoot.minpoly_powerBasis_gen {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 : Polynomial.Monic f) (hf' : optParam (f 0) (_ : f 0)) :
                        @[simp]
                        theorem AdjoinRoot.Minpoly.toAdjoin_apply (R : Type u) {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (x : S) :
                        ∀ (a : Polynomial R Submodule.toAddSubgroup (Ideal.span {minpoly R x})), ↑(AdjoinRoot.Minpoly.toAdjoin R x) a = ↑(QuotientAddGroup.lift (Submodule.toAddSubgroup (Ideal.span {minpoly R x})) ↑(Polynomial.eval₂RingHom (algebraMap R { x // x Algebra.adjoin R {x} }) { val := x, property := (_ : x Algebra.adjoin R {x}) }) (_ : ∀ (g : Polynomial R), g Ideal.span {minpoly R x}↑(Polynomial.eval₂RingHom (algebraMap R { x // x Algebra.adjoin R {x} }) { val := x, property := (_ : x Algebra.adjoin R {x}) }) g = 0)) a
                        def AdjoinRoot.Minpoly.toAdjoin (R : Type u) {S : Type v} [CommRing R] [CommRing S] [Algebra R S] (x : S) :
                        AdjoinRoot (minpoly R x) →ₐ[R] { x // x Algebra.adjoin R {x} }

                        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 minpoly.equivAdjoin.

                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For
                          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) { val := x, property := (_ : x Algebra.adjoin R {x}) } (_ : ↑(Polynomial.aeval { val := x, property := (_ : x Algebra.adjoin R {x}) }) (minpoly R x) = 0)) 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) = { val := x, property := (_ : x Algebra.adjoin R {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) :
                          ↑(AlgEquiv.symm (AdjoinRoot.equiv' g pb h₁ h₂)) = ↑(PowerBasis.lift pb (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.
                          Instances For
                            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) :
                            def AdjoinRoot.equiv (L : Type u_1) (F : Type u_2) [Field F] [Field L] [Algebra F L] (f : Polynomial F) (hf : f 0) :

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

                                      Promote AdjoinRoot.quotAdjoinRootEquivQuotPolynomialQuot to an alg_equiv.

                                      Equations
                                      • One or more equations did not get rendered due to their size.
                                      Instances For
                                        @[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), ↑(PowerBasis.quotientEquivQuotientMinpolyMap pb I) a = ↑(AdjoinRoot.quotAdjoinRootEquivQuotPolynomialQuot I (minpoly R pb.gen)) (OneHom.toFun (↑(Ideal.quotientMap (Ideal.map (AdjoinRoot.of (minpoly R pb.gen)) I) ↑(RingEquiv.symm ↑(AdjoinRoot.equiv' (minpoly R pb.gen) pb (_ : ↑(Polynomial.aeval (AdjoinRoot.root (minpoly R pb.gen))) (minpoly R pb.gen) = 0) (_ : ↑(Polynomial.aeval pb.gen) (minpoly R pb.gen) = 0))) (_ : Ideal.map (algebraMap R S) I Ideal.comap (↑(RingEquiv.symm ↑(AdjoinRoot.equiv' (minpoly R pb.gen) pb (_ : ↑(Polynomial.aeval (AdjoinRoot.root (minpoly R pb.gen))) (minpoly R pb.gen) = 0) (_ : ↑(Polynomial.aeval pb.gen) (minpoly R pb.gen) = 0)))) (Ideal.map (AdjoinRoot.of (minpoly R pb.gen)) I)))) a)
                                        @[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)}), ↑(AlgEquiv.symm (PowerBasis.quotientEquivQuotientMinpolyMap pb I)) a = ↑(MulEquiv.symm ↑(AlgEquiv.ofRingEquiv (_ : ∀ (x : R), ↑(Ideal.quotientEquiv (Ideal.map (algebraMap R S) I) (Ideal.map (AdjoinRoot.of (minpoly R pb.gen)) I) (AlgEquiv.toRingEquiv (AlgEquiv.symm (AdjoinRoot.equiv' (minpoly R pb.gen) pb (_ : ↑(Polynomial.aeval (AdjoinRoot.root (minpoly R pb.gen))) (minpoly R pb.gen) = 0) (_ : ↑(Polynomial.aeval pb.gen) (minpoly R pb.gen) = 0)))) (_ : Ideal.map (AdjoinRoot.of (minpoly R pb.gen)) I = Ideal.map (↑(AlgEquiv.toRingEquiv (AlgEquiv.symm (AdjoinRoot.equiv' (minpoly R pb.gen) pb (_ : ↑(Polynomial.aeval (AdjoinRoot.root (minpoly R pb.gen))) (minpoly R pb.gen) = 0) (_ : ↑(Polynomial.aeval pb.gen) (minpoly R pb.gen) = 0))))) (Ideal.map (algebraMap R S) I))) (↑(algebraMap R (S Ideal.map (algebraMap R S) I)) x) = ↑(algebraMap R (AdjoinRoot (minpoly R pb.gen) Ideal.map (AdjoinRoot.of (minpoly R pb.gen)) I)) x))) (↑(MulEquiv.symm ↑(AdjoinRoot.quotEquivQuotMap (minpoly R pb.gen) I)) 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
                                        • One or more equations did not get rendered due to their size.
                                        Instances For