It is possible to set up a polynomial ring so that the degree of an element is a vector of integers. For this, the option Degrees is used, together with a list of degrees for the variables in the ring. Each degree is itself a list of integers. The degrees given must all be of the same length, and length zero is allowed, to get an ungraded ring.
 i1 : R = ZZ/101[a,b,c,Degrees=>{{1,2},{2,1},{1,0}}] o1 = R o1 : PolynomialRing i2 : describe R ZZ o2 = ---[a..c, Degrees => {{1}, {2}, {1}}, Heft => {1, 0}, MonomialOrder => {MonomialSize => 32 }, DegreeRank => 2] 101 {2} {1} {0} {GRevLex => {1..2, 1}} {Position => Up }
 i3 : degree a o3 = {1, 2} o3 : List i4 : degree b^2 o4 = {4, 2} o4 : List i5 : degree 0_R o5 = -infinity o5 : InfiniteNumber i6 : degree 1_R o6 = {0, 0} o6 : List
A random element of bi-degree {m,n} can be obtained with random.
 i7 : random({15,15},R) 5 5 6 3 3 7 6 o7 = - 30a b - 36a b c + 24a b*c o7 : R
The function degree applied to a polynomial will return the least upper bound of the degrees of its monomials.
 i8 : degree (a+b) o8 = {2, 2} o8 : List
We may recover the number of integers in each degree list for our ring as follows.
 i9 : degreeLength R o9 = 2 i10 : degreeLength ZZ o10 = 0
One restriction on degrees of variables is that the entries be small integer values, possibly zero or negative. The notion of small depends on the size of exponents one wants: the degree of each monomial occurring should fit in a 32 bit integer (or 64 bit integer, on 64 bit machines).

Another restriction on degrees, at least if all the computational facilities of Macaulay2 are needed, is that a heft vector exists for them. A heft vector is a list of integers whose length is the same as the length of the degrees (see degreeLength), such that its dot product with the degree of each variable is positive. Heft vectors are computed automatically for you, as in the following example, or they may be provided by the user (see Heft).

 i11 : R = QQ[a,b,c,Degrees=>{{1,0},{-2,1},{-3,1}}]; i12 : random({1,1},R) 1 3 9 4 o12 = -a b + -a c 2 4 o12 : R i13 : basis({1,1},R) o13 = | a4c a3b | 1 2 o13 : Matrix R <--- R

The heft vector computed behind the scenes is available to the user.

 i14 : (options R).Heft o14 = {1, 4} o14 : List

If the heft vector is not provided, many computations will work (e.g., Gröbner bases and computation of resolutions), but certain other operations (such as basis and random) will raise errors.