7
$\begingroup$

Giving a polynomial, say

a x^2 + b x y + c y^2

MonomialList[a x^2 + b x y + c y^2, {x, y}] just gives

{a x^2, b x y, c y^2}

How can I get a list without the coefficients? I mean, the following list

{x^2, x y, y^2}

The motivation of this question is, I am only interested in the structure of the polynomial itself, i.e., which kinds of of monomials are there, while their explicit coefficient are not relevant.

$\endgroup$
0

3 Answers 3

9
$\begingroup$

You can generate the monomials by using CoefficientRules, like this

In[55]:= monomialList[poly_, vars_] := Times @@ (vars^#) & /@ CoefficientRules[poly, vars][[All, 1]]
         monomialList[a x^2 + b x y + c y^2, {x, y}]

Out[56]= {x^2, x y, y^2}
$\endgroup$
7
$\begingroup$

A pattern matching method:

fn[x_, {var__}] := List @@ Pick[x, x, Alternatives[var]^_.]

fn[a x^2 + b x y + c y^2, {x, y}]
{x^2, x y, y^2}

But a better approach I believe is (hopefully now corrected at last):

fn2[x_, var_] := Collect[List @@ Expand @ x, var, 1 &]

fn2[a x^2 + b x y + c y^2, {x, y}]
{x^2, x y, y^2}
fn2[x (x^2 + y^2), {x, y}]
{x^3, x y^2}
fn2[p x + a x^2 + b x y, {x, y}]
{x, x^2, x y}
$\endgroup$
8
  • $\begingroup$ Thank you so much. It is very clever and efficient! $\endgroup$
    – panda.G
    Commented Jul 21, 2015 at 16:43
  • $\begingroup$ @user29373 Don't miss my last update; I like it best. And you're welcome. $\endgroup$
    – Mr.Wizard
    Commented Jul 21, 2015 at 16:44
  • $\begingroup$ Thanks again @Mr.Wizard! That is really fantastic. $\endgroup$
    – panda.G
    Commented Jul 21, 2015 at 16:54
  • 1
    $\begingroup$ Maybe add Expand in there? Try fn2[x(x^2 + y^2)] as it is now. $\endgroup$ Commented Jul 21, 2015 at 17:02
  • $\begingroup$ @Marius Thank you. I think the simple change I just made catches that case. Would you please test it? $\endgroup$
    – Mr.Wizard
    Commented Jul 21, 2015 at 17:07
5
$\begingroup$

This uses some undocumented functionality:

poly = a x^2 + b x y + c y^2; vars = {x, y};
dl = GroebnerBasis`DistributedTermsList[poly, vars];
Inner[Power, vars, #, Times] & /@ dl[[1, All, 1]]
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.