           /** Manipulation of Sums **/

/*K: Sum; series; reversal of series; canonical form; summation */
/*A: John Gottschalk */
/*S: University of Western Australia */
/*D: January 1985 */

/* This is an extension/replacement of some operations XSum performs */

/*P: XUnrat is loaded when needed. */
If[~P[_XLoadonce[Loaded]],<XLoadonce]
_Unrat[Init] :: Loadonce[XUnrat]

/*W: Redefines _Sum[Smp] and _Dist[Smp]*/
_Sum[Smp] : Inf
_Dist[Smp]:{Inf,0};

/*: SumCan[$expr,($k:0)]
       rewrites sums in $expr with canonical limits (the lower limit 
       is $k) then removes all terms independent of the summation 
       index outside the sum. */
SumCan_:Tier
SumCan[$exp,$k] :: Map[S[Si[$1,SSumM[1],0],{SSuminit[$k],SSumM[2]},3,0],\
	{$exp},-Inf,In['Sum,$[0]]][1]
SumCan[$expr]    :: SumCan[$expr,0]

SSuminit[$k,1] : Sum[$x,{$r,$min,$max,$inc_=Natp[$inc]}] --> \
  Sum[S[$x,$r->$inc ($r-$k)+$min],{$r,$k,\
       If[P[$max=Inf],Inf,($max-$min)/$inc+$k]}]

SSuminit[$k,2] : Sum[$x,{$r,$min_=~P[$min=$k],$max}] --> \
  Sum[S[$x,$r->$r+$min-$k],{$r,$k,If[P[$max=Inf],Inf,$max-$min+$k]}]

/* Canonical form for sums. */

/*: SSumM[1]
	alters the lower or upper limits of summation if the summand
	    is zero at those values. */
SSumM[1,1] :: Sum[$x_=S[$x,$r->$k]=0,{$r,$k,$m}] --> \
		     	Sum[S[$x,$r->$r+1],{$r,$k,If[P[$m=Inf],Inf,$m-1]}]

SSumM[1,2] :: Sum[$x_=S[$x,$r->$m]=0,{$r,$k,$m}] --> \
	     		Sum[$x,{$r,$k,If[P[$m=Inf],Inf,$m-1]}]

/*: SSumM[2]
	moves constant terms outside sums. */
SSumM[2] :Sum[$a,{$r,$k,$m}] --> Ap[$1[1]*Sum[$1[2],{$r,$k,$m}],{Freeof[$r,$a]}]

/*: Freeof[$temp,$exp] 
     returns as a list the $temp independent and $temp dependent part of $exp*/
Freeof_:Tier
Freeof[$temp,$exp] :: If[In[$temp,$exp],{Nc[$exp],$exp/Nc[$exp]},{$exp,1}]
Freeof[$temp,$x^(($y_=In[$temp,$y]) + ($z_=~In[$temp,$z]))] : {$x^$z,$x^$y}
Freeof[$temp,$exp _= $exp[0] = ('Mult) | $exp[0] = ('Div)] :: Map[Freeof[\
	      $temp,$1],$exp/Nc[$exp]] {Nc[$exp],1}

/* Useful manipulations of sums. */

/*: SSumM[3]
	rewrites sums of added quantities as additions of sums. */
SSumM[3] : Sum[$x,{$r,$k,$m}] -->  \
	      Nc[$x] Dist[Sum[$x/Nc[$x],{$r,$k,$m}],{'Sum,'Plus,'Plus,'Sum,{1}}]

/*: SSumM[4]
	:SSumrev reverses sums of the type Sum[x[r],{r,0,m}]. */
SSumrev : \
SSumM[4] : Sum[$x,{$r,$k,$m_=~P[$m=Inf]}] --> Sum[S[$x,$r->$m+$k-$r],{$r,$k,$m}]

/*: SSumM[5]
	:SSumsplit splits sums into a sum over the odd index values and a 
	sum over the even values. */
SSumsplit :\
SSumM[5] : Sum[$x,{$r,$k,$m}] --> \
  Sum[S[$x,$r->2$r-$k],  {$r,$k,If[P[$m=Inf],Inf,($m+$k)/2]}]+\
  Sum[S[$x,$r->2$r-$k+1],{$r,$k,If[P[$m=Inf],Inf,($m+$k-1)/2]}]

/*: SSumAdd[1][$n]
    adds $n terms to the upper limit of sums. For n>=0
    Sum[f[r],{r,k,m}] -> Sum[f[r],{r,k,m+n}]-Sum[f[r+m+1-k],{r,k,n+k-1}].
    n <= 0 is also allowed. */
SSumAdd[1][$n_=$n>=0] : Sum[$x,{$r,$k,$m_=~P[$m=Inf]}]  --> \
  Sum[$x,{$r,$k,$m+$n}] - Sum[S[$x,$r->$r-$k+$m+1],{$r,$k,$n+$k-1}]
SSumAdd[1][Inf] : Sum[$x,{$r,$k,$m_=~P[$m=Inf]}]  --> \
  Sum[$x,{$r,$k,Inf}] - Sum[S[$x,$r->$r-$k+$m+1],{$r,$k,Inf}]

SSumAdd[1][$n_=$n<=0] : Sum[$x,{$r,$k,$m_=~P[$m=Inf]}]  --> \
  Sum[$x,{$r,$k,$m+$n}] + Sum[S[$x,$r->$r-$k+$m+$n+1],{$r,$k,-$n+$k-1}]

/*: SSumAdd[2][$n]
    adds $n terms to the lower limit of sums. For n>=0
    Sum[f[r],{r,k,m}] -> Sum[f[r-n],{r,k,m+n}]-Sum[f[r-n],{r,k,n+k-1}].
    n <= 0 is allowed. */
SSumAdd[2][$n_=$n>=0] : Sum[$x,{$r,$k_=~P[$k=-Inf],$m}] --> \
  Sum[S[$x,$r->$r-$n],{$r,$k,If[P[$m = Inf],Inf,$m+$n]}]-\
  Sum[S[$x,$r->$r-$n],{$r,$k,$n+$k-1}]

SSumAdd[2][$n_=$n<=0] : Sum[$x,{$r,$k_=~P[$k=-Inf],$m}] --> \
  Sum[S[$x,$r->$r-$n],{$r,$k,If[P[$m = Inf],Inf,$m+$n]}]+\
  Sum[$x,{$r,$k,-$n+$k-1}]

/*: SSumRat[i] 
    are substitutions useful for manipulating sums of rational functions. */

SSumRat[1] : Sum[$x,{$r,$k,$m}] --> Sum[Pf[$x,$r],{$r,$k,$m}]
SSumRat[2] : Sum[$x,{$r,$k,$m}] --> Sum[Fac[$x],{$r,$k,$m}]
SSumRat[3] : Sum[$x,{$r,$k,$m}] --> Sum[Ex[$x],{$r,$k,$m}]
SSumRat[4] : Sum[$x,{$r,$k,$m}] --> Sum[Rat[$x],{$r,$k,$m}]
SSumRat[5] : Sum[$x,{$r,$k,$m}] --> Sum[Fac[Ex[Num[$x]]]/Fac[Ex[Den[$x]]],\
								 {$r,$k,$m}]

/*: ExSum[$exp,($k:0)] 
     attempts to rewrite sums in $exp of the type Sum[(a+b)/c,{r,min,max,inc}]
     as Sum[a/c,{r,$k,m}]+Sum[b/c,{r,$k,m}]. ExSum is useful for putting sums of
     rational functions into a canonical form. */
ExSum_:Tier
ExSum[$exp,$k] :: \
  SumCan[Map[S[$1,SSumUnrat[{'Mult,'Div,'Pow}],,0],\
	{$exp},-Inf,In['Sum,$[0]]],$k][1]
ExSum[$exp] :: ExSum[$exp,0] 

/*: SSumUnrat[$var] 
    is a substitution to  rewrite Sum[a b/c,{r,k,m}] where b is an addition of
    terms containing any of the symbols in the list $var as an addition of sums
    not of this type. */

SSumUnrat[$elm] :: Sum[$a,{$r,$k,$m}] --> S[Sum[Unrat[$a,$elm],{$r,$k,$m}],\
								 SSumM[3],,0]

/*: CbSum[$expr,($temp:1)]
     combines sums in $expr of the form Sum[x,{r,k,m}] and Sum[y,{r,k,m}]
     to yield Sum[x+y,{r,k,m}]. Only sums on which application of $temp to the
     summand yields 1 are combined. */

_CbSum[Smp] : 0
CbSum_:Tier
CbSum[$expr] :: CbSum[$expr,1]
CbSum[$expr,$temp] :: Si[Si[$expr,CbSuminit],\
  Sum[$x_=Ap[$temp,{$x}],{$r,$k,$m}] + Sum[$y_=Ap[$temp,{$y}],{$r,$k,$m}] -> \
  Sum[$x+$y,{$r,$k,$m}]]

/* CbSuminit is used by CbSum. */
CbSuminit[1] : Sum[$x,{$r,$k,$m}] $$a    -> Sum[$x $$a,{$r,$k,$m}]
CbSuminit[2] : Sum[$x,{$r,$k,$m}]/$b     -> Sum[$x/$b,{$r,$k,$m}]
CbSuminit[3] : Sum[$x,{$r,$k,$m}] $$a/$b -> Sum[$x $$a/$b,{$r,$k,$m}]

/*B: CbSum does not always work in SMP 1.5.0 due to a pattern matching bug */

_XSumM[Loaded] : 1

/*E:
SMP 1.4.0

#I[1]::  <XSumM

#I[2]::  Sum[a x[r],{r,-2,Inf,2}]

#O[2]:   Sum[a x[r],{r,-2,Inf,2}]

#I[3]::  SumCan[%]

#O[3]:   a Sum[x[-2 + 2r],{r,0,Inf}]

#I[4]::  SumCan[%,1]

#O[4]:   a Sum[x[-4 + 2r],{r,1,Inf}]

#I[5]::  Sum[r/x[r],{r,0,n}]

	      r
#O[5]:   Sum[----,{r,0,n}]
	     x[r]

#I[6]::  SumCan[%]

	      1 + r
#O[6]:   Sum[--------,{r,0,-1 + n}]
	     x[1 + r]

#I[7]::  Sum[(g+r) ((r+1)/(r+3)+f[r]),{r,0,Inf}]

			     1 + r
#O[7]:   Sum[(g + r) (f[r] + -----),{r,0,Inf}]
			     3 + r

#I[8]::  ExSum[%]

	     (1 + r) (g + r)
#O[8]:   Sum[---------------,{r,0,Inf}] + Sum[f[r] (g + r),{r,0,Inf}]
		  3 + r

#I[9]::  Sum[(f[r]+g[r]+h[r])/(r+1),{r,0,m}]

	     f[r] + g[r] + h[r]
#O[9]:   Sum[------------------,{r,0,m}]
		   1 + r

#I[10]::  ExSum[%]

	      f[r] + g[r] + h[r]
#O[10]:   Sum[------------------,{r,0,m}]
		    1 + r

#I[11]::  ExSum[%,1]

	      f[-1 + r] + g[-1 + r] + h[-1 + r]
#O[11]:   Sum[---------------------------------,{r,1,1 + m}]
			      r

#I[12]::  Sum[(-1)^r Gamma[r+3]/((r+4)(r+5)),{r,0,Inf}]

		  r
	      (-1)  Gamma[3 + r]
#O[12]:   Sum[------------------,{r,0,Inf}]
	       (4 + r) (5 + r)

#I[13]::  ExSum[%]

		  r
	      (-1)  Gamma[3 + r]
#O[13]:   Sum[------------------,{r,0,Inf}]
	       (4 + r) (5 + r)

#I[14]::  Sum[Gamma[9/2+g] (-11-2g-5(2g+6)(11+2g)/\
	 	 	 12+(2g+6)(2g+8)(2g+9)(2g+11)/12)/\
	 	 	(Gamma[g+11/2] (g+3)(2g+10)(11+2g)),{g,0,Inf}]

					 5(6 + 2g) (11 + 2g)
	      Gamma[9/2 + g] (-11 - 2g - -------------------
						 12

				    (6 + 2g) (8 + 2g) (9 + 2g) (11 + 2g)
				  + ------------------------------------)
						     12
#O[14]:   Sum[-----------------------------------------------------------,
		      Gamma[11/2 + g] (3 + g) (10 + 2g) (11 + 2g)

	      {g,0,Inf}]

#I[15]::  ExSum[%]

			       Gamma[9/2 + g]
#O[15]:   -11Sum[-------------------------------------------,{g,0,Inf}]
		 Gamma[11/2 + g] (3 + g) (10 + 2g) (11 + 2g)

			      Gamma[9/2 + g] (6 + 2g)
		    5Sum[---------------------------------,{g,0,Inf}]
			 Gamma[11/2 + g] (3 + g) (10 + 2g)
		  - -------------------------------------------------
					   12

				   Gamma[11/2 + g] (1 + g)
		  - 2Sum[-------------------------------------------,
			 Gamma[13/2 + g] (4 + g) (12 + 2g) (13 + 2g)

			 {g,0,Inf}]

			Gamma[9/2 + g] (6 + 2g) (8 + 2g) (9 + 2g)
		    Sum[-----------------------------------------,{g,0,Inf}]
			    Gamma[11/2 + g] (3 + g) (10 + 2g)
		  + --------------------------------------------------------
					       12

#I[16]::  Sum[-32((-1)^g Gamma[6 + 2g]-Gamma[7 + 2g])/(7+ 2g),{g,0,Inf}]

				       g
	      -32(-Gamma[7 + 2g] + (-1)  Gamma[6 + 2g])
#O[16]:   Sum[-----------------------------------------,{g,0,Inf}]
			       7 + 2g

#I[17]::  ExSum[%]

		   Gamma[7 + 2g]
#O[17]:   -32(-Sum[-------------,{g,0,Inf}]
		      7 + 2g

			    g
			(-1)  Gamma[6 + 2g]
		  + Sum[-------------------,{g,0,Inf}])
			      7 + 2g

#I[18]::  Sum[Gamma[g+5] (x (g+4)+y(g+5/3)/(g+7/3))/Gamma[g+7/2],{g,0,Inf}]

			    y (5/3 + g)
	      Gamma[5 + g] (----------- + x (4 + g))
			      7/3 + g
#O[18]:   Sum[--------------------------------------,{g,0,Inf}]
			  Gamma[7/2 + g]

#I[19]::  S[%,SSumUnrat[{x,y}]]

	      x Gamma[5 + g] (4 + g)
#O[19]:   Sum[----------------------,{g,0,Inf}]
		  Gamma[7/2 + g]

			y Gamma[5 + g] (5/3 + g)
		  + Sum[------------------------,{g,0,Inf}]
			Gamma[7/2 + g] (7/3 + g)

#I[20]::  Sum[1/(7 + r) + (5 + r)/(6 + r),{r,0,m}]

		1     5 + r
#O[20]:   Sum[----- + -----,{r,0,m}]
	      7 + r   6 + r

#I[21]::  S[%,SSumRat[3]]

		5       1       r
#O[21]:   Sum[----- + ----- + -----,{r,0,m}]
	      6 + r   7 + r   6 + r

#I[22]::  S[%,SSumM[3]]

		5       	     1  		  r
#O[22]:   Sum[-----,{r,0,m}] + Sum[-----,{r,0,m}] + Sum[-----,{r,0,m}]
	      6 + r     	   7 + r		6 + r

#I[23]::  Sum[r+5,{r,0,Inf}] + 3/a Sum[r,{r,0,Inf}]

	  3Sum[r,{r,0,Inf}]
#O[23]:   ----------------- + Sum[5 + r,{r,0,Inf}]
		  a

#I[24]::  CbSum[%]

		      3r
#O[24]:   Sum[5 + r + --,{r,0,Inf}]
		      a

#I[25]::  Sum[r+5/4,{r,0,m}] a + Sum[Psi[r+3],{r,0,m}]-\
	 	 	 	      3/4 Sum[Psi[r+4],{r,0,m}]-Sum[r,{r,0,m}]/b

	  -Sum[r,{r,0,m}]
#O[25]:   --------------- + a Sum[5/4 + r,{r,0,m}] + Sum[Psi[3 + r],{r,0,m}]
		 b

		    3Sum[Psi[4 + r],{r,0,m}]
		  - ------------------------
			       4

#I[26]::  CbSum[%,In['Psi,$1]]

	      -r
#O[26]:   Sum[--,{r,0,m}] + Sum[a (5/4 + r),{r,0,m}]
	      b

				     3Psi[4 + r]
		  + Sum[Psi[3 + r] - -----------,{r,0,m}]
					  4

#I[27]::  CbSum[%,~In['Psi,$1]]

	      -r					   3Psi[4 + r]
#O[27]:   Sum[-- + a (5/4 + r),{r,0,m}] + Sum[Psi[3 + r] - -----------,{r,0,m}]
	      b 						4
*/
