Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have an expression: $p=a\;b\; x + b^2\; y + a\;c\; z$. I want to substitute $a\;b=1$, $b^2 = 2$ and $a\;c = 4$ to obtain $p = x + 2y + 4z$.
How can I tell Mathematica to do that? I dont know how to start.

share|improve this question

1 Answer 1

up vote 11 down vote accepted

A reliable approach would use the third argument of Reduce as variables to eliminate (see Behavior of Reduce with variables as domain)

Reduce[{p == a b x + b^2 y + a c z, a b == 1, b^2 == 2, a c == 4}, {p}, {a, b, c}]
p == x + 2 y + 4 z

In the former editions of Mathematica (ver <= 4) Reduce used the third argument for eliminating another variables. It can be still used this way though it is not documented anymore, however its trace could be found in SystemOptions["ReduceOptions"].
If Reduce didn't work this way one would exploit Solve (it is still supposed to eliminate variables), e.g.:

Apply[ Equal, Solve[{p == a b x + b^2 y + a c z, a b == 1, b^2 == 2, a c == 4}, 
       {p}, {a, b, c}], {2}][[1, 1]]

or Eliminate:

Eliminate[{p == a b x + b^2 y + a c z, a b == 1, b^2 == 2, a c == 4}, 
          {a, b, c}] // Reverse

or even simply appropriate rules replacement (in general this approach cannot be used seamlessly though)

p == a b x + b^2 y + a c z /. {a b -> 1, b^2 -> 2, a c -> 4} // TraditionalForm

enter image description here


It would be reasonable to mention another two functions useful in similar tasks. Taking this polynomial identiclly equal to zero:

poly = p - a b x - b^2 y - a c z;

we can rewrite it in terms of another three polynomials which are also identically zeros by the assumptions:

{poly1, poly2, poly3} = {a b - 1, b^2 - 2, a c - 4};

thus we know that the resulting polynomial will be equal to zero as well:

Last @ PolynomialReduce[ poly, {poly1, poly2, poly3}, {a, b, c, p, x, y, z}] == 0
p - x - 2 y - 4 z == 0

similarily we can find a Groebner basis of polynomials { poly, poly1, poly2, poly3} eliminating unwanted variables {a, b, c}:

First @ GroebnerBasis[{ poly, poly1, poly2, poly3}, {x, y, z}, {a, b, c},
                       MonomialOrder -> EliminationOrder] == 0

These two methods are more useful when we want to find different representations of (polynomial) expressions in polynomial rings, thus we needn't assume that polynomials { poly, poly1, poly2, poly3} identically vanish.

share|improve this answer
Thank you for your answer. –  minthao_2011 Feb 11 at 15:50

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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