There are several natural ways to handle chain complexes; for details, see
ChainComplex. Let's illustrate by making two chain complexes.
i1 : R = QQ[x,y];
|
i2 : M = coker vars R
o2 = cokernel | x y |
1
o2 : R-module, quotient of R
|
i3 : N = coker matrix {{x}}
o3 = cokernel | x |
1
o3 : R-module, quotient of R
|
i4 : C = res M
1 2 1
o4 = R <-- R <-- R <-- 0
0 1 2 3
o4 : ChainComplex
|
i5 : D = res N
1 1
o5 = R <-- R <-- 0
0 1 2
o5 : ChainComplex
|
We can form the direct sum as follows.
i6 : C ++ D
2 3 1
o6 = R <-- R <-- R <-- 0
0 1 2 3
o6 : ChainComplex
|
We can shift the degree, using the traditional notation.
i7 : E = C[5]
1 2 1
o7 = R <-- R <-- R <-- 0
-5 -4 -3 -2
o7 : ChainComplex
|
i8 : E_-4 == C_1
o8 = true
|
The same syntax can be used to make a chain complex from a single module.
i9 : R^4[1]
4
o9 = R
-1
o9 : ChainComplex
|
We can form various tensor products with
**, and compute
Tor using them.
i10 : M ** D
o10 = M <-- cokernel {1} | x y |
0 1
o10 : ChainComplex
|
i11 : C ** D
1 3 3 1
o11 = R <-- R <-- R <-- R <-- 0 <-- 0
0 1 2 3 4 5
o11 : ChainComplex
|
i12 : prune HH_1(C ** D)
o12 = cokernel {1} | y x |
1
o12 : R-module, quotient of R
|
i13 : prune HH_1(M ** D)
o13 = cokernel {1} | y x |
1
o13 : R-module, quotient of R
|
i14 : prune HH_1(C ** N)
o14 = cokernel {1} | y x |
1
o14 : R-module, quotient of R
|
Of course, we can use
Tor to get the same result.
i15 : prune Tor_1(M,N)
o15 = cokernel {1} | y x |
1
o15 : R-module, quotient of R
|