Tensor commutativity gives rise to an isomorphism from $\operatorname{Tor}_i^R(M, N)$ to $\operatorname{Tor}_i^R(N, M)$. This method returns this isomorphism.
We compute the Betti numbers of the Veronese surface in two ways: $\operatorname{Tor}(M, \ZZ/101)$ or via Koszul cohomology $\operatorname{Tor}(\ZZ/101, M)$.
i1 : S = ZZ/101[a..f]; |
i2 : I = trim minors(2, genericSymmetricMatrix(S, 3)) 2 2 2 o2 = ideal (e - d*f, c*e - b*f, c*d - b*e, c - a*f, b*c - a*e, b - a*d) o2 : Ideal of S |
i3 : M = S^1/I; |
i4 : N = coker vars S o4 = cokernel | a b c d e f | 1 o4 : S-module, quotient of S |
i5 : f1 = torSymmetry(1,M,N) o5 = {2} | 0 -1 0 0 0 0 | {2} | -1 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 -1 0 | {2} | 0 0 0 -1 0 0 | {2} | 0 0 -1 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 -1 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 | o5 : Matrix |
i6 : f2 = torSymmetry(1,N,M) o6 = {2} | 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | -1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | 0 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | 0 0 0 -1 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 | o6 : Matrix |
i7 : assert(f1 * f2 == 1) |
i8 : assert(f2 * f1 == 1) |
i9 : g1 = torSymmetry(2,M,N); o9 : Matrix |
i10 : g2 = torSymmetry(2,N,M); o10 : Matrix |
i11 : assert(g1 * g2 == 1) |
i12 : assert(g2 * g1 == 1) |
i13 : h1 = torSymmetry(3,M,N); o13 : Matrix |
i14 : h2 = torSymmetry(3,N,M); o14 : Matrix |
i15 : assert(h1 * h2 == 1) |
i16 : assert(h2 * h1 == 1) |
Although the Tor modules are isomorphic, they are presented with different numbers of generators. As a consequence, the matrices need not be square. For example, after pruning the modules, $f_1$ and $f_2$ are represented by the same matrix.
i17 : p1 = prune f1 o17 = {2} | -1 0 0 0 0 0 | {2} | 0 0 -1 0 0 0 | {2} | 0 -1 0 0 0 0 | {2} | 0 0 0 -1 0 0 | {2} | 0 0 0 0 0 -1 | {2} | 0 0 0 0 -1 0 | o17 : Matrix |
i18 : p2 = prune f2 o18 = {2} | -1 0 0 0 0 0 | {2} | 0 0 -1 0 0 0 | {2} | 0 -1 0 0 0 0 | {2} | 0 0 0 -1 0 0 | {2} | 0 0 0 0 0 -1 | {2} | 0 0 0 0 -1 0 | o18 : Matrix |
i19 : assert(p1 * p2 == 1) |