# How do I get my equation to have the form $(x-a)^2 + (y-b)^2 + (z-c)^2-d = 0$?

I want Mathematica to express the equation $$-11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2=0$$ in the form $$(x - 1)^2 + (y - 2)^2 + (z - 3)^2 - 25=0$$ How do I tell Mathematica to do that?

You can use custom transformation rules, for example:

-11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2 //.
(a : _ : 1)*s_Symbol^2 + (b : _ : 1)*s_ + rest__ :>
a (s + b/(2 a))^2 - b^2/(4 a) + rest


returns

(* -25 + (-1 + x)^2 + (-2 + y)^2 + (-3 + z)^2  *)


The above rule does not account for cases where b is zero, but those are easy to add too, if needed.

• I want the equation has my form exactly, not $-25 + (-1 + x)^2 + (-2 + y)^2 + (-3 + z)^2$. – minthao_2011 Feb 23 '13 at 16:12
• @minthao_2011 Mathematica auto-sorts things (Plus is Orderless), so you will have a hard time achieving this. – Leonid Shifrin Feb 23 '13 at 16:19
• @minthao_2011 You need % // PolynomialForm[ #, TraditionalOrder -> True]& – Artes Feb 23 '13 at 16:35
• Leonid, is there any reason you are using x:_:1 rather than x_:1 etc.? – Mr.Wizard Feb 24 '13 at 7:24
• @Mr.Wizard Re: x_:1 - yes, equivalent. Re: the logic - sorry, no time right now, will do later. This is a basic process of completing the square, nothing more. – Leonid Shifrin Feb 24 '13 at 15:07

A different route:

(* polynomial depression *)
depress[poly_] := depress[poly, First@Variables[poly]]

depress[poly_, x_] /; PolynomialQ[poly, x] := Module[{n = Exponent[poly, x], x0},
x0 = -Coefficient[poly, x, n - 1]/(n Coefficient[poly, x, n]);
Normal[Series[poly, {x, x0, n}]]]

tst = -11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2;

vars = {x, y, z};
{cnst, lin, quad} = MapAt[Diagonal, Normal[CoefficientArrays[tst]], {3}];

-25 + (-1 + x)^2 + (-2 + y)^2 + (-3 + z)^2

• This method does not work with mixed products variables in the polynomial. E.g. Thies Heidecke's second example: x^2 - 4 x y + y^2 + 6 x - 4 (see below). – Romke Bontekoe May 4 '19 at 6:24
• It wasn't designed for, and shouldn't work on, polynomials containing a cross-term like x y. Conventionally (e.g. applications involving conic sections or quadric surfaces), one would apply something like rotation of axes to remove the cross term before one can do completing the square. – J. M.'s technical difficulties Jul 28 '19 at 2:34

An algebraic one:

h = -2 x + x^2 - 4 y + y^2 - 6 z + z^2 == 11;
((# /. {x -> 0, y -> 0, z -> 0}) + h[] == #) &@
Total[(#2/2/Sqrt@#3 + Sqrt@#3 #4)^2 & @@@ (Join[CoefficientList[h[], #], {#}] & /@ {x, y, z})]

(*
25 ==(-1 + x)^2 + (-2 + y)^2 + (-3 + z)^2
*)

• I don't understand your answer. The right hand side must be 25. Your answer is 11. – minthao_2011 Feb 25 '13 at 5:43
• @minthao_2011 Sorry, I forgot one term, corrected now – Dr. belisarius Feb 25 '13 at 6:05
eq = (x - a)^2 + (y - b)^2 + (z - c)^2 - d;
sol = SolveAlways[{-11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2 == eq}, {x, y, z}]
eq /. sol // PolynomialForm[#, TraditionalOrder -> True] &

(* {{d -> 25, a -> 1, b -> 2, c -> 3}} *)
(* {(x-1)^2+(y-2)^2+(z-3)^2-25} *)

eq = (x - a)^2 + (y - b)^2 + (z - c)^2 - d;
Solve[ForAll[{x, y, z}, -11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2 == eq], {a, b, c, d}]

(*{{a -> 1, b -> 2, c -> 3, d -> 25}}*)

• Your answer depend on the number 25. – minthao_2011 Feb 25 '13 at 10:50
• @minthao_2011 Update complete. – chyanog Feb 25 '13 at 11:28

The following routine tries to eliminate the linear terms by completing the square for arbitrary number of variables:

CenterPoly[poly_] := Module[{a, b, c, u, vars},
vars = Variables[poly];
{c, b, a} = {#[], #[]/2, (#[] + Transpose[#[]])/2} &@
Normal@CoefficientArrays[poly, vars];
u = PseudoInverse[a].b;
(#\[Transpose].a.#)[[1, 1]] &[{vars + u}\[Transpose]] + c - u.a.u
]


In case that the polynomial is not expressable solely in quadratic terms it uses the PseudoInverse to get a representation that gets as close to purely quadratic as possible.

CenterPoly[-11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2]
(* (x - 1)^2 + (y - 2)^2 + (z - 3)^2 - 25 *)

CenterPoly[x^2 - 4 x y + y^2 + 6 x - 4]
(* (x - 1)*(x - 2(y - 2) - 1) + (y - 2)*(-2(x - 1) + (y - 2)) - 1 *)


The operation of completing the square with respect to a specified variable is realized by the function CompleteTheSquare in the Manipulations set of routines from David Park's add-on presentations. In your example:

expr = -11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2;
<< Presentations
CompleteTheSquare[CompleteTheSquare[CompleteTheSquare[expr, x], y], z]
(* -25 + (-1 + x)^2 + (-2 + y)^2 + (-3 + z)^2 *)

• You could express the last line neatly with a fold: Fold[CompleteTheSquare, expr, {x, y, z}] – Thies Heidecke May 22 '13 at 8:36
• @ThiesHeidecke: Sure, Fold simplifies the code. I was merely trying to point out that a user need not write --perhaps ought not to have to write -- his own code for such a common operation as completing the square. – murray May 22 '13 at 13:35
• Where should I get the Presentations package? – user69323 Feb 10 at 5:48

My way for this is:

eq = (x - a)^2 + (y - b)^2 + (z - c)^2 + d;
eq == 0 /. Solve[ForAll[{x, y, z}, -11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2 == eq]] // TraditionalForm

(* {(x-1)^2+(y-2)^2+(z-3)^2-25} *)


expr1 = - 11 - 2 x + x^2 - 4 y + y^2 - 6 z + z^2;

expr2=expr1 /. {x -> X + 1, y -> Y + 2, z -> Z + 3} // Simplify


The result is:

-25 + X^2 + Y^2 + Z^2


Now back to old notations:

expr2 /. {X -> x - 1, Y -> y - 2, Z -> z - 3}


The result is:

-25 + (-1 + x)^2 + (-2 + y)^2 + (-3 + z)^2