2
$\begingroup$

I need a script to authomatically symmetrize a given polynomial. For example, if the input is

xy

the output should be

(xy+yx)/2

The same principle should work also for higher order polynomial. For example, if the input is

 xyz

the output should be

(xyz+xzy+yxz+yzx+zxy+zyx)/6

The input is, in general, a polynomial. If the input is

xy+wz

the output should be

(xy+yx+wz+zw)/2

It may happen that some terms come with some powers. If the input is

x^2 z

the output should be either

(xxz + xxz +xzx+ xzx + zxx + zxx)/6

or

(2x^2z+2xzx+2zx^2)/6

Both these ouputs are good. Thanks in advance for the help.

$\endgroup$
3
  • $\begingroup$ Are you always dealing with monomials, or should a solution expect things like x y + w z? $\endgroup$ Commented Oct 14, 2018 at 16:03
  • $\begingroup$ The input could be a polynomial as well. For example, if the input is $xy+wz$, the output should be $(xy+yx+wz+zw)/2$, but I know a priori what are the variables that come into play. Moreover, of course, it may appen to have things like $x^2y$ as input. In this case, the output should be either $(xxz+xzx+xxz+xzx+zxx+zxx)/6$ or $(2x^2z + 2xzx+ 2zx^2)/6$. Both outputs are ok for me. $\endgroup$
    – AndreaPaco
    Commented Oct 14, 2018 at 16:08
  • $\begingroup$ @J.M.iscomputer-less, I've edited the question in order to meke my question more precise. $\endgroup$
    – AndreaPaco
    Commented Oct 14, 2018 at 16:19

1 Answer 1

4
$\begingroup$

What about this?

f[NonCommutativeMultiply[x__]] := Mean[Permutations[NonCommutativeMultiply[x]]]

f[x ** y ** z]

1/6 (x ** y ** z + x ** z ** y + y ** x ** z + y ** z ** x + z ** x ** y + z ** y ** x)

Adding

f[x_Times] := f /@ x
f[x_Plus] := f /@ x
f[x_?NumericQ] := x

allows us to treat also polynomials:

f[3 x ** x ** y + y ** y ** y + 54 x ** z ** y]

x ** x ** y + x ** y ** x + y ** x ** x + y ** y ** y + 9 (x ** y ** z + x ** z ** y + y ** x ** z + y ** z ** x + z ** x ** y + z ** y ** x)

$\endgroup$
3
  • $\begingroup$ Thanks for your help. Can it handle a generic polynomial $P(x,y,z)$ such as $P(x,y,z)=3x^2y+y^3+54xzy$? $\endgroup$
    – AndreaPaco
    Commented Oct 14, 2018 at 16:22
  • $\begingroup$ Thanks a lot for the update. You gave me a huge help. Just a curiosity more. In the input the non-commutative multiplication $**$ is already made explicit. Is there a way to authomatically turn a traditional multiplication (such as $x*y$) into a non-commutative one, (such as $x**y$)? $\endgroup$
    – AndreaPaco
    Commented Oct 14, 2018 at 16:32
  • 1
    $\begingroup$ Yes, you can always tuse replacement rules, e.g. x x y //. {Power[a_, k_Integer?Positive] :> NonCommutativeMultiply @@ ConstantArray[a, k], Times -> NonCommutativeMultiply} (however this won't work out with the coefficients). $\endgroup$ Commented Oct 14, 2018 at 16:45

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.