Description
This is the same as A ** B except that options are allowed, see Monoid ** Monoid and Ring ** Ring. This method allows many of the options available for monoids, see monoid for details. This method essentially combines the variables of A and B into one monoid or ring.
i1 : kk = ZZ/101
o1 = kk
o1 : QuotientRing
|
i2 : A = kk[a,b]
o2 = A
o2 : PolynomialRing
|
i3 : B = kk[c,d,e]
o3 = B
o3 : PolynomialRing
|
The simplest version is to simply use **:
i4 : describe(A**B)
o4 = kk[a..e, Degrees => {2:{1}, 3:{0}}, Heft => {2:1}, MonomialOrder => {MonomialSize => 32}]
{0} {1} {GRevLex => {2:1} }
{Position => Up }
{GRevLex => {3:1} }
|
If you wish to change the variable names:
i5 : describe tensor(A, B, VariableBaseName => p)
o5 = kk[p ..p , Degrees => {2:{1}, 3:{0}}, Heft => {2:1}, MonomialOrder => {MonomialSize => 32}]
0 4 {0} {1} {GRevLex => {2:1} }
{Position => Up }
{GRevLex => {3:1} }
|
i6 : describe tensor(A, B, Variables => {a1,a2,b1,b2,b3})
o6 = kk[a1, a2, b1, b2, b3, Degrees => {2:{1}, 3:{0}}, Heft => {2:1}, MonomialOrder => {MonomialSize => 32}]
{0} {1} {GRevLex => {2:1} }
{Position => Up }
{GRevLex => {3:1} }
|
The tensor product of two singly graded rings is bigraded. Sometimes you want a singly graded ring. Here is one way to get it:
i7 : describe (C = tensor(A, B, DegreeRank => 1, Degrees => {5:1}))
o7 = kk[a..e, Degrees => {5:1}, Heft => {1}, MonomialOrder => {MonomialSize => 32}]
{GRevLex => {2:1} }
{Position => Up }
{GRevLex => {3:1} }
|
i8 : degreeLength C
o8 = 1
|
i9 : degreesRing C
o9 = ZZ[T]
o9 : PolynomialRing
|
Packing monomials into smaller space is more efficient, but less flexible. The default is 32 bits, so if you want to pack them into 8 bit exponents, use:
i10 : describe tensor(A, B, MonomialSize => 8)
o10 = kk[a..e, Degrees => {2:{1}, 3:{0}}, Heft => {2:1}, MonomialOrder => {MonomialSize => 8 }]
{0} {1} {MonomialSize => 32}
{GRevLex => {2:1} }
{Position => Up }
{GRevLex => {3:1} }
|
The default monomial order for tensor products is a product order. Sometimes other orders are more desirable, e.g. GRevLex, or an elimination order:
i11 : describe (C = tensor(A, B, MonomialOrder => Eliminate numgens A))
o11 = kk[a..e, Degrees => {2:{1}, 3:{0}}, Heft => {2:1}, MonomialOrder => {MonomialSize => 32}]
{0} {1} {Weights => {2:1} }
{GRevLex => {5:1} }
{Position => Up }
|
i12 : describe (C = tensor(A, B, MonomialOrder => GRevLex))
o12 = kk[a..e, Degrees => {2:{1}, 3:{0}}, Heft => {2:1}]
{0} {1}
|
If you tensor two skew-commutative rings, (or one skew commutative ring with a commutative polynomial ring), then all of the skew-commuting variables skew commute with each other:
i13 : As = kk[a, b, SkewCommutative => true]
o13 = As
o13 : PolynomialRing, 2 skew commutative variables
|
i14 : D = kk[c, d, e, SkewCommutative => true]
o14 = D
o14 : PolynomialRing, 3 skew commutative variables
|
i15 : E = tensor(As, D)
o15 = E
o15 : PolynomialRing, 5 skew commutative variables
|
i16 : describe E
o16 = kk[a..e, Degrees => {2:{1}, 3:{0}}, Heft => {2:1}, MonomialOrder => {MonomialSize => 32}, SkewCommutative => {0..4}]
{0} {1} {GRevLex => {2:1} }
{Position => Up }
{GRevLex => {3:1} }
|
i17 : c * a
o17 = -a*c
o17 : E
|
Similarly, tensoring two Weyl algebras (or one and a polynomial ring) produces a Weyl algebra with both sets of non-commuting pairs.
i18 : E = kk[x, Dx, WeylAlgebra => {x => Dx}]
o18 = E
o18 : PolynomialRing, 1 differential variables
|
i19 : tensor(E, E, Variables => {x, Dx, y, Dy})
o19 = kk[x, Dx, y, Dy]
o19 : PolynomialRing, 2 differential variables
|
i20 : describe oo
o20 = kk[x, Dx, y, Dy, Degrees => {2:{1}, 2:{0}}, Heft => {2:1}, MonomialOrder => {MonomialSize => 32}, WeylAlgebra => {{0..1}, {2..3}}]
{0} {1} {GRevLex => {2:1} }
{Position => Up }
{GRevLex => {2:1} }
|
Two polynomial rings must have the same coefficient ring, otherwise an error is issued. Currently, there is no way to specify other rings over which to define the tensor product.
i21 : A = ZZ/101[a, b]
o21 = A
o21 : PolynomialRing
|
i22 : B = A[x, y]
o22 = B
o22 : PolynomialRing
|
i23 : C = tensor(B, B, Variables => {x1, y1, x2, y2})
o23 = C
o23 : PolynomialRing
|
i24 : describe C
o24 = A[x1, y1, x2, y2, Degrees => {2:{1}, 2:{0}}, Heft => {2:1}, MonomialOrder => {MonomialSize => 32}]
{0} {1} {GRevLex => {2:1} }
{Position => Up }
{GRevLex => {2:1} }
|
The flat monoid with the all variables visible, including those from the base ring, can be obtained as follows.
i25 : C.FlatMonoid
o25 = monoid[x1, y1, x2, y2, a..b, Degrees => {2:{1}, 2:{0}, 2:{0}}, Heft => {3:1}, MonomialOrder => {MonomialSize => 32 }]
{0} {1} {0} {GRevLex => {2:1} }
{0} {0} {1} {Position => Up }
{2:(GRevLex => {1, 1})}
o25 : GeneralOrderedMonoid
|