                 /** Simplification of Gamma functions **/

/*K: Gamma */
/*A: John Gottschalk */
/*S: University of Western Australia */
/*D: September 1985 */
/*P: XProjfind XDelete XPocV and XSets are automatically loaded as needed. */


If[~P[_XLoadonce[Loaded]],<XLoadonce]

_Projfind[Init] :: Loadonce[XProjfind]
_Cmpl[Init]     :: Loadonce[XSets]
_DelE[Init]     :: Loadonce[XDelete]
_Poc[Init]      :: Loadonce[XPocV]

/*: CanGamma[$expr] finds the Gamma function in $expr with the lowest argument
    and writes all other Gamma functions in terms of this using the recurrence
    equation for digamma functions. */
GammaCan[$expr] ::(Lcl[%allgam,%arg,%expr,%likegam,%Rep,%reps,%Mingam,%mingam];\
      %Mingam[$x] :: (Ar[Len[$x],$x[$1][1]]; {Ap[Min,%%]}; Ap[Gamma,%%]);\
      %Rep[Gamma[$x],Gamma[$z]] :: If[$x~=$z,Gamma[$x] -> \
	 Gamma[$z] Poc[$z,$x-$z]];\
      %expr : S[$expr,Gamma[$x] --> Gamma[Ex[$x]]]; %reps : {};\
      %allgam : Projfind['Gamma,%expr];\
      Loop[,(%arg : %allgam[1,1];\
	     %likegam : Projfind['Gamma,%allgam,Intp[$1[1]-%arg] & \
				   Numbp[$1[1]-%arg]];\
	     %mingam : %Mingam[%likegam];\
	     %reps : Cat[%reps,Map[%Rep[$1,%mingam],%likegam]];\
	     %allgam : Cmpl[%likegam,%allgam]),\
           Len[%allgam] > 0];\
      S[%expr,DelE[Null,%reps]])

/*E:

SMP 1.5.0   (May 14 1986)
Tue Mar 17 10:25:52 1987


#I[1]::  <XGammaCan

#I[2]::  Gamma[a-b] Gamma[a+3]/Gamma[a+b+2] + Gamma[a-b-2] Gamma[a]/Gamma[a+b+1]

	 Gamma[a] Gamma[-2 + a - b]   Gamma[3 + a] Gamma[a - b]
#O[2]:   -------------------------- + -------------------------
	      Gamma[1 + a + b]  	  Gamma[2 + a + b]

#I[3]::  GammaCan[%]

	 Gamma[a] Gamma[-2 + a - b]
#O[3]:   --------------------------
	      Gamma[1 + a + b]

		   a Gamma[a] Gamma[-2 + a - b] (1 + a) (2 + a) (-2 + a - b)

		    * (-1 + a - b)
		 + ---------------------------------------------------------
				 Gamma[1 + a + b] (1 + a + b)

#I[4]::  <end>
*/
