These methods implement the base change of rings. As input, one can either give a ring map $\phi$, or the ring $S$ (when there is a canonical map from $R$ to $S$).
We illustrate the tensor product of a complex along a ring map.
i1 : R = QQ[x,y,z]; |
i2 : S = QQ[s,t]; |
i3 : phi = map(S, R, {s, s+t, t}) o3 = map (S, R, {s, s + t, t}) o3 : RingMap S <--- R |
i4 : I = ideal(x^3, x^2*y, x*y^4, y*z^5) 3 2 4 5 o4 = ideal (x , x y, x*y , y*z ) o4 : Ideal of R |
i5 : C = freeResolution I 1 4 4 1 o5 = R <-- R <-- R <-- R 0 1 2 3 o5 : Complex |
i6 : D = phi ** C 1 4 4 1 o6 = S <-- S <-- S <-- S 0 1 2 3 o6 : Complex |
i7 : assert isWellDefined D |
i8 : dd^D 1 4 o8 = 0 : S <------------------------------------------------ S : 1 | s3 s3+s2t s5+4s4t+6s3t2+4s2t3+st4 st5+t6 | 4 4 1 : S <------------------------------------------------------- S : 2 {3} | -s-t 0 0 0 | {3} | s -s3-3s2t-3st2-t3 -t5 0 | {5} | 0 s 0 -t5 | {6} | 0 0 s2 s4+3s3t+3s2t2+st3 | 4 1 2 : S <----------------------------- S : 3 {4} | 0 | {6} | t5 | {8} | -s3-3s2t-3st2-t3 | {10} | s | o8 : ComplexMap |
i9 : prune HH D o9 = cokernel | s2t s3 st4 t6 | <-- cokernel {7} | s t3 | 0 1 o9 : Complex |
If a ring is used rather than a ring map, then the implicit map from the underlying ring of the complex to the given ring is used.
i10 : A = R/(x^2+y^2+z^2); |
i11 : C ** A 1 4 4 1 o11 = A <-- A <-- A <-- A 0 1 2 3 o11 : Complex |
i12 : assert(map(A,R) ** C == C ** A) |
The commutativity of tensor product is witnessed as follows.
i13 : assert(D == C ** phi) |
i14 : assert(C ** A == A ** C) |
When the modules in the complex are not free modules, this is different than the image of a complex under a ring map.
i15 : use R o15 = R o15 : PolynomialRing |
i16 : I = ideal(x*y, x*z, y*z); o16 : Ideal of R |
i17 : J = I + ideal(x^2, y^2); o17 : Ideal of R |
i18 : g = inducedMap(module J, module I) o18 = {2} | 1 0 0 | {2} | 0 1 0 | {2} | 0 0 1 | {2} | 0 0 0 | {2} | 0 0 0 | o18 : Matrix |
i19 : assert isWellDefined g |
i20 : C = complex {g} o20 = image | xy xz yz x2 y2 | <-- image | xy xz yz | 0 1 o20 : Complex |
i21 : D1 = phi C o21 = image | s2+st st st+t2 s2 s2+2st+t2 | <-- image | s2+st st st+t2 | 0 1 o21 : Complex |
i22 : assert isWellDefined D1 |
i23 : D2 = phi ** C o23 = cokernel {2} | -t -t 0 s 0 -s-t | <-- cokernel {2} | -t -t | {2} | s+t 0 s 0 0 0 | {2} | s+t 0 | {2} | 0 s 0 0 s+t 0 | {2} | 0 s | {2} | 0 0 -t -s-t 0 0 | {2} | 0 0 0 0 -t s | 1 0 o23 : Complex |
i24 : assert isWellDefined D2 |
i25 : prune D1 o25 = cokernel {2} | s+t t | <-- cokernel {2} | -t -t | {2} | 0 -s-t | {2} | s+t 0 | {2} | -t s-t | {2} | 0 s | 0 1 o25 : Complex |
i26 : prune D2 o26 = cokernel {2} | -t -t -t -s+t -t -s-t | <-- cokernel {2} | -t -t | {2} | s+t 0 t -t 0 0 | {2} | s+t 0 | {2} | 0 s 0 0 -t 0 | {2} | 0 s | {2} | 0 0 t s 0 0 | {2} | 0 0 0 0 t s | 1 0 o26 : Complex |
When the ring map doesn't preserve homogeneity, the DegreeMap option is needed to determine the degrees of the image free modules in the complex.
i27 : R = ZZ/101[a..d]; |
i28 : S = ZZ/101[s,t]; |
i29 : f = map(S, R, {s^4, s^3*t, s*t^3, t^4}, DegreeMap => i -> 4*i) 4 3 3 4 o29 = map (S, R, {s , s t, s*t , t }) o29 : RingMap S <--- R |
i30 : C = freeResolution coker vars R 1 4 6 4 1 o30 = R <-- R <-- R <-- R <-- R 0 1 2 3 4 o30 : Complex |
i31 : D = f ** C 1 4 6 4 1 o31 = S <-- S <-- S <-- S <-- S 0 1 2 3 4 o31 : Complex |
i32 : D == f C o32 = true |
i33 : assert isWellDefined D |
i34 : assert isHomogeneous D |
i35 : prune HH D o35 = cokernel | t4 st3 s3t s4 | <-- cokernel {5} | s3 0 t3 0 0 st2 | <-- cokernel {10} | s2 0 0 t2 | {5} | 0 t3 s3 s2t 0 0 | {11} | t s 0 0 | 0 {6} | 0 0 0 t2 st s2 | {11} | 0 0 t s | 1 2 o35 : Complex |
i36 : C1 = Hom(C, image vars R) o36 = image {-4} | d c b a | <-- image {-3} | d c b a 0 0 0 0 0 0 0 0 0 0 0 0 | <-- image {-2} | d c b a 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | <-- image {-1} | d c b a 0 0 0 0 0 0 0 0 0 0 0 0 | <-- image | d c b a | {-3} | 0 0 0 0 d c b a 0 0 0 0 0 0 0 0 | {-2} | 0 0 0 0 d c b a 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-1} | 0 0 0 0 d c b a 0 0 0 0 0 0 0 0 | -4 {-3} | 0 0 0 0 0 0 0 0 d c b a 0 0 0 0 | {-2} | 0 0 0 0 0 0 0 0 d c b a 0 0 0 0 0 0 0 0 0 0 0 0 | {-1} | 0 0 0 0 0 0 0 0 d c b a 0 0 0 0 | 0 {-3} | 0 0 0 0 0 0 0 0 0 0 0 0 d c b a | {-2} | 0 0 0 0 0 0 0 0 0 0 0 0 d c b a 0 0 0 0 0 0 0 0 | {-1} | 0 0 0 0 0 0 0 0 0 0 0 0 d c b a | {-2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d c b a 0 0 0 0 | -3 {-2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d c b a | -1 -2 o36 : Complex |
i37 : D1 = f ** C1 o37 = cokernel {-12} | st3 s3t 0 s4 0 0 | <-- cokernel {-8} | st3 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | <-- cokernel {-4} | st3 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | <-- cokernel | st3 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | <-- cokernel {4} | st3 s3t 0 s4 0 0 | {-12} | -t4 0 s3t 0 s4 0 | {-8} | -t4 0 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-4} | -t4 0 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | -t4 0 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {4} | -t4 0 s3t 0 s4 0 | {-12} | 0 -t4 -st3 0 0 s4 | {-8} | 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-4} | 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {4} | 0 -t4 -st3 0 0 s4 | {-12} | 0 0 0 -t4 -st3 -s3t | {-8} | 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-4} | 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {4} | 0 0 0 -t4 -st3 -s3t | {-8} | 0 0 0 0 0 0 st3 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 st3 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 st3 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | -4 {-8} | 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 | 0 {-8} | 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 | {-8} | 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 0 0 0 0 0 0 | {-8} | 0 0 0 0 0 0 0 0 0 0 0 0 st3 s3t 0 s4 0 0 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 st3 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 st3 s3t 0 s4 0 0 0 0 0 0 0 0 | {-8} | 0 0 0 0 0 0 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 0 0 0 0 0 0 | {-8} | 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 | {-8} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 | {-8} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 st3 s3t 0 s4 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 st3 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 st3 s3t 0 s4 0 0 | {-8} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 | {-8} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 | {-8} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 st3 s3t 0 s4 0 0 0 0 0 0 0 0 | -3 {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 0 0 0 0 0 0 | -1 {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t 0 0 0 0 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 st3 s3t 0 s4 0 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 0 s3t 0 s4 0 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 0 0 s4 | {-4} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t4 -st3 -s3t | -2 o37 : Complex |
i38 : isWellDefined D1 o38 = true |
i39 : assert isHomogeneous D1 |