# how to best simplify product of square roots

I'd like to simplify expressions like

p1,p2,p3 = var('p1 p2 p3')
assume(p1>0,p2>0,p3>0)
R = p1*p2*sqrt(p3)*sqrt(p3/p1)*sqrt(p3/p2)
R


without using R.canonicalize_radical(), which unfortunately messes up other factors. I understand there are some options using R.simplify_chain_real(), but what else can I try?

Let us see an example where also R.simplify_chain_real() messes things up:

p1,p2,p3 = var('p1 p2 p3')
assume(p1>0,p2>0,p3>0)
# R = p1*p2*sqrt(p3)*sqrt(p3/p1)*sqrt(p3/p2)
R = p1*p2*sqrt(p3)*sqrt(p3/p1)*sqrt(p3/p2)/((p1 - p3)*(p2 - p3)*(p3 - 1))
%display latex
from sage.manifolds.utilities import simplify_chain_real
simplify_chain_real(R)
#R

edit retag close merge delete

what is simplify_chain_real ? Not in Sagemath 9.1.beta0...

One has to import it:

sage: from sage.manifolds.utilities import simplify_chain_real


It is documented here

Indeed, simplify_chain_real does the job here:

sage: simplify_chain_real(R)
sqrt(p1)*sqrt(p2)*p3^(3/2)


On general grounds, for real expressions, simplify_chain_real is safer than canonicalize_radical (see the doc examples for a case where canonicalize_radical yields a wrong result).

@eric_g I understand, but still simplify_chain_real messes things up, look at the second example I added.

Sort by » oldest newest most voted

Possible workarounds:

• Substitute what you want to be simplified in the original (larger) expression containing the (unspecified) pther factors (not shown in your exemples...), possibly helped by use of wildcard patterns.

Examples

sage: reset()
sage: from sage.manifolds.utilities import simplify_chain_real
sage: w0, w1=(SR.wild(u) for u in (0, 1))
sage: p1,p2,p3 = var('p1 p2 p3', domain="positive")
sage: ER = p1*p2*sqrt(p3)*sqrt(p3/p1)*sqrt(p3/p2)/((p1 - p3)*(p2 - p3)*(p3 - 1))
sage: E1, E2=var("E1, E2")
sage: E=E1*(E2+ER)
sage: E.subs(ER==simplify_chain_real(ER))
-(sqrt(p1)*sqrt(p2)*p3^(3/2)/((p1 + p2 + 1)*p3^2 - p3^3 + p1*p2 - ((p1 + 1)*p2 + p1)*p3) - E2)*E1
sage: E.subs(w0*(w1+ER)==w0*(w1+simplify_chain_real(ER)))
-(sqrt(p1)*sqrt(p2)*p3^(3/2)/((p1 + p2 + 1)*p3^2 - p3^3 + p1*p2 - ((p1 + 1)*p2 + p1)*p3) - E2)*E1

• Specify exactly the subexpression(s) you want simplified via Maxima's part and subspart functions (available via the maxima_methods() objects).

@eric_g: shouldn't simplify_chain_real (and, better, a similarly named method for SR elements) be part of the standard code of SR ?

more

1

Yes one could imagine that. Probably, the best way would to put the simplify_chain_real code into the existing method simplify_real, thereby avoiding to create a new method in SR elements.