Macaulay2 » Documentation
Packages » DGAlgebras » Building DG modules, submodules, and quotients » freeDGModule
next | previous | forward | backward | up | index | toc

freeDGModule -- Construct a free DG module over a DG algebra

Description

The differential is initially set to zero on every generator, and is customized afterward via setDiff. Because the constructor returns a free DGModule, the result can serve as a building block for semifree resolutions (see adjoinGenerators and semifreeResolution) or as the starting point for a hand-built DG module, as illustrated below.

Here we build the 2-periodic minimal free resolution of the residue field over the hypersurface R = k[x]/(x^2) — the prototypical Eisenbud matrix factorization — as an infinite semifree DG module over the Koszul DG algebra:

i1 : R = QQ[x] / ideal(x^2)

o1 = R

o1 : QuotientRing
i2 : A = koszulComplexDGA R

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

o2 : DGAlgebra
i3 : F = freeDGModule(A, toList(0..4))

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

o3 : DGModule
i4 : natGens = apply(rank F.natural, i -> (F.natural)_i)

o4 = {| 1 |, | 0 |, | 0 |, | 0 |, | 0 |}
      | 0 |  | 1 |  | 0 |  | 0 |  | 0 |
      | 0 |  | 0 |  | 1 |  | 0 |  | 0 |
      | 0 |  | 0 |  | 0 |  | 1 |  | 0 |
      | 0 |  | 0 |  | 0 |  | 0 |  | 1 |

o4 : List
i5 : setDiff(F, {0, x * natGens#0, x * natGens#1, x * natGens#2, x * natGens#3})

o5 = {Base ring => R                                               }
      DG algebra => R[T   ]
                       1,1
                                 5
      Natural module => (R[T   ])
                            1,1
      Generator degrees => {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}}
      Differentials on gens => {0, | x |, | 0 |, | 0 |, | 0 |}
                                   | 0 |  | x |  | 0 |  | 0 |
                                   | 0 |  | 0 |  | x |  | 0 |
                                   | 0 |  | 0 |  | 0 |  | x |
                                   | 0 |  | 0 |  | 0 |  | 0 |

o5 : DGModule
i6 : apply(1..4, n -> moduleDifferential(n, F))

o6 = (| x x |, {1} | -x 0 |, {1} | -x 0 |, {1} | -x 0 |)
               {0} | x  x |  {0} | x  x |  {0} | x  x |

o6 : Sequence

The differential alternates between multiplication by x in every degree, matching the classical 2-periodic resolution of the residue field. Its homology is concentrated in degree zero:

i7 : apply(0..3, n -> prune homology(n, F))

o7 = (cokernel | x |, cokernel | x |, 0, 0)

o7 : Sequence

More elaborate differentials are possible once multiple generators sit in overlapping hom-degrees. Here is a rank-3 toy example where F_1 has two generators and d_1 sends them to x and y respectively, recovering the truncation of the Koszul complex on (x, y):

i8 : S = QQ[x, y]

o8 = S

o8 : PolynomialRing
i9 : AS = koszulComplexDGA S

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

o9 : DGAlgebra
i10 : G = freeDGModule(AS, {0, 1, 1})

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

o10 : DGModule
i11 : natG = apply(rank G.natural, i -> (G.natural)_i)

o11 = {| 1 |, | 0 |, | 0 |}
       | 0 |  | 1 |  | 0 |
       | 0 |  | 0 |  | 1 |

o11 : List
i12 : setDiff(G, {0, x * natG#0, y * natG#0})

o12 = {Base ring => S                               }
       DG algebra => S[T   ..T   ]
                        1,1   1,2
                                        3
       Natural module => (S[T   ..T   ])
                             1,1   1,2
       Generator degrees => {{0, 0}, {1, 0}, {1, 0}}
       Differentials on gens => {0, | x |, | y |}
                                    | 0 |  | 0 |
                                    | 0 |  | 0 |

o12 : DGModule
i13 : moduleDifferential(1, G)

o13 = | x y x y |

              1      4
o13 : Matrix S  <-- S

Internal degrees from a multi-graded base ring are inherited; a plain homological degree is padded with zeros to match.

i14 : Rg = ZZ/101[x, y, Degrees => {{1, 0}, {0, 1}}]

o14 = Rg

o14 : PolynomialRing
i15 : Ag = koszulComplexDGA Rg

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

o15 : DGAlgebra
i16 : Mg = freeDGModule(Ag, {{0, 0, 0}, {1, 0, 0}})

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

o16 : DGModule
i17 : degrees Mg

o17 = {{0, 0, 0}, {1, 0, 0}}

o17 : List

The empty-list form gives the zero DG module.

i18 : M0 = freeDGModule(A, {})

o18 = {Base ring => R             }
  DG algebra => R[T   ]
                   1,1
  Natural module => 0
  Generator degrees => {}
  Differentials on gens => {}

o18 : DGModule
i19 : isZero M0

o19 = true

See also

Ways to use freeDGModule:

  • freeDGModule(DGAlgebra,List)

For the programmer

The object freeDGModule is a method function.


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