next | previous | forward | backward | up | index | toc

# tensorAssociativity(Complex,Complex,Complex) -- make the canonical isomorphism arising from associativity

## Synopsis

• Function: tensorAssociativity
• Usage:
tensorAssociativity(C, D, E)
• Inputs:
• C, ,
• D, ,
• E, ,
• Outputs:
• , which is an isomorphism from C ** (D ** E) to (C ** D) ** E

## Description

The associativity of tensor products of modules induces the associativity of tensor products of chain complexes. This method implements this isomorphism for chain complexes.

Using two term complexes of small rank, we see that this isomorphism need not be the identity map.

 i1 : S = ZZ/101[x_0..x_11] o1 = S o1 : PolynomialRing i2 : C = complex{genericMatrix(S,x_0,2,1)} 2 1 o2 = S <-- S 0 1 o2 : Complex i3 : D = complex{genericMatrix(S,x_4,1,2)} 1 2 o3 = S <-- S 0 1 o3 : Complex i4 : E = complex{genericMatrix(S,x_8,2,2)} 2 2 o4 = S <-- S 0 1 o4 : Complex i5 : F = (C ** D) ** E 4 14 14 4 o5 = S <-- S <-- S <-- S 0 1 2 3 o5 : Complex i6 : G = C ** (D ** E) 4 14 14 4 o6 = S <-- S <-- S <-- S 0 1 2 3 o6 : Complex i7 : f = tensorAssociativity(C,D,E) 4 4 o7 = 0 : S <--------------- S : 0 | 1 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | 0 0 0 1 | 14 14 1 : S <--------------------------------------- S : 1 {1} | 1 0 0 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 | {1} | 0 0 1 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 1 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 1 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 1 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 1 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 1 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 1 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 0 1 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 | 14 14 2 : S <--------------------------------------- S : 2 {2} | 1 0 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | 0 0 1 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 0 | {2} | 0 0 0 0 1 0 0 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 1 0 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 1 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 1 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 1 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 0 1 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 | 4 4 3 : S <------------------- S : 3 {3} | 1 0 0 0 | {3} | 0 1 0 0 | {3} | 0 0 1 0 | {3} | 0 0 0 1 | o7 : ComplexMap i8 : assert isWellDefined f i9 : assert(source f === G) i10 : assert(target f === F) i11 : f_1 o11 = {1} | 1 0 0 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 | {1} | 0 0 1 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 1 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 1 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 1 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 1 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 1 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 1 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 0 1 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 | 14 14 o11 : Matrix S <-- S i12 : assert(f_1 != id_(source f_1)) i13 : assert(prune ker f == 0) i14 : assert(prune coker f == 0) i15 : g = f^-1 4 4 o15 = 0 : S <--------------- S : 0 | 1 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | 0 0 0 1 | 14 14 1 : S <--------------------------------------- S : 1 {1} | 1 0 0 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 1 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 1 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 | {1} | 0 0 1 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 1 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 1 0 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 1 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 1 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 0 1 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 | 14 14 2 : S <--------------------------------------- S : 2 {2} | 1 0 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | 0 0 1 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 0 | {2} | 0 0 0 0 1 0 0 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 1 0 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 1 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 1 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 1 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 0 1 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 | 4 4 3 : S <------------------- S : 3 {3} | 1 0 0 0 | {3} | 0 1 0 0 | {3} | 0 0 1 0 | {3} | 0 0 0 1 | o15 : ComplexMap i16 : assert isWellDefined g i17 : assert(g * f == 1) i18 : assert(f * g == 1)

We illustrate this isomorphism on complexes, none of whose terms are free modules.

 i19 : ses = (I,J) -> ( complex{ map(S^1/(I+J), S^1/I ++ S^1/J, {{1,1}}), map(S^1/I ++ S^1/J, S^1/(intersect(I,J)), {{1},{-1}}) } ) o19 = ses o19 : FunctionClosure i20 : C = ses(ideal(x_0,x_1), ideal(x_1,x_2)) o20 = cokernel | x_0 x_1 x_1 x_2 | <-- cokernel | x_0 x_1 0 0 | <-- cokernel | x_1 x_0x_2 | | 0 0 x_1 x_2 | 0 2 1 o20 : Complex i21 : D = ses(ideal(x_3,x_4,x_5), ideal(x_6,x_7,x_8)) o21 = cokernel | x_3 x_4 x_5 x_6 x_7 x_8 | <-- cokernel | x_3 x_4 x_5 0 0 0 | <-- cokernel | x_5x_8 x_4x_8 x_3x_8 x_5x_7 x_4x_7 x_3x_7 x_5x_6 x_4x_6 x_3x_6 | | 0 0 0 x_6 x_7 x_8 | 0 2 1 o21 : Complex i22 : E = ses(ideal(x_1^2, x_1*x_2), ideal(x_1*x_3,x_9^2)) o22 = cokernel | x_1^2 x_1x_2 x_1x_3 x_9^2 | <-- cokernel | x_1^2 x_1x_2 0 0 | <-- cokernel | x_1x_2x_3 x_1^2x_3 x_1x_2x_9^2 x_1^2x_9^2 | | 0 0 x_1x_3 x_9^2 | 0 2 1 o22 : Complex i23 : h = tensorAssociativity(C, D, E); i24 : assert isWellDefined h i25 : assert(ker h == 0) i26 : assert(coker h == 0) i27 : k = h^-1; i28 : assert(h*k == 1) i29 : assert(k*h == 1) i30 : h_2 o30 = | 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 | | 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 | o30 : Matrix i31 : assert(source h_2 != target h_2)