Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

How do I substitue z^2->x in the following polynomial z^4+z^2+4?

z^4+z^2+4 /. z^2->x


share|improve this question
wow, are you guys telling me that the most advanced computer algebra software in the world cannot do a simple replacement of one variable for another without the user having to do some very unintuitive workarounds? – user12568 Feb 23 '14 at 22:07
up vote 17 down vote accepted

The reason why the replacement doesn't work is that replacement rules are not mathematical replacements, but pure structural replacements. Therefore the replacement z^2->x just looks for occurrences of the pattern z^2 and replaces that with x. Now z^4 doesn't match that pattern.

Also note that rules operate on the internal form, which doesn't always match the displayed form. For example, one would expect a-2b /. 2b->c to result in a-c, but it actually results in a-2b again, because internally the expression reads Plus[a, Times[-2, b]] (you can see that by applying FullForm), while 2b is Times[2,b].

To do the replacement wanted, one has to use a method which is aware of the mathematics instead of just the structure. One possibility is

Solve[p==z^4+z^2+4 && x==z^2, {p}, {z}]

which means "Solve the equations given for p while eliminating z". The result then is


Note that the curly braces around z are mandatory because otherwise Mathematica interprets it as domain, resulting in an error message because z is of course no valid domain. Also note that the documentation page of Solve omits the possibility of giving a list of variables to eliminate as third argument (at least I didn't find it). However, you'll find it in a Mathematica tutorial on eliminating variables (but there they use the third argument without braces, which at least for me results in an error message, as written above).

share|improve this answer
In[409]:= PolynomialReduce[z^4 + z^2 + 4, z^2 - x, {z, x}][[2]]

Out[409]= 4 + x + x^2

This is similar to the Solve approach in that both use algebraic means to effect the substitution. But one can be a bit more general using PolynomialReduce (by taking advantage of term orders, say).

For further detail on this approach, might have a look at some responses to these questions:

share|improve this answer
 z^4 + z^2 + 4 /. z^(a_Integer) -> x^(1/2 a)


4 + x + x^2
share|improve this answer

How about using Eliminate and Solve?

Solve[Eliminate[{expr == z^4 + z^2 + 4, z^2 == x}, z], expr]

Alternatively we can use the third argument of Solve to tell it which variables should be eliminated:

Solve[{expr == z^4 + z^2 + 4, z^2 == x}, expr, {z}]

Note that the braces around z are mandatory, otherwise it will be interpreted as the domain. (Thanks @celtschk!)

share|improve this answer
I thought Solve had an option to eliminate some variables while solving, but I couldn't find it. So I used Eliminate explicitly. – Szabolcs Jan 23 '12 at 21:07
In… Solve is given as Solve[eqns, vars, elims]. And indeed, Solve[p==z^4+z^2+4&&x==z^2,{p},{z}] gives {{p -> 4 + x + x^2}}. Note that the braces around z are mandatory, or it will be interpreted as domain. – celtschk Jan 23 '12 at 21:18
@celtschk Thanks! I remembered something like that, but I didn't add the braces, so it didn't work – Szabolcs Jan 23 '12 at 23:42

I'd do

z^4 + z^2 + 4 /. z -> Sqrt[x]

 -->  4 + x + x^2

In this particular case, at least (which of course may not work in more general situations, for example with odd powers of z, since I randomly picked the sign)

share|improve this answer
It wasn't random. It's the principal value, just like Artes' solution. – Simon Jan 23 '12 at 23:06
@Simon Well, ok, I agree. – Leonid Shifrin Jan 23 '12 at 23:29

In the same vein as Daniel's answer (since the functions are definitely related):

First[GroebnerBasis[{z^4 + z^2 + 4, z^2 - x}, x, z]]
share|improve this answer

Using rules one could,

rule = {z^s_ /; s >= 2 /; Mod[s, 2] == 0 -> x^(s/2)}
l //. rulesk

4 + x + x^2

share|improve this answer

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.