Ask Your Question

Revision history [back]

Sage has a constructor for polynomial rings in countably many variables.

Using this constructor, the polynomials $p_{n, k}$ in the question can be defined as follows.

Define the "infinite polynomial ring":

sage: R.<x> = InfinitePolynomialRing(QQ)

Define a function that can give the $p_{n, k}$:

def p(n, k):
    if n not in NN or k not in NN or k > 2*n:
        raise ValueError("Unsupported values: n = {}, k = {}".format(n, k))
    if k == 0:
        return R.zero()
    if 1 <= k <= n:
        return sum(x[j] for j in (1 .. k))
    # case n < k <= 2* n:
    return sum(x[j] for j in (1 .. 2*n-k+1))

Use this function:

sage: p(4, 3)
x_3 + x_2 + x_1
sage: p(4, 7)
x_2 + x_1
sage: p(4, 3) + p(4, 7)
x_3 + 2*x_2 + 2*x_1

Sage has a constructor for polynomial rings in countably many variables.

Using this constructor, the polynomials $p_{n, k}$ in the question can be defined as follows.

Define the "infinite polynomial ring":ring $\mathbb{Q}[x_0, x_1, x_2, ...]$:

sage: R.<x> = InfinitePolynomialRing(QQ)

Now x[j] gives $x_j$.

sage: x[2]
x_2
sage: x[9876]
x_9876

Define a function p such that can give the p(n, k) gives $p_{n, k}$:

def p(n, k):
    if n not in NN or k not in NN or k > 2*n:
        raise ValueError("Unsupported values: n = {}, k = {}".format(n, k))
    if k == 0:
        return R.zero()
    if 1 <= k <= n:
        return sum(x[j] for j in (1 .. k))
    # case n < k <= 2* n:
    return sum(x[j] for j in (1 .. 2*n-k+1))

Use this function:Now p(n, k) returns $p_{n, k}$:

sage: p(4, 3)
x_3 + x_2 + x_1
sage: p(4, 7)
x_2 + x_1
sage: p(4, 3) + p(4, 7)
x_3 + 2*x_2 + 2*x_1