To complement @max-alekseyev answer, in case one would like the number of indeterminates to change (since they play a symmetric role), you can make the construction depend on the number of indeterminates, as a parameter.
For this, we can first define the polynomial ring, by providing the base ring, the structure of the names of the indeterminates, and the number of indeterminates:
sage: n = 4
sage: K = PolynomialRing(QQ, 'x_', n)
We have:
sage: K
Multivariate Polynomial Ring in x_0, x_1, x_2, x_3 over Rational Field
But, we did not let the Python names x_i
point to the polynomial indeterminates x_i
:
sage: x_2
NameError: name 'x_2' is not defined
For this, we can do:
sage: K.inject_variables()
Defining x_0, x_1, x_2, x_3
We now have:
sage: x_2
x_2
To easily make loops, instead of manipulating the strings x_i
by hand, we can use the tuple of all the indeterminates:
sage: x = K.gens()
sage: x
(x_0, x_1, x_2, x_3)
sage: x[2]
x_2
Now, the first part of your polynomial is a product of (x_i-x_j)
for j<i
which can be written as a double loop :
sage: prod(x[i]-x[j] for i in range(n) for j in range(i))
Similarly, we can define the whole polynomial using loops:
sage: p = prod(x[i]-x[j] for i in range(n) for j in range(i)) * sum(x[i] for i in range(n))^18 * sum(x[i]^2 for i in range(n))^2
Then, we can extract coefficients you want:
sage: p.monomial_coefficient(x_0^11*x_1^8*x_2^5*x_3^2)
0
Note that it is easier to start with index zero here, since everything in Python start at zero, so that loops are easier to write. We could of course play with i+1 and i-1 everywhere, but learning to work with indices starting at 0 might be a better long-term investment (we will need it in manipulating matrices for example).