Roots

classic Classic list List threaded Threaded
21 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Re: Roots

Jon Peck
sympy is an elegant library for solving equations, mainly symbolically, but it is not part of the Python language, and it is not relevant for this discussion.  Variables in sympy are complex while Statistics, SAS and most other stat packages do not support complex arithmetic.  Mathematically, the general solution of negative numbers to fractional patterns is a (set of) complex numbers.  In the real numbers, many of such expressions do not have a solution.  The examples I posted refer to the exponentiation operator in the various languages (Statistics, go, Python, and R) as applied to real numbers.  If z is a complex number, or the exponent is complex, then fractional exponent expression can be calculated.  No need to use sympy.
q=(-1.)**(complex(1./3., 0))
q
(0.5000000000000001+0.8660254037844386j)

abs(q)
1.0

q**(complex(1./3.))
(0.9396926207859084+0.34202014332566866j)
abs(q**(complex(1./3.)))
1.0
(for complex numbers, abs returns the magnitude).

Subscribers to this list will appreaciate that this is my last post on this topic.

On Sun, Nov 17, 2019 at 11:04 AM Stan Gorodenski <[hidden email]> wrote:
Here is another solution someone in the SAS discussion group came up
with. Again, I know nothing about Python and so do not know if it is
doing what it is supposed to.
Stan

%utl_submit_py64("
from sympy import *;
x, y, z = symbols('x y z', real=True);
z=-1;
sol = solve((x+I*y)**3 + 1, (x, y));
print(sol);
");

Three roots of (-1)**3

[(-1, 0), (1/2, -sqrt(3)/2), (1/2, sqrt(3)/2)]

  Lets check root (1/2, -sqrt(3)/2)

  In the complex plane the vector length for (1/2, -sqrt(3)/2)

    1/2 * y, -sqr(3)/2 * i = (1/2)**2 + (-sqr(3)/2)**2 = .25 + .75 = 1



On 11/17/2019 8:46 AM, Stan Gorodenski wrote:
> Jon,
> Here is someone in the SAS discussion group how appears to have done
> it with Python. I don't know anything about Python, yet. Would you
> agree with his solution?
> Stan
>
> %let x=-1;
>
> %utl_submit_py64("
> from sympy import *;
> import pyperclip;
> x = symbols('x');
> x=&x;
> r=x^(1/3);
> pyperclip.copy(r);
> print r;
> ",return=fromPy);
>
> %put Cube root of -1 is &=frompy;
>
> LOG
>
> Cube root of -1 is FROMPY=-1
>
>
>
>
>
> On 11/16/2019 7:32 AM, Jon Peck wrote:
>> I thought it would  be interesting to explore negative numbers
>> exponentiated to fractional powers in other systems.  Here is what I
>> found.  (NaN is a value for not a number.  Equivalent to SYSMIS.)
>>
>>
>> SPSS Statistics
>> compute z = (-1)**(1/3).
>> SYSMIS
>> Warning # 523
>> >During the execution of the indicated command, an attempt was made
>> to raise a
>> >non-positive number to a fractional power, e.g.  (-3)**2.5.
>>
>> golang
>> output := math.Pow(-1, 1./3.)
>> NaN
>> No warning
>>
>> Python
>> (-1)**(1./3.)
>> no result - calculation is stopped
>> ValueError: negative number cannot be raised to a fractional power
>>
>> R
>>  (-1)^(1/3)
>>  NaN
>> No warning
>>
>> Although I have not seen the SPSS internal transformation code, I
>> expect that it uses logs to calculate exponentiation with a
>> fractional power, hence the error.
>>
>> The expression could be refactored to get a result in the case where
>> the denominator of the exponent is odd but not as a general
>> solution.  Since Statistics, as with most statistical packages, does
>> not support complex numbers in expressions, that solution is not
>> available.
>>
>> From Wikpedia...
>>
>> The powers of negative real numbers are not always defined and are
>> discontinuous even where defined. In fact, they are only defined when
>> the exponent is a rational number with the denominator being an odd
>> integer.
>>
>> If the definition of exponentiation of real numbers is extended to
>> allow negative results then the result is no longer well-behaved.
>>
>> Neither the logarithm method nor the rational exponent method can be
>> used to define /b/^/r/  as a real number for a negative real number
>> /b/ and an arbitrary real number /r/. Indeed, /e/^/r/  is positive
>> for every real number /r/, so ln(/b/) is not defined as a real number
>> for /b/ ≤ 0.
>>
>> The rational exponent method cannot be used for negative values of
>> /b/ because it relies on continuity
>> <https://en.wikipedia.org/wiki/Continuous_function>. The function
>> /f/(/r/) = /b/^/r/  has a unique continuous extension^[15]
>> <https://en.wikipedia.org/wiki/Exponentiation#cite_note-Denlinger-15>
>>  from the rational numbers to the real numbers for each /b/ > 0. But
>> when /b/ < 0, the function /f/ is not even continuous on the set of
>> rational numbers /r/ for which it is defined.
>>
>> For example, consider /b/ = −1. The /n/th root of −1 is −1 for every
>> odd natural number /n/. So if /n/ is an odd positive integer,
>> (−1)^(/m///n/)  = −1 if /m/ is odd, and (−1)^(/m///n/)  = 1 if /m/ is
>> even. Thus the set of rational numbers /q/ for which (−1)^/q/  = 1 is
>> dense <https://en.wikipedia.org/wiki/Dense_set> in the rational
>> numbers, as is the set of /q/ for which (−1)^/q/  = −1. This means
>> that the function (−1)^/q/  is not continuous at any rational number
>> /q/ where it is defined.
>>
>> On the other hand, arbitrary complex powers
>> <https://en.wikipedia.org/wiki/Exponentiation#Powers_of_complex_numbers> of
>> negative numbers /b/ can be defined by choosing a /complex/ logarithm
>> <https://en.wikipedia.org/wiki/Complex_logarithm> of /b/.
>>
>>
>>
>>
>> On Fri, Nov 15, 2019 at 10:26 AM Stan Gorodenski
>> <[hidden email] <mailto:[hidden email]>> wrote:
>>
>>     I don't know if there is any demand, but I think the square root
>>     of -1
>>     is used in electronics. I'm not into this so I really don't know.
>>     I did
>>     not pose this question because I have an application for it. I was
>>     just
>>     curious since it seems that sophisticated software packages like
>> SPSS
>>     and SAS should be able to do it. I just sent an email to join the
>> SAS
>>     discussion group and will ask them if SAS can do it. I suppose one
>>     could
>>     write a routine to return a -1 if the the denominator of the
>>     exponent is
>>     an odd number.
>>     Stan
>>
>>     On 11/15/2019 10:05 AM, Rich Ulrich wrote:
>>     > I wonder - Is there any demand for the exception-coding
>>     > that would be necessary?  How many people write code
>>     > where they want to take the fractional root of a negative
>>     > number, where the fraction is the reciprocal of an odd integer?
>>     > ( Note, the fraction cannot be expressed EXACTLY on a binary
>>     > computer. How is that accommodated?)
>>     >
>>     > The natural programming solution to non-integer roots is
>>     > to use logs.  I suppose if there is an area where the problem
>>     > comes up, specialized programs for that area might do it.
>>     > I suspect the efficient solution might use a special subroutine
>>     > call rather than an in-line expression.
>>     >
>>     > --
>>     > Rich Ulrich
>>     >
>>     >
>> ------------------------------------------------------------------------
>>     > *From:* SPSSX(r) Discussion <[hidden email]
>>     <mailto:[hidden email]>> on behalf of
>>     > Bruce Weaver <[hidden email]
>>     <mailto:[hidden email]>>
>>     > *Sent:* Friday, November 15, 2019 11:35 AM
>>     > *To:* [hidden email] <mailto:[hidden email]>
>>     <[hidden email] <mailto:[hidden email]>>
>>     > *Subject:* Re: Roots
>>     >
>> https://www.ibm.com/support/knowledgecenter/en/SSLVMB_26.0.0/statistics_reference_project_ddita/spss/base/syn_transformation_expressions_domain_errors.html
>>     >
>>     >
>>     >
>>     > Kirill Orlov wrote
>>     > > See DOMAIN ERRORS paragraph in Command Syntax Reference.
>>     > >
>>     > >
>>     > > 15.11.2019 4:53, Stan Gorodenski пишет:
>>     > >> compute z = (-1)**(1/3).
>>     > >
>>     > > =====================
>>     > > To manage your subscription to SPSSX-L, send a message to
>>     >
>>     > > LISTSERV@.UGA
>>     >
>>     > >  (not to SPSSX-L), with no body text except the
>>     > > command. To leave the list, send the command
>>     > > SIGNOFF SPSSX-L
>>     > > For a list of commands to manage subscriptions, send the command
>>     > > INFO REFCARD
>>     >
>>     >
>>     >
>>     >
>>     >
>>     > -----
>>     > --
>>     > Bruce Weaver
>>     > [hidden email] <mailto:[hidden email]>
>>     > http://sites.google.com/a/lakeheadu.ca/bweaver/
>>     >
>>     > "When all else fails, RTFM."
>>     >
>>     > NOTE: My Hotmail account is not monitored regularly.
>>     > To send me an e-mail, please use the address shown above.
>>     >
>>     > --
>>     > Sent from: http://spssx-discussion.1045642.n5.nabble.com/
>>     >
>>     > =====================
>>     > To manage your subscription to SPSSX-L, send a message to
>>     > [hidden email] <mailto:[hidden email]>
>>     (not to SPSSX-L), with no body text except the
>>     > command. To leave the list, send the command
>>     > SIGNOFF SPSSX-L
>>     > For a list of commands to manage subscriptions, send the command
>>     > INFO REFCARD
>>     > ===================== To manage your subscription to SPSSX-L,
>>     send a
>>     > message to [hidden email]
>>     <mailto:[hidden email]>
>>     > <mailto:[hidden email]
>>     <mailto:[hidden email]>> (not to SPSSX-L), with no body
>>     text
>>     > except the command. To leave the list, send the command SIGNOFF
>>     > SPSSX-L For a list of commands to manage subscriptions, send the
>>     > command INFO REFCARD
>>
>>     =====================
>>     To manage your subscription to SPSSX-L, send a message to
>>     [hidden email] <mailto:[hidden email]> (not
>>     to SPSSX-L), with no body text except the
>>     command. To leave the list, send the command
>>     SIGNOFF SPSSX-L
>>     For a list of commands to manage subscriptions, send the command
>>     INFO REFCARD
>>
>>
>>
>> --
>> Jon K Peck
>> [hidden email] <mailto:[hidden email]>
>>
>> ===================== To manage your subscription to SPSSX-L, send a
>> message to [hidden email]
>> <mailto:[hidden email]> (not to SPSSX-L), with no body
>> text except the command. To leave the list, send the command SIGNOFF
>> SPSSX-L For a list of commands to manage subscriptions, send the
>> command INFO REFCARD
>
> =====================
> To manage your subscription to SPSSX-L, send a message to
> [hidden email] (not to SPSSX-L), with no body text except the
> command. To leave the list, send the command
> SIGNOFF SPSSX-L
> For a list of commands to manage subscriptions, send the command
> INFO REFCARD
>
>

=====================
To manage your subscription to SPSSX-L, send a message to
[hidden email] (not to SPSSX-L), with no body text except the
command. To leave the list, send the command
SIGNOFF SPSSX-L
For a list of commands to manage subscriptions, send the command
INFO REFCARD


--
Jon K Peck
[hidden email]

===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD
12