       Re: Extracting terms of a multivariate polynomial order by order

• To: mathgroup at smc.vnet.net
• Subject: [mg80298] Re: [mg80280] Extracting terms of a multivariate polynomial order by order
• From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
• Date: Thu, 16 Aug 2007 07:27:35 -0400 (EDT)
• References: <200708160851.EAA23714@smc.vnet.net>

```I think this is easier to do in Mathematica 6 than in 5.2, so,
example I will construct a polynomial in three variables x, y,z of
total degree 6, with coefficients a[i,j,k]. (The following code only
works in v. 6.)

poly = Total[Array[a[#1 - 1, #2 - 1, #3 - 1]*x^(#1 - 1)*y^(#2 - 1)*z^
(#3 - 1) & ,
{2, 3, 4}], 3]

a[0, 0, 3]*z^3 + y*a[0, 1, 3]*z^3 + y^2*a[0, 2, 3]*z^3 + x*a[1, 0,
3]*z^3 +
x*y*a[1, 1, 3]*z^3 + x*y^2*a[1, 2, 3]*z^3 + a[0, 0, 2]*z^2 +
y*a[0, 1, 2]*z^2 +
y^2*a[0, 2, 2]*z^2 + x*a[1, 0, 2]*z^2 + x*y*a[1, 1, 2]*z^2 +
x*y^2*a[1, 2, 2]*z^2 +
a[0, 0, 1]*z + y*a[0, 1, 1]*z + y^2*a[0, 2, 1]*z + x*a[1, 0, 1]*z +
x*y*a[1, 1, 1]*z +
x*y^2*a[1, 2, 1]*z + a[0, 0, 0] + y*a[0, 1, 0] + y^2*a[0, 2, 0] +
x*a[1, 0, 0] +
x*y*a[1, 1, 0] + x*y^2*a[1, 2, 0]

In Mathematica 6.0 there is a very convenient function
CoefficientArrays which makes it possible to do what you want to do
(assuming I  have understood you corrrectly) easily:

s = Normal[CoefficientArrays[p, {x, y, z}]];

Now, for example,

ls[]

{{0, a[1, 1, 0], a[1, 0, 1]}, {0, a[0, 2, 0], a[0, 1, 1]}, {0, 0, a
[0, 0, 2]}}

gives you all the coefficients of terms of total degree 2 (note that
the coefficients always appear in arrays of full rank so usually they
will contain some 0s).

In Mathematica 5.2 the most convenient function for this purpose is
undocumented and appears in the Internal context. The function name
is Internal`DistributedTermsList. In Mathematica 6 this function
appears in the GroebnerBasis` context so its name has to be changed
accordingly.

terms = GroebnerBasis`DistributedTermsList[p, {x, y, z}]

I have supressed the output but if you look at it you will
immediately understand what it does. Now, it is easy to use pattern
matching to extract coefficients of terms of any chosen total degree,
e.g.

Cases[terms, {p_, l_} /; Total[p] == 4 -> l, Infinity]
{a(1, 2, 1), a(1, 1, 2), a(1, 0, 3), a(0, 2, 2), a(0, 1, 3)}

gives all the coefficients of terms of total degree 4.

Andrzej Kozlowski

On 16 Aug 2007, at 10:51, Marcus P S wrote:

> Hello,
>
>   I have a multivariate polynomial (3 variables) from which I would
> like to extract terms order by order.  More explicitly, I want all the
> lowest order terms, or all terms of the form
>
> c(L,M,N) x^L y^M z^N
>
>   where L+M+N is smallest, and c(LMN) is some coefficient.  If I have
> this, I can extract order by order, and taylor to which order I want
> to approximate my polynomial.
>
>   I considered "Coefficients", but if I ask for the coefficients of
> the form x^2 z^2, it may return something like "1 + y", which is not
> what I want.  Moreover, I have to explicitly request each possible
> term of a given order, which seems too mechanical/repetitive to be the
> "right way"  to do things.  The function for manipulating SeriesData
> objects are similarly limited.
>
>   I am assuming that there is function in Mathematica (even 5.2) that
> will do this.  Any suggestions would be greatly welcome.
>