From: Andrej V. <an...@us...> - 2010-01-18 08:36:45
|
Update of /cvsroot/maxima/maxima/share/contrib/solve_rec In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv17582 Modified Files: rtest_simplify_sum.mac simplify_sum.mac simplify_sum_test.mac Log Message: simplify_sum update: Handle sums from -inf better. Added some new code for sums with Fibonacci numbers. Index: rtest_simplify_sum.mac =================================================================== RCS file: /cvsroot/maxima/maxima/share/contrib/solve_rec/rtest_simplify_sum.mac,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- rtest_simplify_sum.mac 22 Dec 2009 14:50:29 -0000 1.20 +++ rtest_simplify_sum.mac 18 Jan 2010 08:35:27 -0000 1.21 @@ -492,3 +492,12 @@ 2*(n/2+1)!+2*((n-1)/2+1)!-sqrt(%pi)-2 ); 0; + +test_sum( + sum(i*fib(i-1)/2^i,i,1,inf), + [], + false, + [], + 6 +); +0; Index: simplify_sum.mac =================================================================== RCS file: /cvsroot/maxima/maxima/share/contrib/solve_rec/simplify_sum.mac,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- simplify_sum.mac 6 Jan 2010 12:39:23 -0000 1.29 +++ simplify_sum.mac 18 Jan 2010 08:35:39 -0000 1.30 @@ -84,19 +84,47 @@ /* Check if we have a sum - if not then simplify all arguments. */ if mapatom(expr) then expr else if part(expr, 0)#nounify(sum) then map(simplify_sum, expr) - + + + /* Check for sum(expr, var, min, inf) */ + else if (part(expr, 3)=-inf or part(expr, 3)=minf) and part(expr, 4)=inf then block( + [summand, var_, lo, hi], + [summand, var_, lo, hi]: args(expr), + simplify_sum(apply('sum, [summand, var_, 0, inf])) + + simplify_sum(apply('sum, [subst(var_=-var_, summand), var_, 1, inf]))) + + /* Check for sum(expr, var, minf, hi) */ + else if part(expr, 3)=-inf or part(expr, 3)=minf then ( + [summand, var_, lo, hi], + simplify_sum(apply('sum, [subst(var_=-var_, summand), var_, -hi, inf]))) + + /* Trigonometric sums */ else if catch( scanmap( lambda([u], if not atom(u) and member(part(u,0), [sin, cos, sinh, cosh]) then throw(true)), expr, bottomup))=true then block( [sm1 : simplify_sum(split_sum(expand(exponentialize(expr))))], - if freeof_sum(sm1) then sm1 + if freeof_sum(sm1) then trigsimp(rectform(sm1)) else expr) + /* Sums with Fibonacci numbers */ + else if catch( + scanmap( + lambda([u], if not atom(u) and part(u,0)=fib then throw(true)), + expr, + bottomup))=true then block( + [sm1: simplify_sum(split_sum(expand(fibtophi(expr))))], + if freeof_sum(sm1) then block( + [algebraic:true], + ratsimp(sm1)) + else expr) + + /* Check if summand is a logarighm */ else if not(atom(part(expr, 1))) and part(expr, 1, 0)=log and part(expr, 2)#minf and part(expr, 3)#inf then log(simplify_product(apply(product, append([exp(part(expr, 1))], rest(args(expr)))))) + /* Main summation code starts here */ else block( [summand : ratsimp(part(expr, 1)), var : part(expr, 2), @@ -358,6 +386,8 @@ support : [if numberp(support[1]) then ceiling(support[1]) else support[1], if numberp(support[2]) then floor(support[2]) else support[2]], + if support[2]<lo or support[1]>hi then return(0), + /* Check if bounds are implicit. */ if ss_max(lo, support[1])=support[1] then lower_bound_implicit : true, if ss_min(hi, support[2])=support[2] then upper_bound_implicit : true, @@ -814,7 +844,7 @@ if freeof_integrate(expr1) then expr1 else apply('sum, [expr, var, lo, hi])) - + else apply('sum, [expr, var, lo, hi])$ eval_when(batch, Index: simplify_sum_test.mac =================================================================== RCS file: /cvsroot/maxima/maxima/share/contrib/solve_rec/simplify_sum_test.mac,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- simplify_sum_test.mac 7 May 2009 08:19:04 -0000 1.11 +++ simplify_sum_test.mac 18 Jan 2010 08:35:44 -0000 1.12 @@ -22,14 +22,14 @@ )$ test_sum( - sum(r/k*binom(n,r)*binom(m,k-r)/binom(n+m,k),r,0,k), + sum(r/k*binomial(n,r)*binomial(m,k-r)/binomial(n+m,k),r,0,k), [n>k, m>k-1], true, [makefact, minfactorial] )$ test_sum( - sum(binom(n,k)/(k+1), k, 0, n), + sum(binomial(n,k)/(k+1), k, 0, n), [], true, [] @@ -43,7 +43,7 @@ )$ test_sum( - sum((-1)^k * binom(n,k)*x/(x+k), k, 0, n), + sum((-1)^k * binomial(n,k)*x/(x+k), k, 0, n), [], true, [factcomb] @@ -57,7 +57,7 @@ )$ test_sum( - sum((binom(3*k+1,k)*binom(3*(n-k),n-k))/(3*k+1), k, 0, n), + sum((binomial(3*k+1,k)*binomial(3*(n-k),n-k))/(3*k+1), k, 0, n), [], false, [] @@ -78,63 +78,63 @@ )$ test_sum( - sum((-1)^k*binom(x-2*k,n-k)*binom(x-k+1,k),k,0,n), + sum((-1)^k*binomial(x-2*k,n-k)*binomial(x-k+1,k),k,0,n), [x>2*n, x>n-1], true, [] )$ test_sum( - sum((-1)^s*binom(2*m, s)^3, s, 0, 2*m), + sum((-1)^s*binomial(2*m, s)^3, s, 0, 2*m), [], false, [] )$ test_sum( - sum((-1)^k*binom(k,n-k), k, 0, n), + sum((-1)^k*binomial(k,n-k), k, 0, n), [], true, [rectform, trigreduce] )$ test_sum( - sum(binom(n,k)^2*binom(3*n+k,2*n), k, -inf, inf), + sum(binomial(n,k)^2*binomial(3*n+k,2*n), k, -inf, inf), [n>0], false, [] )$ test_sum( - sum((-1)^k*binom(n-k,k)*2^(n-2*k), k, 0, n), + sum((-1)^k*binomial(n-k,k)*2^(n-2*k), k, 0, n), [], true, [] )$ test_sum( - sum(binom(x,k)*binom(y,k), k, 0, y), + sum(binomial(x,k)*binomial(y,k), k, 0, y), [x>y], true, [factcomb] )$ test_sum( - sum((-1)^(n-k)*binom(n,k)*binom(k+b,k), k, 0, n), + sum((-1)^(n-k)*binomial(n,k)*binomial(k+b,k), k, 0, n), [b>0], true, [factcomb] )$ test_sum( - sum(binom(n+k,k)/2^k,k,0,n), + sum(binomial(n+k,k)/2^k,k,0,n), [], true, [] )$ test_sum( - sum((2^(4*k)*binom(2*n-2*k,n-k))/(2*k*(2*k+1)*binom(2*k,k)), k, 1, n), + sum((2^(4*k)*binomial(2*n-2*k,n-k))/(2*k*(2*k+1)*binomial(2*k,k)), k, 1, n), [], true, [] @@ -148,21 +148,21 @@ )$ test_sum( - sum(2^(n-k)*binom(n+k,2*k),k,-inf,inf), + sum(2^(n-k)*binomial(n+k,2*k),k,-inf,inf), [n>0], true, [] )$ test_sum( - sum(((-1)^k*binom(2*k,k)*binom(n,k))/4^k,k,0,n), + sum(((-1)^k*binomial(2*k,k)*binomial(n,k))/4^k,k,0,n), [], true, [] )$ test_sum( - sum((-1)^k*binom(2*k,k)*binom(2*n,k)*binom(4*n-2*k,2*n-k),k,0,2*n), + sum((-1)^k*binomial(2*k,k)*binomial(2*n,k)*binomial(4*n-2*k,2*n-k),k,0,2*n), [], true, [] @@ -397,3 +397,10 @@ false, [] ); + +test_sum( + sum(i*fib(i-1)/2^i,i,1,inf), + [], + false, + [] +); |