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.


1 Answer 1


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.

  • $\begingroup$ I'm trying to do something similar without eliminating the variables, i.e., just replace certain polynomials in an expression, so that the result is more compact and easier to read. Is there any way to do this with Mathematica? $\endgroup$
    – auxsvr
    Commented Aug 21, 2015 at 10:56
  • $\begingroup$ Try to formulate your problem as a separate question, otherwise it is hard to guess what you are trying to do. $\endgroup$
    – Artes
    Commented Aug 21, 2015 at 13:26

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.