Documentation

Mathlib.Algebra.Algebra.Unitization

Unitization of a non-unital algebra #

Given a non-unital R-algebra A (given via the type classes [NonUnitalRing A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A]) we construct the minimal unital R-algebra containing A as an ideal. This object algebra.unitization R A is a type synonym for R × A on which we place a different multiplicative structure, namely, (r₁, a₁) * (r₂, a₂) = (r₁ * r₂, r₁ • a₂ + r₂ • a₁ + a₁ * a₂) where the multiplicative identity is (1, 0).

Note, when A is a unital R-algebra, then Unitization R A constructs a new multiplicative identity different from the old one, and so in general Unitization R A and A will not be isomorphic even in the unital case. This approach actually has nice functorial properties.

There is a natural coercion from A to Unitization R A given by fun a ↦ (0, a), the image of which is a proper ideal (TODO), and when R is a field this ideal is maximal. Moreover, this ideal is always an essential ideal (it has nontrivial intersection with every other nontrivial ideal).

Every non-unital algebra homomorphism from A into a unital R-algebra B has a unique extension to a (unital) algebra homomorphism from Unitization R A to B.

Main definitions #

Main results #

TODO #

def Unitization (R : Type u_1) (A : Type u_2) :
Type (max u_1 u_2)

The minimal unitization of a non-unital R-algebra A. This is just a type synonym for R × A.

Instances For
    def Unitization.inl {R : Type u_1} {A : Type u_2} [Zero A] (r : R) :

    The canonical inclusion R → Unitization R A.

    Instances For
      def Unitization.inr {R : Type u_1} {A : Type u_2} [Zero R] (a : A) :

      The canonical inclusion A → Unitization R A.

      Instances For
        instance Unitization.instCoeTCUnitization {R : Type u_1} {A : Type u_2} [Zero R] :
        def Unitization.fst {R : Type u_1} {A : Type u_2} (x : Unitization R A) :
        R

        The canonical projection Unitization R A → R.

        Instances For
          def Unitization.snd {R : Type u_1} {A : Type u_2} (x : Unitization R A) :
          A

          The canonical projection Unitization R A → A.

          Instances For
            theorem Unitization.ext {R : Type u_1} {A : Type u_2} {x : Unitization R A} {y : Unitization R A} (h1 : Unitization.fst x = Unitization.fst y) (h2 : Unitization.snd x = Unitization.snd y) :
            x = y
            @[simp]
            theorem Unitization.fst_inl {R : Type u_1} (A : Type u_2) [Zero A] (r : R) :
            @[simp]
            theorem Unitization.snd_inl {R : Type u_1} (A : Type u_2) [Zero A] (r : R) :
            @[simp]
            theorem Unitization.fst_inr (R : Type u_1) {A : Type u_2} [Zero R] (a : A) :
            @[simp]
            theorem Unitization.snd_inr (R : Type u_1) {A : Type u_2} [Zero R] (a : A) :
            theorem Unitization.inl_injective {R : Type u_1} {A : Type u_2} [Zero A] :
            Function.Injective Unitization.inl
            theorem Unitization.inr_injective {R : Type u_1} {A : Type u_2} [Zero R] :
            Function.Injective Unitization.inr
            instance Unitization.instNontrivialLeft {𝕜 : Type u_3} {A : Type u_4} [Nontrivial 𝕜] [Nonempty A] :
            instance Unitization.instNontrivialRight {𝕜 : Type u_3} {A : Type u_4} [Nonempty 𝕜] [Nontrivial A] :

            Structures inherited from Prod #

            Additive operators and scalar multiplication operate elementwise.

            instance Unitization.instZero {R : Type u_3} {A : Type u_4} [Zero R] [Zero A] :
            instance Unitization.instAdd {R : Type u_3} {A : Type u_4} [Add R] [Add A] :
            instance Unitization.instNeg {R : Type u_3} {A : Type u_4} [Neg R] [Neg A] :
            instance Unitization.instAddGroup {R : Type u_3} {A : Type u_4} [AddGroup R] [AddGroup A] :
            instance Unitization.instSMul {S : Type u_2} {R : Type u_3} {A : Type u_4} [SMul S R] [SMul S A] :
            instance Unitization.instIsScalarTower {T : Type u_1} {S : Type u_2} {R : Type u_3} {A : Type u_4} [SMul T R] [SMul T A] [SMul S R] [SMul S A] [SMul T S] [IsScalarTower T S R] [IsScalarTower T S A] :
            instance Unitization.instSMulCommClass {T : Type u_1} {S : Type u_2} {R : Type u_3} {A : Type u_4} [SMul T R] [SMul T A] [SMul S R] [SMul S A] [SMulCommClass T S R] [SMulCommClass T S A] :
            instance Unitization.instIsCentralScalar {S : Type u_2} {R : Type u_3} {A : Type u_4} [SMul S R] [SMul S A] [SMul Sᵐᵒᵖ R] [SMul Sᵐᵒᵖ A] [IsCentralScalar S R] [IsCentralScalar S A] :
            instance Unitization.instMulAction {S : Type u_2} {R : Type u_3} {A : Type u_4} [Monoid S] [MulAction S R] [MulAction S A] :
            instance Unitization.instModule {S : Type u_2} {R : Type u_3} {A : Type u_4} [Semiring S] [AddCommMonoid R] [AddCommMonoid A] [Module S R] [Module S A] :
            def Unitization.addEquiv (R : Type u_3) (A : Type u_4) [Add R] [Add A] :

            The identity map between Unitization R A and R × A as an AddEquiv.

            Instances For
              @[simp]
              theorem Unitization.fst_zero {R : Type u_3} {A : Type u_4} [Zero R] [Zero A] :
              @[simp]
              theorem Unitization.snd_zero {R : Type u_3} {A : Type u_4} [Zero R] [Zero A] :
              @[simp]
              theorem Unitization.fst_add {R : Type u_3} {A : Type u_4} [Add R] [Add A] (x₁ : Unitization R A) (x₂ : Unitization R A) :
              @[simp]
              theorem Unitization.snd_add {R : Type u_3} {A : Type u_4} [Add R] [Add A] (x₁ : Unitization R A) (x₂ : Unitization R A) :
              @[simp]
              theorem Unitization.fst_neg {R : Type u_3} {A : Type u_4} [Neg R] [Neg A] (x : Unitization R A) :
              @[simp]
              theorem Unitization.snd_neg {R : Type u_3} {A : Type u_4} [Neg R] [Neg A] (x : Unitization R A) :
              @[simp]
              theorem Unitization.fst_smul {S : Type u_2} {R : Type u_3} {A : Type u_4} [SMul S R] [SMul S A] (s : S) (x : Unitization R A) :
              @[simp]
              theorem Unitization.snd_smul {S : Type u_2} {R : Type u_3} {A : Type u_4} [SMul S R] [SMul S A] (s : S) (x : Unitization R A) :
              @[simp]
              theorem Unitization.inl_zero {R : Type u_3} (A : Type u_4) [Zero R] [Zero A] :
              @[simp]
              theorem Unitization.inl_add {R : Type u_3} (A : Type u_4) [Add R] [AddZeroClass A] (r₁ : R) (r₂ : R) :
              @[simp]
              theorem Unitization.inl_neg {R : Type u_3} (A : Type u_4) [Neg R] [AddGroup A] (r : R) :
              @[simp]
              theorem Unitization.inl_smul {S : Type u_2} {R : Type u_3} (A : Type u_4) [Monoid S] [AddMonoid A] [SMul S R] [DistribMulAction S A] (s : S) (r : R) :
              @[simp]
              theorem Unitization.inr_zero (R : Type u_3) {A : Type u_4} [Zero R] [Zero A] :
              0 = 0
              @[simp]
              theorem Unitization.inr_add (R : Type u_3) {A : Type u_4} [AddZeroClass R] [Add A] (m₁ : A) (m₂ : A) :
              ↑(m₁ + m₂) = m₁ + m₂
              @[simp]
              theorem Unitization.inr_neg (R : Type u_3) {A : Type u_4} [AddGroup R] [Neg A] (m : A) :
              ↑(-m) = -m
              @[simp]
              theorem Unitization.inr_smul {S : Type u_2} (R : Type u_3) {A : Type u_4} [Zero R] [Zero S] [SMulWithZero S R] [SMul S A] (r : S) (m : A) :
              ↑(r m) = r m
              theorem Unitization.ind {R : Type u_5} {A : Type u_6} [AddZeroClass R] [AddZeroClass A] {P : Unitization R AProp} (h : (r : R) → (a : A) → P (Unitization.inl r + a)) (x : Unitization R A) :
              P x

              To show a property hold on all Unitization R A it suffices to show it holds on terms of the form inl r + a.

              This can be used as induction x using Unitization.ind.

              theorem Unitization.linearMap_ext {S : Type u_2} {R : Type u_3} {A : Type u_4} {N : Type u_5} [Semiring S] [AddCommMonoid R] [AddCommMonoid A] [AddCommMonoid N] [Module S R] [Module S A] [Module S N] ⦃f : Unitization R A →ₗ[S] N ⦃g : Unitization R A →ₗ[S] N (hl : ∀ (r : R), f (Unitization.inl r) = g (Unitization.inl r)) (hr : ∀ (a : A), f a = g a) :
              f = g

              This cannot be marked @[ext] as it ends up being used instead of LinearMap.prod_ext when working with R × A.

              @[simp]
              theorem Unitization.inrHom_apply (R : Type u_3) (A : Type u_4) [Semiring R] [AddCommMonoid A] [Module R A] (a : A) :
              ↑(Unitization.inrHom R A) a = a
              def Unitization.inrHom (R : Type u_3) (A : Type u_4) [Semiring R] [AddCommMonoid A] [Module R A] :

              The canonical R-linear inclusion A → Unitization R A.

              Instances For
                @[simp]
                theorem Unitization.sndHom_apply (R : Type u_3) (A : Type u_4) [Semiring R] [AddCommMonoid A] [Module R A] (x : Unitization R A) :
                def Unitization.sndHom (R : Type u_3) (A : Type u_4) [Semiring R] [AddCommMonoid A] [Module R A] :

                The canonical R-linear projection Unitization R A → A.

                Instances For

                  Multiplicative structure #

                  instance Unitization.instOne {R : Type u_1} {A : Type u_2} [One R] [Zero A] :
                  instance Unitization.instMul {R : Type u_1} {A : Type u_2} [Mul R] [Add A] [Mul A] [SMul R A] :
                  @[simp]
                  theorem Unitization.fst_one {R : Type u_1} {A : Type u_2} [One R] [Zero A] :
                  @[simp]
                  theorem Unitization.snd_one {R : Type u_1} {A : Type u_2} [One R] [Zero A] :
                  @[simp]
                  theorem Unitization.fst_mul {R : Type u_1} {A : Type u_2} [Mul R] [Add A] [Mul A] [SMul R A] (x₁ : Unitization R A) (x₂ : Unitization R A) :
                  @[simp]
                  theorem Unitization.snd_mul {R : Type u_1} {A : Type u_2} [Mul R] [Add A] [Mul A] [SMul R A] (x₁ : Unitization R A) (x₂ : Unitization R A) :
                  @[simp]
                  theorem Unitization.inl_one {R : Type u_1} (A : Type u_2) [One R] [Zero A] :
                  @[simp]
                  theorem Unitization.inl_mul {R : Type u_1} (A : Type u_2) [Monoid R] [NonUnitalNonAssocSemiring A] [DistribMulAction R A] (r₁ : R) (r₂ : R) :
                  theorem Unitization.inl_mul_inl {R : Type u_1} (A : Type u_2) [Monoid R] [NonUnitalNonAssocSemiring A] [DistribMulAction R A] (r₁ : R) (r₂ : R) :
                  @[simp]
                  theorem Unitization.inr_mul (R : Type u_1) {A : Type u_2} [Semiring R] [AddCommMonoid A] [Mul A] [SMulWithZero R A] (a₁ : A) (a₂ : A) :
                  ↑(a₁ * a₂) = a₁ * a₂
                  theorem Unitization.inl_mul_inr {R : Type u_1} {A : Type u_2} [Semiring R] [NonUnitalNonAssocSemiring A] [DistribMulAction R A] (r : R) (a : A) :
                  Unitization.inl r * a = ↑(r a)
                  theorem Unitization.inr_mul_inl {R : Type u_1} {A : Type u_2} [Semiring R] [NonUnitalNonAssocSemiring A] [DistribMulAction R A] (r : R) (a : A) :
                  a * Unitization.inl r = ↑(r a)
                  instance Unitization.instRing {R : Type u_1} {A : Type u_2} [CommRing R] [NonUnitalRing A] [Module R A] [IsScalarTower R A A] [SMulCommClass R A A] :
                  @[simp]
                  theorem Unitization.inlRingHom_apply (R : Type u_1) (A : Type u_2) [Semiring R] [NonUnitalSemiring A] [Module R A] (r : R) :
                  def Unitization.inlRingHom (R : Type u_1) (A : Type u_2) [Semiring R] [NonUnitalSemiring A] [Module R A] :

                  The canonical inclusion of rings R →+* Unitization R A.

                  Instances For

                    Star structure #

                    instance Unitization.instStar {R : Type u_1} {A : Type u_2} [Star R] [Star A] :
                    @[simp]
                    theorem Unitization.fst_star {R : Type u_1} {A : Type u_2} [Star R] [Star A] (x : Unitization R A) :
                    @[simp]
                    theorem Unitization.snd_star {R : Type u_1} {A : Type u_2} [Star R] [Star A] (x : Unitization R A) :
                    @[simp]
                    theorem Unitization.inl_star {R : Type u_1} {A : Type u_2} [Star R] [AddMonoid A] [StarAddMonoid A] (r : R) :
                    @[simp]
                    theorem Unitization.inr_star {R : Type u_1} {A : Type u_2} [AddMonoid R] [StarAddMonoid R] [Star A] (a : A) :
                    ↑(star a) = star a

                    Algebra structure #

                    instance Unitization.instAlgebra (S : Type u_1) (R : Type u_2) (A : Type u_3) [CommSemiring S] [CommSemiring R] [NonUnitalSemiring A] [Module R A] [IsScalarTower R A A] [SMulCommClass R A A] [Algebra S R] [DistribMulAction S A] [IsScalarTower S R A] :
                    theorem Unitization.algebraMap_eq_inl_comp (S : Type u_1) (R : Type u_2) (A : Type u_3) [CommSemiring S] [CommSemiring R] [NonUnitalSemiring A] [Module R A] [IsScalarTower R A A] [SMulCommClass R A A] [Algebra S R] [DistribMulAction S A] [IsScalarTower S R A] :
                    ↑(algebraMap S (Unitization R A)) = Unitization.inl ↑(algebraMap S R)
                    theorem Unitization.algebraMap_eq_inl (R : Type u_2) (A : Type u_3) [CommSemiring R] [NonUnitalSemiring A] [Module R A] [IsScalarTower R A A] [SMulCommClass R A A] :
                    ↑(algebraMap R (Unitization R A)) = Unitization.inl
                    @[simp]
                    theorem Unitization.fstHom_apply (R : Type u_2) (A : Type u_3) [CommSemiring R] [NonUnitalSemiring A] [Module R A] [IsScalarTower R A A] [SMulCommClass R A A] (x : Unitization R A) :
                    def Unitization.fstHom (R : Type u_2) (A : Type u_3) [CommSemiring R] [NonUnitalSemiring A] [Module R A] [IsScalarTower R A A] [SMulCommClass R A A] :

                    The canonical R-algebra projection Unitization R A → R.

                    Instances For
                      @[simp]
                      theorem Unitization.inrNonUnitalAlgHom_toFun (R : Type u_1) (A : Type u_2) [CommSemiring R] [NonUnitalSemiring A] [Module R A] (a : A) :
                      @[simp]
                      theorem Unitization.inrNonUnitalAlgHom_apply (R : Type u_1) (A : Type u_2) [CommSemiring R] [NonUnitalSemiring A] [Module R A] (a : A) :

                      The coercion from a non-unital R-algebra A to its unitization Unitization R A realized as a non-unital algebra homomorphism.

                      Instances For

                        The coercion from a non-unital R-algebra A to its unitization unitization R A realized as a non-unital star algebra homomorphism.

                        Instances For
                          theorem Unitization.algHom_ext {S : Type u_1} {R : Type u_2} {A : Type u_3} [CommSemiring S] [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {B : Type u_4} [Semiring B] [Algebra S B] [Algebra S R] [DistribMulAction S A] [IsScalarTower S R A] {F : Type u_6} [AlgHomClass F S (Unitization R A) B] {φ : F} {ψ : F} (h : ∀ (a : A), φ a = ψ a) (h' : ∀ (r : R), φ (↑(algebraMap R (Unitization R A)) r) = ψ (↑(algebraMap R (Unitization R A)) r)) :
                          φ = ψ
                          theorem Unitization.algHom_ext'' {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {C : Type u_5} [Semiring C] [Algebra R C] {F : Type u_6} [AlgHomClass F R (Unitization R A) C] {φ : F} {ψ : F} (h : ∀ (a : A), φ a = ψ a) :
                          φ = ψ

                          See note [partially-applied ext lemmas]

                          @[simp]
                          theorem NonUnitalAlgHom.toAlgHom_apply {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {C : Type u_5} [Semiring C] [Algebra R C] (φ : A →ₙₐ[R] C) (x : Unitization R A) :
                          def NonUnitalAlgHom.toAlgHom {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {C : Type u_5} [Semiring C] [Algebra R C] (φ : A →ₙₐ[R] C) :

                          A non-unital algebra homomorphism from A into a unital R-algebra C lifts to a unital algebra homomorphism from the unitization into C. This is extended to an Equiv in Unitization.lift and that should be used instead. This declaration only exists for performance reasons.

                          Instances For
                            @[simp]
                            theorem Unitization.lift_symm_apply {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {C : Type u_5} [Semiring C] [Algebra R C] (φ : Unitization R A →ₐ[R] C) :
                            Unitization.lift.symm φ = NonUnitalAlgHom.comp (φ) (Unitization.inrNonUnitalAlgHom R A)
                            @[simp]
                            theorem Unitization.lift_apply_apply {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {C : Type u_5} [Semiring C] [Algebra R C] (φ : A →ₙₐ[R] C) (x : Unitization R A) :
                            ↑(Unitization.lift φ) x = ↑(algebraMap R C) (Unitization.fst x) + φ (Unitization.snd x)
                            @[simp]
                            theorem Unitization.lift_apply {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {C : Type u_5} [Semiring C] [Algebra R C] (φ : A →ₙₐ[R] C) :
                            Unitization.lift φ = NonUnitalAlgHom.toAlgHom φ
                            def Unitization.lift {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {C : Type u_5} [Semiring C] [Algebra R C] :

                            Non-unital algebra homomorphisms from A into a unital R-algebra C lift uniquely to Unitization R A →ₐ[R] C. This is the universal property of the unitization.

                            Instances For
                              theorem Unitization.lift_symm_apply_apply {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] {C : Type u_5} [Semiring C] [Algebra R C] (φ : Unitization R A →ₐ[R] C) (a : A) :
                              ↑(Unitization.lift.symm φ) a = φ a
                              @[simp]
                              theorem NonUnitalAlgHom.toAlgHom_zero {R : Type u_2} {A : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] :
                              ↑(NonUnitalAlgHom.toAlgHom 0) = Unitization.fst

                              See note [partially-applied ext lemmas]

                              @[simp]
                              theorem Unitization.starLift_apply {R : Type u_1} {A : Type u_2} {C : Type u_3} [CommSemiring R] [StarRing R] [NonUnitalSemiring A] [StarRing A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] [Semiring C] [Algebra R C] [StarRing C] [StarModule R C] (φ : A →⋆ₙₐ[R] C) :
                              Unitization.starLift φ = { toAlgHom := NonUnitalAlgHom.toAlgHom φ.toNonUnitalAlgHom, map_star' := (_ : ∀ (x : Unitization R A), OneHom.toFun (↑(Unitization.lift φ.toNonUnitalAlgHom)) (star x) = star (OneHom.toFun (↑(Unitization.lift φ.toNonUnitalAlgHom)) x)) }
                              @[simp]
                              theorem Unitization.starLift_apply_apply {R : Type u_1} {A : Type u_2} {C : Type u_3} [CommSemiring R] [StarRing R] [NonUnitalSemiring A] [StarRing A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] [Semiring C] [Algebra R C] [StarRing C] [StarModule R C] (φ : A →⋆ₙₐ[R] C) (x : Unitization R A) :
                              ↑(Unitization.starLift φ) x = ↑(algebraMap R C) (Unitization.fst x) + φ (Unitization.snd x)
                              @[simp]
                              def Unitization.starLift {R : Type u_1} {A : Type u_2} {C : Type u_3} [CommSemiring R] [StarRing R] [NonUnitalSemiring A] [StarRing A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] [Semiring C] [Algebra R C] [StarRing C] [StarModule R C] :

                              Non-unital star algebra homomorphisms from A into a unital star R-algebra C lift uniquely to Unitization R A →⋆ₐ[R] C. This is the universal property of the unitization.

                              Instances For
                                @[simp]
                                theorem Unitization.starLift_symm_apply_apply {R : Type u_1} {A : Type u_2} {C : Type u_3} [CommSemiring R] [NonUnitalSemiring A] [Module R A] [SMulCommClass R A A] [IsScalarTower R A A] [Semiring C] [Algebra R C] (φ : Unitization R A →ₐ[R] C) (a : A) :
                                ↑(Unitization.lift.symm φ) a = φ a