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