This is the EXTERIOR tensor product: we do not quotient by an A- or B-action. The resulting DGModule lives over A ** B via the canonical inclusions. The result is cached on M.cache, so M ** N returns the same object on repeat.
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 : ng = apply(rank M.natural, i -> (M.natural)_i)
o4 = {| 1 |, | 0 |}
| 0 | | 1 |
o4 : List
|
i5 : setDiff(M, {0, x * ng#0})
o5 = {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, | x |}
| 0 |
o5 : DGModule
|
i6 : P = M ** M
o6 = {Base ring => R }
DG algebra => R[T ..T ]
1,1 1,4
4
Natural module => (R[T ..T ])
1,1 1,4
Generator degrees => {{0, 0}, {1, 0}, {1, 0}, {2, 0}}
Differentials on gens => {0, | x |, | x |, | 0 |}
| 0 | | 0 | | x |
| 0 | | 0 | | -x |
| 0 | | 0 | | 0 |
o6 : DGModule
|
i7 : P.dgAlgebra === (A ** A)
o7 = true
|