SERIOUS simpsum bug



Can you explain why there is a conditionalization
for #+cl there?  I don't see any reason for this
code to depend on common lisp or not.  My thought
on fixing the code previously displayed was to
just remove #-cl
RJF


Martin RUBEY wrote:
> OK, I got the bug now:
> 
> The fix is rather obvious (except that I had to dig through all of sum,
> see below) and the bug is rather serious (I can produce lots of
> everyday examples,
> 
> (C1) sum(f(k)+1,k,1,n),simpsum;
> 
> (D2)                                   n
> 
> so I propose to include it in 5.9.0 !!!
> 
> I didn't change some things I would like to, I think this is for after 
> 5.9.0...
> 
> fix and explanation below
> Martin
> 
> -----------------------------fix-------------------------------------
>  diff combin.lisp combin.lisp.~1.2.~
> 915,920d914
> < ; Kratt5, 26.11.2002
> < ; adsum's and adusum's the sum of e.
> <
> < ; It's result is discarded. (at least I think that this function is
> < ; only called by sumsum, but there are lots of places where a variable
> < ; is called "sum"...)
> 930,939d923
> < ; this is to deal with linearity Kratt5, 26.11.2002
> <       ((let (*a *n (var *var*))
> <          (cond ((prog2 (m2 e '((mtimes) ((coefftt) (var* (set) *a 
> freevar))
> <                                         ((coefftt) (var* (set) *n 
> true)))
> <                            nil)
> <                     (not (equal *a 1)))
> < ;; we have to return T, so that sum is exited if the test was successful
> <                 (prog2 (sum *n (list '(mtimes) y *a))
> <                     T)))))
> < ;;
> 943,944c927
> <        #+cl (adusum (list '(mtimes) e y)) ;; Kratt5 26.11.2002
> < ;;       nil
> ---
> 
>>       nil
> 
> 
> --------------------------end fix------------------------------------
> 
> I tested it with
> 
> Maxima version: 5.9.0rc3
> Maxima build date: 13:52 11/18/2002
> host type: i686-pc-linux-gnu
> lisp-implementation-type: Kyoto Common Lisp
> lisp-implementation-version: GCL-2-5.0
> 
> ----------------------------explanation ------------------
> (lisp level)
> 
> the structure of $sum is roughly as follows:
> 
> $sum: argcheck, call dosum with meval'd bounds
> 
>   dosum: didn't look at this too much
> 
> after this, meval calls simpsum
> 
> **** if you type 'sum(f(k),k,1,n),simpsum; meval calls only simpsum ****
> 
> $simpsum: call simpsum1
> 
>   simpsum1: checks lo=hi, otherwise
> 	    exp not depending on the summation index, otherwise
> 	    if $simpsum, call simpsum2
> 
> **** simpsum2 is found in combin.lisp ****
> 
>     simpsum2: sets up a variable *plus, which will contain all the stuff 
>                 which is added together at the end
>               calls sumsum
> 
>       sumsum: returns the part of the expression it was able to sum up 
>               (this is the contents of the variable "usum"), all the rest
>               (the contents of the variable "sum") is put into the
>               variable *plus, which is then used by simpsum2
>               calls sum
> 
>         sum: adsum's and adusum's the sum of e. 
>              It's result is discarded. (at least I think that this
>              function is only called by sumsum, but there are lots of 
>              places where a variable is called "sum"...)
> 
> _______________________________________________
> Maxima mailing list
> Maxima@www.math.utexas.edu
> http://www.math.utexas.edu/mailman/listinfo/maxima