From: Dieter K. <cra...@us...> - 2008-09-29 13:20:59
|
Update of /cvsroot/maxima/maxima/src In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv22921 Modified Files: asum.lisp Log Message: Adding code to simpfact to expand factorial(n+m) where m is an integer The expansion depends on the Maxima User variable $factorial_expand. The functionality is comparable with the function minfactorial. But because the expansion is done by the simplifier we have no problems with nested expression (see SF[1486452]). Adding the simplification factorial(inf) -> inf Related bugs: SF[1486452] Index: asum.lisp =================================================================== RCS file: /cvsroot/maxima/maxima/src/asum.lisp,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- asum.lisp 21 Sep 2008 21:27:31 -0000 1.30 +++ asum.lisp 29 Sep 2008 13:20:47 -0000 1.31 @@ -14,7 +14,7 @@ (load-macsyma-macros rzmac) -(declare-top (special opers *a *n $factlim sum msump *i *opers-list opers-list $ratsimpexpons makef)) +(declare-top (special opers *a *n $factlim sum msump *i *opers-list opers-list $ratsimpexpons makef $factorial_expand)) (loop for (x y) on '(%cot %tan %csc %sin %sec %cos %coth %tanh %csch %sinh %sech %cosh) by #'cddr do (putprop x y 'recip) (putprop y x 'recip)) @@ -118,6 +118,24 @@ (complex-number-p y 'bigfloat-or-number-p))) (and (not makef) (ratnump y) (equal (caddr y) 2))) (simplify (list '(%gamma) (add 1 y)))) + ((eq y '$inf) '$inf) + ((and $factorial_expand + (mplusp y) + (integerp (cadr y))) + ;; factorial(n+m) and m integer. Expand. + (let ((m (cadr y)) + (n (simplify (cons '(mplus) (cddr y))))) + (cond ((>= m 0) + (mul + (simplify (list '($pochhammer) (add n 1) m)) + (simplify (list '(mfactorial) n)))) + ((< m 0) + (setq m (- m)) + (div + (mul (power -1 m) (simplify (list '(mfactorial) n))) + ;; We factor to get the ordering (n-1)*(n-2)*... + ($factor + (simplify (list '($pochhammer) (mul -1 n) m)))))))) ((or (not (fixnump y)) (not (> y -1))) (eqtest (list '(mfactorial) y) x)) ((or (minusp $factlim) (not (> y $factlim))) |