solve bug



This isn't a fix for the solve bug,

(C4) SOLVE((a^2+1)*x^2+a*x+a,x);
quotient is not exact
 -- an error.  Quitting.  To debug this try DEBUGMODE(TRUE);)

but it may help somebody find it.  I believe the bug is caused by
what simpnrt returns in the function solvequad. It is the function
fullratsimp following simpnrt that never returns a value; simpnrt
appears to be okay, but fullratsimp doesn't like  what it returns.
Replacing

(DEFUN SOLVEQUAD (EXP &AUX DISCRIM A B C)
  (SETQ A (CADDR EXP))
  (SETQ B (PTERM (CDR EXP) 1.))
  (SETQ C (PTERM (CDR EXP) 0.))
  (SETQ DISCRIM (SIMPLIFY (PDIS (PPLUS (PEXPT B 2.)
                           (PMINUS (PTIMES 4. (PTIMES A C)))))))
  (SETQ B (PDIS (PMINUS B)))
  (SETQ A (PDIS (PTIMES 2. A)))
  ;; At this point, everything is back in general representation.
  (COND ((EQUAL 0. DISCRIM)
      (SOLVE3 (FULLRATSIMP `((MQUOTIENT) ,B ,A))
           (TIMES 2. MULT)))
     (T (SETQ DISCRIM (SIMPNRT DISCRIM 2.))
        (SOLVE3 (FULLRATSIMP `((MQUOTIENT) ((MPLUS) ,B ,DISCRIM) ,A))
             MULT)
        (SOLVE3 (FULLRATSIMP `((MQUOTIENT) ((MPLUS) ,B ((MMINUS) ,DISCRIM)) ,A))
             MULT))))


with

(DEFUN SOLVEQUAD (EXP &AUX DISCRIM A B C)
  (SETQ A (CADDR EXP))
  (SETQ B (PTERM (CDR EXP) 1.))
  (SETQ C (PTERM (CDR EXP) 0.))
  (SETQ DISCRIM (SIMPLIFY (PDIS (PPLUS (PEXPT B 2.)
                           (PMINUS (PTIMES 4. (PTIMES A C)))))))
  (SETQ B (PDIS (PMINUS B)))
  (SETQ A (PDIS (PTIMES 2. A)))
  ;; At this point, everything is back in general representation.
  (COND ((EQUAL 0. DISCRIM)
      (SOLVE3 (FULLRATSIMP `((MQUOTIENT) ,B ,A))
           (TIMES 2. MULT)))
     (T (SETQ DISCRIM `((mexpt) ,DISCRIM ,(rat 1 2))) ;; only change
        (SOLVE3  `((MQUOTIENT) ((MPLUS) ,B ,DISCRIM) ,A)
              MULT)
        (SOLVE3  `((MQUOTIENT) ((MPLUS) ,B ((MMINUS) ,DISCRIM)) ,A)
              MULT))))

eliminates the bug:

(C8) load("solve_crusty.lisp")$

(C9) solve((a^2+1)*x^2 + a*x+a,x);
(D9) [x = (-SQRT(-4*a^3+a^2-4*a)-a)/(2*a^2+2),
      x = (SQRT(-4*a^3+a^2-4*a)-a)/(2*a^2+2)]

My maxima is 5.6; my Lisp is GCL 2.4.0; and my OS is Redhat 6.1.

Barton