HP Forums
HP50g simplifing a root - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: General Forum (/forum-4.html)
+--- Thread: HP50g simplifing a root (/thread-15660.html)

Pages: 1 2


HP50g simplifing a root - peacecalc - 09-29-2020 09:22 PM

Hello folks,

I was wondering why my good old hp50g is not able to simplify:

\[ \left(26 - 15\cdot\sqrt{3} \right)^{\frac{1}{3}} = 2 - \sqrt{3} \]

Hmm.. it is indeed not trivial: the machine had to calculate:

\[ \left(26 - 15\cdot\sqrt{3} \right) = (a - b)^{3} = a^3 -3a^2b + 3ab^2 - b^3 \]

We first see that b must contain the root of three as a factor. And 26 must contain the cube of a:

So we get: \[ 26 = a^3 + 3ab^2 \] Why this? the two terms on the right side may not contain a root. So the other two term with a root should be: \[ - 15\sqrt{3} = - 3a^2b - b^3 \]

After a little guess we get: \[ 26 = 8 + 18 = 2^3 + 18 \] and \[ 18 = 3ab^2 \] We set a = 2 and for b we get the root of 3 out of the last equation.

Now it was clear why the calculator isn't able to transform the terms, there is no simple recipe for this. Look at the more complicate expression for simplification:

\[ \left( 9416 - 4256\sqrt{5} \right)^{\frac{1}{3}} = ? \]


RE: HP50g simplifing a root - Albert Chan - 09-29-2020 11:47 PM

(09-29-2020 09:22 PM)peacecalc Wrote:  \[ - 15\sqrt{3} = - 3a^2b - b^3 \]

This is enough to solve it all Smile
Let b = c√3, we have -15√3 = -3a²(c√3) - (c√3)³

c * (a²+c²) = 5       ⇒ c = 1, a = ±2

(±2 - √3)³ = (±8) - 3(4)(√3) + 3(±2)(3) - (3√3) = ±26 - 15√3

→ ³√(26 - 15√3) = 2 - √3

Quote:Look at the more complicate expression for simplification:
\[ \left( 9416 - 4256\sqrt{5} \right)^{\frac{1}{3}} = ? \]

(a + b√5)³ = a³ + 3a²b (√5) + 3ab²(5) + b³ (5√5)

Collect radical free terms: a³ + 15 ab² = a * (a²+15b²) = 9416 = (2³)(11)(107)

(a²+15b²) > 0 ⇒ a > 0

15b² = 9416/a - a², thus RHS must be divisible by 3, and ends in 0 or 5

a=1: 9416/1-1² = 9415, not divisible by 3
a=2: 9416/2-2² = 4704, not end in 0 or 5
a=4: 9416/4-4² = 2338, not end in 0 or 5
a=8: 9416/8-8² = 1113, not end in 0 or 5

a=11: 9416/11-11² = 735 = 15*49 → |b| = 7

This work:

(11 ± 7√5)³ = 1331 + 3(121)(±7√5) + 3(11)(49*5) + (±343)(5√5) = 9416 ± 4256√5

→ ³√(9416 - 4256√5) = 11 - 7√5

---

Comment: both examples assumed the root has form a + b√k, all symbols integer.
Assumption might not hold, they might be rationals (and, more likely, irrationals).

For first example, had we solve the radical free terms, this also produce 26

(1 + (±5/3)(√3))³ = 1 + (3)(±5√3/3) + (3)(25/3) + (125/9)(√3) = 26 ± (170/9)(√3)


RE: HP50g simplifing a root - Albert Chan - 09-30-2020 02:22 AM

For general case, to solve for all a, b:

      ³√(n + m√k) = a + b√k

(a + b√k)³ = a³ + 3a²b√k + 3ab²k + b³k√k

n = a³ + 3ab²k       → n/a - a² = 3b²k
m = 3a²b + b³k      → 3m/b - 9a² = 3b²k

Equate the 2 to eliminate k, we have b = 3ma / (n + 8a³)

Substitute b to n = ... equation, we have a cubic equation, as function of A = a³

XCas> f(n, m, k) := horner([64, -48*n, 27*k*m^2-15*n^2, -n^3], A)

For first example, ³√(26 - 15√3):

XCas> expand(f(26,-15,3))       → 64*A^3 - 1248*A^2 + 8085*A - 17576
XCas> proot(ans())                  → [5.75-1.125*i , 5.75+1.125*i , 8.0]

Above solved for A = a³. Each A produce 3 roots of a, thus a totaled 3×3 = 9 roots.
For this example, the real root is integer, a=2.

XCas> b := 3*m*a/(n + 8*a^3)
XCas> subst([a, b], [n,m,a] = [26,-15,2])       → [2, -1]


RE: HP50g simplifing a root - peacecalc - 09-30-2020 05:33 AM

Hello Albert,

thank you for responses!

You wrote:
Comment: both examples assumed the root has form a + b√k, all symbols integer.
Assumption might not hold, they might be rationals (and, more likely, irrationals).

That ist true, but when we don't make the assumption that the searched a's or b's are integers, the numbers of possibilites raised ad infinitum.

The problem I described raised for me to program the HP50g to solve the reduced equation: y^3 +py +q = 0. If the HP50g calculates in exact mode you get very wired expressions and even the roots are integers or simple roots, you cannot see this in the results (nor EVAL or SIMPLIFY helps). My work around is to call:

EVAL 10 FIX ->NUM ->PIQ (I tried this for a example which have the roots 5, -3 and root of 2. It is scary for getting exact values...


RE: HP50g simplifing a root - Albert Chan - 09-30-2020 10:50 PM

(09-30-2020 02:22 AM)Albert Chan Wrote:  (a + b√k)³ = a³ + 3a²b√k + 3ab²k + b³k√k

n = a³ + 3ab²k       → n/a - a² = 3b²k
m = 3a²b + b³k      → 3m/b - 9a² = 3b²k

Equate the 2 to eliminate k, we have b = 3ma / (n + 8a³)

Instead of solving cubic, we can simply filter all (a,b), keeping only integers.
Since a divides n, just check divisors of n:

XCas> find_ab(n,m) := remove(x -> frac(x[1]), map(divisors(n).*sign(n) , a->[a, 3*m*a/(n+8*a^3)]))
XCas> find_abk(n,m) := map(find_ab(n,m), x -> x[0] + x[1] * sqrt((n/x[0]-x[0]^2)/(3*x[1]^2)))

XCas> find_abk(26,-15)               → \([2 - \sqrt{3}]\)
XCas> find_abk(9416, -4256)       → \([11 - 7 \sqrt{5}]\)

XCas> simplify((99+100*sqrt(101))^3)        → \(300940299 + 103940300\sqrt{101}\)
XCas> find_abk(300940299, 103940300)      → \([99 + 100 \sqrt{101}]\)


RE: HP50g simplifing a root - Albert Chan - 10-01-2020 07:31 AM

Here is an equivalent version, faster and shorter.

sign(b√k) = sign(b) = sign(m)

\(|b| \sqrt{k} = |b| \sqrt{{n/a-a^2 \over 3b^2}}
= \sqrt{{n/a-a^2 \over 3}} \)

XCas> find_a(n,m) := remove(a -> remain(3*m, n/a+8*a*a), divisors(n) .* sign(n))
XCas> find_ar(n,m) := map(a -> a + sign(m)*sqrt((n/a-a*a)/3) , find_a(n,m))

XCas> find_ar(300940299, 103940300)      → \([99 + 100 \sqrt{101}]\)


RE: HP50g simplifing a root - peacecalc - 10-01-2020 02:20 PM

Hello Albert,

thank you for sharing your knowledge, it is very enlighting for me!.

I will try to program this with the help of the hp50g CAS, which is a subset of XCAS. If I succeed, I will share it, too.


RE: HP50g simplifing a root - Albert Chan - 10-01-2020 05:22 PM

Timings suggest it may be faster to solve the cubic, than factoring for divisors.
Again, we assumed n, m, k all integers.

Code:
find_cbrt(n,m,k):= { 
  local a;      // solved for A=a^3, then take cube root for a
  a := fsolve(horner([64,-48*n,-15*n*n+27*m*m*k,-n^3],x), x=n);
  a := exact(surd(a,3));
  if (remain(n,a)) return surd(n+m*sqrt(k),3);
  return a + sign(m) * sqrt((n/a-a*a)/3);
}

XCas> find_cbrt(300940299, 103940300, 101)       → \(99 + 100 \sqrt{101}\)

If simplified form search failed, it returned the cube root as-is.

XCas> find_cbrt(300940299, 103940300, 102)       → \(\left(300940299 + 103940300\cdot \sqrt{102}\right)^{\frac{1}{3}}\)


RE: HP50g simplifing a root - peacecalc - 10-04-2020 06:05 PM

Hello Albert,

I tried two way, the first was to probe every small a from 1 until third root of A. From your example a has to tested from 1 to 670, what a luck, that a = 99. My second approach is to calculate every divisor of A (with DIVI) as a possible candidate for small a. Then I'm calculate the difference A - third power of a. Negative results can be sorted out. The rest is divided by 3*k*a and be square rooted. If the result is a integer and not a algebraic expression would be a solution for smal b. and we get:

\[ \left( A\pm B\cdot\sqrt{k} \right)^{1/3} = a \pm b\cdot\sqrt{k} \].

For me the second approach makes mor sense, because the numbers of possibilities can be reduce very fast.

Code:

« \-> E
  « E 3 ^ DUP 'E' STO OBJ-> ->STR
    IF "+" ==
    THEN 1
    ELSE -1
    END SWAP DROP SWAP OBJ-> DROP2 DUP 2 ^ EVAL \-> A SG B RT K

    « A DIVIS SORT \-> L
      « A L 3 ^ -
        «  \-> B
          «
            IF B 0 >
            THEN B
            END
          »
        » DOLIST 

        \-> L3
        « L 1.0000 L3 SIZE SUB 'L' STO L3 L / 3 K * / \SQRT 'L3' STO 
          L3
          «  \-> B
            « B TYPE
              IF 28.0000 ==
              THEN B
              ELSE 0
              END
            »
          » DOLIST 

          'L3' STO { } 
          
          1.0000 L3 SIZE
          FOR I L3 I GET DUP
            IF 0 ‹
            THEN + I +
            ELSE DROP
            END
          NEXT 'L3' STO
          
          IF L3 { } <>
          THEN 
            1.0000 L3 SIZE
            FOR I L3 I GET SG * L L3 I 1.0000 + GET GET SWAP RT * +
            EVAL 
            2.0000 STEP
          ELSE A B SG RT * * + 3 INV ^ EVAL
          END
        »
      »
    »
  »
»



RE: HP50g simplifing a root - peacecalc - 10-04-2020 07:36 PM

Hello all,

an example for finding:

\[ \left( 1859814842094 - 59687820010\cdot\sqrt{415}\right)^{1/3} = 11589 - 145\cdot\sqrt{415} \]

with a real HP50g in 27 sec. 1859814842094 has 96 divisors, after A - a^3 < 0 remain 25 divisors and the last one shows the integer 145 after dividing with 3*415*a and extracting root.


RE: HP50g simplifing a root - Albert Chan - 10-04-2020 11:48 PM

(10-04-2020 06:05 PM)peacecalc Wrote:  I tried two way, the first was to probe every small a from 1 until third root of A. From your example a has to tested from 1 to 670, what a luck, that a = 99. My second approach is to calculate every divisor of A (with DIVI) as a possible candidate for small a. Then I'm calculate the difference A - third power of a. Negative results can be sorted out. The rest is divided by 3*k*a and be square rooted. If the result is a integer and not a algebraic expression would be a solution for smal b. and we get:

\[ \left( A\pm B\cdot\sqrt{k} \right)^{1/3} = a \pm b\cdot\sqrt{k} \]

Based on above description ... not really.

You are solving ³√(A ± B√k) = a ± √r

r = b²k = (A-a³)/(3a)       // note: no B's !

(I might be wrong, your code may have used B somewhere)

Here is my lua code, that checked b actually get to B
see https://www.hpmuseum.org/forum/thread-15660-post-136957.html#pid136957

Code:
cbrt = require'mathx'.cbrt

function simp_cbrt1(A, B, k)         -- simplify cbrt(A + B * sqrt(k))
    local N = abs(A)
    for a = 1+(N-1)%3, cbrt(N), 3 do -- a mod 3 = A mod 3
        if N % a ~= 0 then continue end
        local r = (N/a - a*a)/3
        if r % k ~= 0 then continue end
        local b = B / (3*a*a+r)
        if r == b*b*k then return (A<0 and -a or a), b, k end
    end
end

lua> A, B, k = 1859814842094, -59687820010, 415
lua> simp_cbrt1(A,B,k)
11589      -145      415
lua> simp_cbrt1(A,B+1,k)      -- nothing returned
lua>

Update: added a ≡ A (mod 3), see https://www.hpmuseum.org/forum/thread-15660-post-137252.html#pid137252
Update2: fixed a bug if A is negative
Update3: inspired by simp_cbrt2(), calculate b without square root (i.e. not from r = b²k)


RE: HP50g simplifing a root - peacecalc - 10-05-2020 11:36 AM

Hello Albert,

thank you for critics. Of course I forgot to implement the testing procedure being shure that I found a correct solution! The checking is absolut necessary.

Code:

« \-> E
  « E 3 ^ DUP 'E' STO OBJ-> ->STR
    IF "+" ==
    THEN 1
    ELSE -1
    END SWAP DROP SWAP OBJ-> DROP2 DUP 2 ^ EVAL \-> A SG B RT K

    « A DIVIS SORT \-> L
      « A L 3 ^ -
        «  \-> B
          «
            IF B 0 >
            THEN B
            END
          »
        » DOLIST 

        \-> L3
        « L 1.0000 L3 SIZE SUB 'L' STO L3 L / 3 K * / \SQRT 'L3' STO 
          L3
          «  \-> B
            « B TYPE
              IF 28.0000 ==
              THEN B
              ELSE 0
              END
            »
          » DOLIST 

          'L3' STO { } 
          
          1.0000 L3 SIZE
          FOR I L3 I GET DUP
            IF 0 ‹
            THEN + I +
            ELSE DROP
            END
          NEXT 'L3' STO
          
          IF L3 { } <>
          THEN 
            1.0000 L3 SIZE
            FOR I 
             L3 I GET 
             L L3 I 1.0000 + GET GET 
             \-> a b
              «
                B b 2 ^ K * a  2 ^ 3 * + b *
                IF ==
                THEN a b SG RT * * + EVAL
                ELSE E 3 INV ^ EVAL 
                END
             »
          
          2.0000 STEP
          ELSE E 3 INV ^ EVAL
          END
        »
      »
    »
  »
»

Code is corrected, now the program tests if the found "a" leads to B as input.


RE: HP50g simplifing a root - Albert Chan - 10-05-2020 05:01 PM

(10-05-2020 11:36 AM)peacecalc Wrote:  thank you for critics. Of course I forgot to implement the testing procedure being shure that I found a correct solution!
The checking is absolut necessary.

This checking is the reason my previous posts had different arguments requirement.

find_ar(n, m)             // note, no k's

It returned simplified a + b√k, but the user *must* check √k matches.

find_cbrt(n, m, k)       // we required k to build the cubic

It solved the cubic, checked a is integer, but assumed b is also integer.
Here is a proof that shows b is indeed an integer.

(09-30-2020 02:22 AM)Albert Chan Wrote:  For general case, to solve for all a, b:

      ³√(n + m√k) = a + b√k

(a + b√k)³ = a³ + 3a²b√k + 3ab²k + b³k√k

n = a³ + 3ab²k       → n/a - a² = 3b²k
m = 3a²b + b³k      → 3m/b - 9a² = 3b²k

Since a|n, n/a - a² = 3b²k = integer

Assume b ≠ integer, but b = c/3, where c = integer.

m = 3a²b + b³k = a²c + c³k/27 = integer

Assuming √k is fully reduced, k can not have factor of 27 = 3³

(c³k/27 = integer) ⇒ (3|c) ⇒ (b = c/3 = integer)

Assumption were wrong, b must be integer.      QED


RE: HP50g simplifing a root - peacecalc - 10-06-2020 05:25 AM

Hello Albert,

The HP50g reduces every squareroot if it contains a single integer fully. So the input and the output has to had the same squareroot k. My program takes that from the input and doesn't change it. So what do I overlook?

For calculating A and B I use k as a given value, hmm is that wrong? Are there possibly other solutions with another k as given? But when this would be possibly then we have a lot of more solutinon, too much...?


RE: HP50g simplifing a root - Albert Chan - 10-06-2020 09:40 AM

(10-06-2020 05:25 AM)peacecalc Wrote:  For calculating A and B I use k as a given value, hmm is that wrong? Are there possibly other solutions with another k as given? But when this would be possibly then we have a lot of more solutinon, too much...?

It is possible for the same A,B, but different k's, we can simplify the cube roots.
(Actually, I am not so sure. Seems pretty rare for this to happen ...)

I know that for same A,k, but different B's, it is possible (at least, if we included imaginary numbers)

Below searched for all A, such that ³√(A ± √R) = a ± √r,       where R = B²k, r = b²k

r = b²k = (A/a - a*a)/3 = (x-y)/3, where x=A/a, y=a*a
B = b * (3a² + b²k)
R = B²k = r * (3a² + r)^2 = (x-y)/3 * (3y + (x-y)/3)² = (x-y)/27*(x+8*y)²

XCas> getR(x,y) := (x+8*y)^2*(x-y)/27
XCas> find_all_a(A) := remove(a-> denom(getR(A/a,a*a))!=1, divisors(A).*sign(A))
XCas> find_all_abk(A) := map(a -> a + sqrt((A/a-a*a)/3), find_all_a(A))

For A=90, k=7, we have 2 cube roots able to simplify, B = 34, 101i
Note: because of "±", we also have the "-" solutions.

XCas> s := find_all_abk(90)  → \([\;3+\sqrt7,\quad\quad 6+i\sqrt7,\quad\;\;
15+i\sqrt{73}, \quad\quad 30+i\sqrt{299}]\)
XCas> simplify(s .^ 3)          → \([90+34\sqrt7,\; 90+101i\sqrt7,\;
90+602i\sqrt{73}, \;90+2401i \sqrt{299}]\)


RE: HP50g simplifing a root - Albert Chan - 10-06-2020 12:06 PM

I discovered a necessary condition to simplify cubic: ³√(A ± √R) = a ± √r Smile
If we found a, we can get r = (A/a-a*a)/3

Simplify equations from find_cbrt(): 4a³ - A = (3a) ³√(A²-R)

This implied ³√(A²-R) must be integer !

Example, ³√(9416 - 4256√5)

A² - R = 9416² - 4256² * 5 = -1906624
c = ³√(A² - R) = -124        // cube root may be simplified

4a³ = A + 3*c*a
a = ³√(A/4 + (3c/4)*a)

With my Casio FX 115MS:

5 =
³√(2354 - 93 Ans
=       → 12.36167494
=       → 10.63945257
=       → 11.09160665
=       → 10.97648027 // locking to 11, try it
11 = ↑
=       → 11      // = a
9416 / Ans - Ans Ans
=       → 735    // = 3r
√(Ans / 3 / 5
=       → 7       // = b

Add the sign, ³√(9416 - 4256√5) = 11 - 7√5


RE: HP50g simplifing a root - Albert Chan - 10-06-2020 04:13 PM

(10-06-2020 12:06 PM)Albert Chan Wrote:  Simplify equations from find_cbrt(): 4a³ - A = (3a) ³√(A²-R)

This implied ³√(A²-R) must be integer !

There is a much more elegant way to get above relation !

³√(A ± √R) = a ± √r
³√(A +√R) ³√(A -√R) = (a + √r) (a - √r)
³√(A² - R) = a² - r = a² - (A/a - a*a)/3 = (4a² - A/a)/3

Because RHS is integer, LHS must too.

We have a|A, and 3|(4a² - A/a), which simplified to a≡A (mod 3)
I've updated my lua code now to check a in steps of 3 Smile

Update: Above assumed a is integer; it might be halves.
Including halves, we have 2a ≡ 2a*(A/a) ≡ 2A (mod 3)


RE: HP50g simplifing a root - Albert Chan - 10-07-2020 06:12 PM

(10-06-2020 04:13 PM)Albert Chan Wrote:  ³√(A +√R) ³√(A -√R) = (a + √r) (a - √r)
³√(A² - R) = a² - r = a² - (A/a - a*a)/3 = (4a² - A/a)/3

We can solve above cubics directly.
However, with limited precision, it is hard to get the correct LHS (is it really an integer ?)
One trick is assume that it is (with error under ± 1/2), i.e. we use c = round(³√(A² - R))

We solve the cubics, 4a³ = (3c)*a + A, then confirm (a, r) will, in reverse, produce (A, R)
(Actually, it calculated 3r both ways, using either A or B; both must match)

Below uses Kahan's Solve a Real Cubic Equation method

Code:
cbrt = require'mathx'.cbrt

function cubic_guess(c,d)   -- guess for x^3 = c*x + d
    if c <= 0 then return cbrt(d) end
    c = 1.324718 * max(cbrt(abs(d)), sqrt(c))
    return d < 0 and -c or c
end
   
function simp_cbrt2(A,B,k)  -- simplify cbrt(A + B * sqrt(k))
    local H = 0x3p50        -- for rounding to halves
    local c = cbrt(A*A - B*B*k) + 2*H-2*H
    local a = cubic_guess(0.75*c, 0.25*A)
    repeat                  -- Newton's method
        local a0, x = a, 4*a*a
        a = a - (a*(x-3*c)-A) / (3*(x-c))
    until a+H/2 == a0+H/2
    a = a+H-H
    local b = B/(4*a*a-c)   -- B = b*(4*a*a-(a*a-b*b*k))
    if 3*b*b*k == A/a-a*a then return a,b,k end
end

lua> simp_cbrt2(1859814842094, -59687820010, 415)
11589   -145    415
lua> simp_cbrt2(300940299,103940300,101)
99       100      101
lua> simp_cbrt2(9416,-4256,5)
11        -7       5
lua> simp_cbrt2(26,-15,3)
2         -1        3
lua> simp_cbrt2(26,-15+1,3)       -- no returns, as expected
lua>

For first example, this version run 55X speed of previous simp_cbrt1()
To show why, lets add a debug line, "print(a)", right below keyword "repeat"

lua> simp_cbrt2(1859814842094, -59687820010, 415) -- debug version
12856.226745378446
11738.132585006717
11591.443457378273
11589.000672078266
11589   -145    415


RE: HP50g simplifing a root - Albert Chan - 10-09-2020 12:20 AM

Unfortunately, our divisors based cube root simplify routines were flawed !

(10-01-2020 05:22 PM)Albert Chan Wrote:  
Code:
find_cbrt(n,m,k):= { 
  local a;      // solved for A=a^3, then take cube root for a
  a := fsolve(horner([64,-48*n,-15*n*n+27*m*m*k,-n^3],x), x=n);
  a := exact(surd(a,3));
  if (remain(n,a)) return surd(n+m*sqrt(k),3);
  return a + sign(m) * sqrt((n/a-a*a)/3);
}

Real rational root for a is a divisor of n, *but* possibly divided by 4.
Above XCas version is correct. It does not assume a is integer.
Updated previous post simp_cbrt2() code to handle "quarter" bug.

XCas> find_cbrt(81,30,-3)       → \(\frac{9}{2} + \frac{i}{2}\cdot\sqrt{3}\)
lua> simp_cbrt2(81,30,-3)       → 4.5   0.5   -3

Update: roots impossible as quarters, but possible as halves.
Updated previous post simp_cbrt2() code to handle "halves" bug.
see https://www.hpmuseum.org/forum/thread-15660-post-137252.html#pid137252

---

I added a simple third version, going for converged (a, r), rational or not.
This may be convenient if we do not have √R factored to B√k
Code:
function simp_cbrt3(A,R)    -- simplify cbrt(A +/- sqrt(R))
    local c = cbrt(A*A - R)
    local a = cubic_guess(0.75*c, 0.25*A)
    repeat                  -- Newton's method
        local x = 4*a*a-c
        local eps = (a*(x-2*c)-A) / (3*x)
        a = a - eps
    until a == a + eps*eps
    return a, R/(4*a*a-c)^2
end

lua> simp_cbrt3(10, 108)          -- ³√(10 ± √108) = 1 ± √3
1     3

lua> A, R = 123, 456
lua> a, r = simp_cbrt3(A, R)      -- not possible to simplify, (A²-R) not cubes
lua> a, r
4.956345549114864     0.0837701441234425
lua> cbrt(A + sqrt(R)) , a + sqrt(r)
5.245776273336468     5.245776273336468


RE: HP50g simplifing a root - Albert Chan - 10-09-2020 02:31 PM

(10-09-2020 12:20 AM)Albert Chan Wrote:  Unfortunately, our divisors based cube root simplify routines were flawed !
Real rational root for a is a divisor of n, *but* possibly divided by 4 ...

Another problem is we had assumed there is only 1 real root for a.
Lets rearrange the cubic to match form x³ + 3px - 2q = 0

c³ = A² - R
4*a³ = 3*c*a + A
a³ + 3*(-c/4)*a - 2*(A/8) = 0

→ Cubic discriminant = p³ + q² = (-c/4)³ + (A/8)² = (-c³ + A²) / 64 = R/64
→ If R < 0, we got 3 real roots.

see https://proofwiki.org/wiki/Cardano%27s_Formula

Quote:XCas> find_cbrt(81,30,-3)       → \(\frac{9}{2} + \frac{i}{2}\cdot\sqrt{3}\)

XCas> find_all_a(A,R) := solve(surd(A*A-R,3) = a*a - (A/a-a*a)/3 , a)

XCas> find_all_a(81, 30^2 * -3)       → [-3, -3/2, 9/2]
XCas> simplify( [-3+2i*sqrt(3), -3/2-5i/2*sqrt(3), 9/2+i/2*sqrt(3)] .^ 3)

\(\qquad\quad [81 + 30i\sqrt3\;,\; 81 + 30i\sqrt3\;,\; 81 + 30i\sqrt3 \)

If we consider integer as simplest, then \(\sqrt[3]{81 + 30i\sqrt3} = -3+2i\sqrt3\)

Comment: I was wrong on above example.

x³ = y does not imply ³√y = x. We need to consider branch-cut
In other words, simplified form should match numerical evaluated values.

>>> (81 + 30j * 3**0.5) ** (1/3)
(4.5+0.86602540378443837j)