THE ISSUE When roots are expanded, (a*b)**e --> a**e * b**e, the expanded result will be off by a factor of a root of -1, fix = (-1)**(2-A*e) to be exact (if I finally have all the math right) where A is 2*(nn//2) and nn is the number of negatives in the arguments (just a and b in this case) [*].
EXAMPLE if a = -1 and b = 2 then nn is 1, A = 0, and fix = 1 (i.e. no correction factor is needed) but if b = -2 then nn = 2, A = 2 and fix = -1**(2-2*e) (so if e is 1/2 the answer is off by a factor of -1 from what it would have been if the two terms were not expanded). In this latter example, the answer is technically right, giving one of the roots of -2 but this result might not be expected; one might be expecting the primary branch solution, thus the raising of issue 1161 and issue 896. Since the roots of -1 can generate both real and imaginary components when e is not 1/2, e.g. (-1)**(1/3) = .5 + . 866*I, it is possible that an answer looks "way off" when the roots are expanded. Taking the previous example with a, b = -1, -2, a**e * b**e -> -0.63 + 1.1*I instead of 1.26. [If you try this previous example in sympy you might find that a**e*b**e evaluates to 1.25 for the values of a, b, and e cited but that is because sympy automatically combines the exponents together before evaluating, effectively cancelling out the signs of a and b.] QUESTION I'm wondering what the best way to handle the correction factor might be. Right now I have a function that returns a factor (let's call it Si, short for sign) relating the expanded and unexpanded roots: (a*b)**e = Si(a,b,e) * a**e * b**e But it doesn't come back as "Si(a,b,e)" it comes back as an expression with several sign() terms in it, for example: >>> sqrt(a*b) a**(1/2)*b**(1/2)*sign(a*b)**(1/2)/(sign(a)**(1/2)*sign(b)**(1/2)) Does anybody have an idea of what the best way to represent this factor might be? My preference would be to have something that is as unobtrusive as possible. Perhaps a new function? If so, what would be a good name? How should it be represented? I think I would prefer just a single character, but perhaps a function that always only shows it's arguments would be better as shown above. This factor is needed in several places: mul, power, simplify at least. My thinking is to put this into simplify but maybe it should be in functions. Hopefully I've been clear enough about the problem and a solution that others can give some input as to how this should be implemented. /c [*] This is one way to implement the correction factor: by putting the number of negatives information in the exponent. The way I actually have it implemented right now is to put the sign information in the bases and leave the exponents alone so the factor when applied to the expanded form of the root appears as a series of "sign(x_i)**e" terms in the denominator. Ideally, I think this should all be hidden from the user because for more complicated expressions, e.g. sqrt(1*b) + (a*b)^(1/3), the correction factor introduces a lot of "symbolic noise". --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/sympy?hl=en -~----------~----~----~----~------~----~------~--~---
