From: Rupert S. <rsw...@us...> - 2014-07-29 22:05:50
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Maxima CAS". The branch, master has been updated via a2b80c7e4feda95697f28a3c8479d63aad9c1c1c (commit) from da6a1f63543cee935ba9f6c5832c1a5181d29fc8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a2b80c7e4feda95697f28a3c8479d63aad9c1c1c Author: Rupert Swarbrick <rsw...@gm...> Date: Tue Jul 29 23:04:58 2014 +0100 Don't try to expand in SP2DIFF for unknown orders Also, tidy up the code a bit to make it a bit clearer how the function is supposed to work. This patch fixes bug #2765. diff --git a/src/series.lisp b/src/series.lisp index a324fbf..0114b84 100644 --- a/src/series.lisp +++ b/src/series.lisp @@ -424,19 +424,33 @@ (cons x (dup x (1- %n))))) (defun sp2diff (exp l) - (let (indl) - (cond ((free exp var) - (sp3form (sp2expand exp) (cons '(%derivative) l))) - (t (do ((l l (cddr l)) (ll)) - ((null l) - (if ll (sp3form exp (cons '(%derivative) (nreverse ll))) - exp)) - (cond ((eq (car l) var) - (do ((%i (cadr l) (1- %i))) - ((= %i 0) exp) - (setq indl nil - exp (sp2diff1 (sp2expand exp) nil nil)))) - (t (setq ll (list* (cadr l) (car l) ll))))))))) + (cond + ((free exp var) + (sp3form (sp2expand exp) (cons '(%derivative) l))) + (t + ;; If the expression isn't free of VAR, we know how to expand the result if + ;; the orders of differentiation are all explicit non-negative + ;; integers. Otherwise, give up. + (let ((indl) (remaining-derivs)) + (loop + for (y order) on l by #'cddr + do + (cond + ((not (typep order '(integer 0))) + (throw 'psex nil)) + + ((not (eq y var)) + (setf remaining-derivs (list* order y remaining-derivs))) + + (t + (dotimes (i order) + (setf indl nil) + (setf exp (sp2diff1 (sp2expand exp) nil nil)))))) + + (if remaining-derivs + (sp3form exp `((%derivative) + ,@(nreverse remaining-derivs))) + exp))))) (defun sp2diff1 (exp ind lol) ;ind is a list of the indices ;lol is a list of the lower limits diff --git a/tests/rtest16.mac b/tests/rtest16.mac index 883835c..7520934 100644 --- a/tests/rtest16.mac +++ b/tests/rtest16.mac @@ -2043,3 +2043,7 @@ block([inf_exp, minf_exp], minf_exp: powerseries (1/(1+x), x, inf), inf_exp - minf_exp); 0$ + +/* #2765: powerseries with non-integer order */ +powerseries (diff (f(x), x, biggles), x, 0); +"Failed to expand"$ ----------------------------------------------------------------------- Summary of changes: src/series.lisp | 40 +++++++++++++++++++++++++++------------- tests/rtest16.mac | 4 ++++ 2 files changed, 31 insertions(+), 13 deletions(-) hooks/post-receive -- Maxima CAS |