realonly in algsys.lisp



At Sun, 26 Apr 2009 16:10:03 +0200,
Dieter Kaiser wrote:
> I think that it is always good to handle complex expressions more
> carefully and complete. A test freeof(%i,x) is a very weak test. The
> test function $csign can detect complex and imaginary expressions too.
> If we use it for your example, we get:
> 
> (%i16) sol : map ('rhs, solve (3*x^3  - 3*x + 1))$
> 
> (%i17) map(lambda([x],csign(x)),sol);
> (%o17) [complex,complex,complex]

3*x^3 - 3*x + 1 has three real roots, but it is irreducible.

(%i1) sol : map ('rhs, solve (3*x^3  - 3*x + 1))$

(%i2) map ('rectform, sol);
(%o2) [%i*((sqrt(3)*sin((%pi-atan(3*3^-(3/2)))/3)/2
          +3*cos((%pi-atan(3*3^-(3/2)))/3)/2)
          /3
          -sin((%pi-atan(3*3^-(3/2)))/3)/(2*sqrt(3))
          -cos((%pi-atan(3*3^-(3/2)))/3)/2)
        +(3*sin((%pi-atan(3*3^-(3/2)))/3)/2
         -sqrt(3)*cos((%pi-atan(3*3^-(3/2)))/3)/2)
         /3+sin((%pi-atan(3*3^-(3/2)))/3)/2
        -cos((%pi-atan(3*3^-(3/2)))/3)/(2*sqrt(3)),
       %i*((sqrt(3)*sin((%pi-atan(3*3^-(3/2)))/3)/2
          -3*cos((%pi-atan(3*3^-(3/2)))/3)/2)
          /3
          -sin((%pi-atan(3*3^-(3/2)))/3)/(2*sqrt(3))
          +cos((%pi-atan(3*3^-(3/2)))/3)/2)
        -sin((%pi-atan(3*3^-(3/2)))/3)/2
        +(-3*sin((%pi-atan(3*3^-(3/2)))/3)/2
         -sqrt(3)*cos((%pi-atan(3*3^-(3/2)))/3)/2)
         /3-cos((%pi-atan(3*3^-(3/2)))/3)/(2*sqrt(3)),
       2*3^-(1/2)*cos((%pi-atan(3*3^-(3/2)))/3)]

(%i3) map ('trigsimp, %);
(%o3) [(sqrt(3)*sin(5*%pi/18)-cos(5*%pi/18))/sqrt(3),
       -(sqrt(3)*sin(5*%pi/18)+cos(5*%pi/18))/sqrt(3),
       2*cos(5*%pi/18)/sqrt(3)]

imagpart and trigsimp do the trick. Of course it is better to
implement a more efficient algorithm which tests if a given expression
is real.

-- 
Yours sincerely,
Alexey Beshenov <al at cadadr.org>