Display bug in 5.6.



Here is my analysis of the powerseries(1 / sqrt(1+x),x,0) bug
(this was done with Maxima 5.6 under Linux).

(C1) display2d : false;

(D1) FALSE
(C2) :lisp(trace srbinexpnd);

(SRBINEXPND)
(C2) powerseries((1+x)^(1/2),x,0);

  1> (SRBINEXPND
         ((N (RAT SIMP) 1 2) (A . 1) (W . |$x|) (M . 1) (X . |$x|)
          (M . 1) (X . |$x|) (C . 1) (CC . 1)))
  <1 (SRBINEXPND
         ((%SUM)
          ((MTIMES SIMP) ((RAT SIMP) 2 3)
           ((MEXPT SIMP)
            (($BETA SIMP)
             ((MPLUS SIMP) ((RAT SIMP) 3 2) ((MTIMES SIMP) -1 $I1))
             ((MPLUS SIMP) 1 $I1))
            -1)
           ((MEXPT SIMP) |$x| $I1))
          $I1 0 $INF))
(D2) 2*('SUM(x^I1/BETA(3/2-I1,I1+1),I1,0,INF))/3
(C3) powerseries((1+x)^(-1/2),x,0);

  1> (SRBINEXPND
         ((N (RAT SIMP) 1 2) (A . 1) (W . |$x|) (M . 1) (X . |$x|)
          (M . 1) (X . |$x|) (C . 1) (CC . 1)))
  <1 (SRBINEXPND
         ((%SUM)
          ((MTIMES SIMP) ((RAT SIMP) 2 3)
           ((MEXPT SIMP)
            (($BETA SIMP)
             ((MPLUS SIMP) ((RAT SIMP) 3 2) ((MTIMES SIMP) -1 $I2))
             ((MPLUS SIMP) 1 $I2))
            -1)
           ((MEXPT SIMP) |$x| $I2))
          $I2 0 $INF))
(D3) 2*('SUM(x^I2/BETA(3/2-I2,I2+1),I2,0,INF))/3

For both cases, srbinexpnd gets the same arguments;  surely,
this is a bug.  To fix this, it might seem that we should simply
negate the exponent when the numerator is 1 in sratexpnd;
however, this would be wrong because srintegexpd expects the exponent
to be the exponent of the denominator.  Thus in the
function call (sratexpnd n d), we should  negate the exponent only
if n = 1 and the exponent is not an integer. [The exponent is
stored in the association list ans; n is the numerator of what
is being expanded.]

My proposed fix:


(defun sratexpnd (n d)
    (let ((ans (list nil))
        (splist)
        (linpat
         '((mtimes) ((coefftt) (cc not-zero-free var))
                  ((mexpt) ((mplus) ((coeffpt)
                               (w m1 ((mexpt) (x equal var)
                                          (m not-zero-free var)))
                               (c freevar))
                              ((coeffpp) (a freevar)))
                         (n not-zero-free var)))))
      (cond ((and (not (equal n 1)) (smono n var))
             (m* n (sratexpnd 1 d)))
            ((free d var)
             (cond ((poly? n var)
                  (m// n d))
                 ((m1 n linpat)
                  (m* (srbinexpnd (cdr ans)) (div* 1 d)))
                 ((throw 'psex nil))))
            ((smonop d var)
             (cond ((mplusp n)
                  (m+l (mapcar #'(lambda (q) (div* q d)) (cdr n))))
                 (t (m// n d))))
            ((not (equal 1 (setq *gcd* (ggcd (nconc (exlist n) (exlist d))))))
             (sratsubst *gcd* n d))
            ((and (equal n 1)
                (prog2 (setq d (let (($ratfac t))
                              (ratdisrep ($rat (factor d) var))))
                     (m1 d linpat)))

             ;; fix for powerseries(1/sqrt(1+x),x,) bug--------------
             (cond ((not (integerp (cdr (assq 'n ans))))
                  (setf (cdadr ans) (mul -1 (cdadr ans)))))
             ;; end of bug fix---------------------------------------

             (m// (srbinexpnd (cdr ans)) (cdr (assq 'cc (cdr ans)))))
            (t
             (and *ratexp (throw 'psex nil))
             (if (not (eq (caar d) 'mtimes)) (ratexand1 n d))
             (do ((p (cdr d) (cdr p)))
               ((null p) (ratexand1 n d))
               (cond ((or (eq (car p) var)
                        (and (mexptp (car p)) (eq (cadaar p) var)))
                    (return (m* (sratexpnd n (meval (div* d (car p))))
                              (list '(mexpt) (car p) -1))))))))))


Under Common Lisp, we use assoc instead of assq

....
             (cond ((not (integerp (cdr (assoc 'n ans :test #'eq))))
                  (setf (cdadr ans) (mul -1 (cdadr ans)))))
             (print `(ans = ,ans))
             (m// (srbinexpnd (cdr ans)) (cdr (assoc 'cc (cdr ans) :test #'eq))))
....

(assq uses sloop; I remember some disscussion about expunging sloop
from Maxima.)

Barton





Wolfgang Jenkner <wjenkner@inode.at>@www.ma.utexas.edu on 08/03/2002
10:20:25 AM

Sent by:    maxima-admin@www.ma.utexas.edu


To:    Roberto Baginski <rbaginski@uol.com.br>
cc:    Raymond Toy <toy@rtp.ericsson.se>, Maxima List
       <maxima@www.ma.utexas.edu>

Subject:    Re: [Maxima] Display bug in 5.6.



Roberto Baginski <rbaginski@uol.com.br> writes:

>
> Surprisingly or not, old Maxima 5.5 (running on Windows) displays it
> correctly (see below).
>
> Maxima 5.5 Tue Dec 5 16:55:33 2000 (with enhancements by W. Schelter).
> Licensed under the GNU Public License (see file COPYING)
> (C1) powerseries(1/sqrt(1+x), x, 0);
>
>                  INF
>                  ====        I1
>                  \          x
>                2  >     --------------------
>                  /       3
>                  ====   BETA(- - I1, I1 + 1)
>                  I1 = 0        2
> (D1)                 -----------------------------
>                          3

Except that the result is wrong.  As a matter of fact this is the
Taylor series of sqrt(1+x) at x=0...

Wolfgang
--
wjenkner@inode.at

_______________________________________________
Maxima mailing list
Maxima@www.math.utexas.edu
http://www.math.utexas.edu/mailman/listinfo/maxima