Macaulay2 » Documentation
Packages » DGAlgebras » Base change and tensor with non-DG types
next | previous | forward | backward | up | index | toc

Base change and tensor with non-DG types -- Tensoring DG objects with ordinary rings and modules

The DGAlgebras package extends ** so that every DG object (DGAlgebra, DGModule, DGSubmodule, DGQuotientModule, DGIdeal, DGAlgebraMap, DGModuleMap) can be base-changed along any ring map out of the ground ring. It also defines the exterior tensor of a DGModule with an ordinary Module, subsuming the usual ring-of-scalars base change as the special case M ** S^1.

Two design choices make these operations usable in larger constructions.

Caching (object identity). Both DGAlgebra ** Ring and DGModule ** Ring cache their result, so repeated calls with the same operands return the SAME object. This matters because a DGAlgebraMap or DGModuleMap is tagged by its source and target DG-objects, and without identity the source of id_M ** S and the target of id_M ** S would be two distinct (though isomorphic) DGModules.

Functoriality. These operations are functorial: if id is the identity DGModuleMap on M, then id ** S is the identity DGModuleMap on M ** S; likewise for DGAlgebraMaps. Composition is preserved.

i1 : R = ZZ/101[x,y]

o1 = R

o1 : PolynomialRing
i2 : A = koszulComplexDGA R

o2 = {Ring => R                          }
      Underlying algebra => R[T   ..T   ]
                               1,1   1,2
      Differential => {x, y}

o2 : DGAlgebra
i3 : M = freeDGModule(A, {0, 1})

o3 = {Base ring => R                       }
      DG algebra => R[T   ..T   ]
                       1,1   1,2
                                       2
      Natural module => (R[T   ..T   ])
                            1,1   1,2
      Generator degrees => {{0, 0}, {1, 0}}
      Differentials on gens => {0, 0}

o3 : DGModule
i4 : QR = R / ideal(x^2)

o4 = QR

o4 : QuotientRing
i5 : MQ = M ** QR

o5 = {Base ring => QR                      }
      DG algebra => QR[T   ..T   ]
                        1,1   1,2
                                        2
      Natural module => (QR[T   ..T   ])
                             1,1   1,2
      Generator degrees => {{0, 0}, {1, 0}}
      Differentials on gens => {0, 0}

o5 : DGModule
i6 : MQ === M ** QR

o6 = true
i7 : idM = identityDGModuleMap M

                               2
o7 = {Source => (R[T   ..T   ]) }
                    1,1   1,2
                               2
      Target => (R[T   ..T   ])
                    1,1   1,2
      Natural => {0, 0} | 1 0 |
                 {1, 0} | 0 1 |

o7 : DGModuleMap
i8 : (idM ** QR).source === MQ

o8 = true
i9 : (idM ** QR).target === MQ

o9 = true
i10 : isWellDefined(idM ** QR)

o10 = true

For a DGModule M and an ordinary free module N, M ** N forms the exterior tensor product over A.natural. This lets you tensor by copies of a ring, by direct sums, or by arbitrary graded shifts without leaving the DG world.

i11 : N = R^{0, -1}

       2
o11 = R

o11 : R-module, free, degrees {0..1}
i12 : MN = M ** N

o12 = {Base ring => R                                       }
       DG algebra => R[T   ..T   ]
                        1,1   1,2
                                        4
       Natural module => (R[T   ..T   ])
                             1,1   1,2
       Generator degrees => {{0, 0}, {0, 1}, {1, 0}, {1, 1}}
       Differentials on gens => {0, 0, 0, 0}

o12 : DGModule
i13 : class MN

o13 = DGModule

o13 : Type
i14 : numgens MN

o14 = 4
i15 : rank MN.natural == (rank M.natural) * (rank N)

o15 = true

The tensor is associative in the natural way: you can chain (M ** N) ** K for a sequence of ordinary free modules, producing a DGModule whose natural rank is the product of the ranks.

i16 : K = R^3

       3
o16 = R

o16 : R-module, free
i17 : MNK = (M ** R^2) ** K

o17 = {Base ring => R                                                                                                       }
       DG algebra => R[T   ..T   ]
                        1,1   1,2
                                        12
       Natural module => (R[T   ..T   ])
                             1,1   1,2
       Generator degrees => {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}}
       Differentials on gens => {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

o17 : DGModule
i18 : isWellDefined MNK

o18 = true
i19 : numgens MNK == 2 * 2 * 3

o19 = true

A deliberate omission: there is no ** Ideal method. For an ideal I, the underlying module module I is almost never free, so exterior tensor with a DGModule is not well-defined in our framework. Use ** (R/I) for base change along the quotient instead.

Menu


The source of this document is in /build/reproducible-path/macaulay2-1.26.05+ds/M2/Macaulay2/packages/DGAlgebras/doc.m2:1780:0.