/**  Generalized hypergeometric functions: contiguous relations **/

/* This contains some contiguous relations for hypergeometric
   functions due to Rainville. Some rearrangements of these relations
   are also included */
/*K: generalized hypergeometric; hypergeometric; contiguous relations; Ghg */
/*A: J Gottschalk */
/*S: University of Western Australia */
/*D: September 1984 */

/*P: XWarning is loaded.*/

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

SGhgCont_:Tier
Addh_:Tier
Addl_:Tier
Ghg_:Tier
#_:Comm

/* In the comments Rainville's notation is used.
   a is a top parameter and b is a bottom parameter */

/*: SGhgCont[1,i,j]
	calculates (ai-aj)F=aiF(ai+1)-ajF(aj+1) */
SGhgCont[1,$i,$j] : Ghg[$p,$q,$top,$bot,$z] --> \
    If[$i>$p|$j>$p|SymbF[$top[$i]=$top[$j]],Ghg[$p,$q,$top,$bot,$z],\
    ($top[$i] Ghg[$p,$q,Addh[$i,$top,1],$bot,$z]-\
    $top[$j] Ghg[$p,$q,Addh[$j,$top,1],$bot,$z])/\
    ($top[$i]-$top[$j])]

/*: SGhgCont[2,i,j]
	calculates (ai-bj+1)F=aiF(ai+1)-(bj-1)F(bj-1) */
SGhgCont[2,$i,$j] : Ghg[$p,$q,$top,$bot,$z] --> \
    If[$i>$p|$j>$q|SymbF[$top[$i]-$bot[$j]+1=0],Ghg[$p,$q,$top,$bot,$z],\
    ($top[$i] Ghg[$p,$q,Addh[$i,$top,1],$bot,$z]\
    -($bot[$j]-1) Ghg[$p,$q,$top,Addh[$j,$bot,-1],$z])/\
    ($top[$i]-$bot[$j]+1)]

/*: SGhgCont[3,i]
	calculates [(1-z)ai+(A-B)z]F=(1-z)aiF(ai+1)-zSum[Uj F(bj+1),{j,1,p-1}]*/
SGhgCont[3,$i] : Ghg[$p,$p-1,$top,$bot,$z] --> \
    Ap[If[$i>$p|SymbF[$1=0],Ghg[$p,$p-1,$top,$bot,$z],\
    ((1-$z) $top[$i] Ghg[$p,$p-1,Addh[$i,$top,1],$bot,$z]-$z \
    Sum[uGhg[$top,$bot,%#j] Ghg[$p,$p-1,$top,Addh[%#j,$bot,1],$z],\
    {%#j,1,$p-1}])/$1],{(1-$z) $top[$i]+(Ghgsum[$top]-Ghgsum[$bot]) $z}]

/*: SGhgCont[4,i]
	calculates (1-z)F=F(ai-1)+zSum[Wj,k F(bj+1),{j,1,q}] */
SGhgCont[4,$i] : Ghg[$p,$p-1,$top,$bot,$z] --> \
    If[$i>$p|SymbF[$z=1],Ghg[$p,$p-1,$top,$bot,$z],\
    (Ghg[$p,$p-1,Addh[$i,$top,-1],$bot,$z]+$z Sum[wGhg[$top,$bot,%#j,$i] \
    Ghg[$p,$p-1,$top,Addh[%#j,$bot,1],$z],{%#j,1,$p-1}])/(1-$z)]

/*: SGhgCont[5,i,j]
	calculates bjF=aiF(ai+1,bj+1)+(bj-ai)F(bj+1),
	a rearrangement of SGhgCont[2] */
SGhgCont[5,$i,$j] : Ghg[$p,$q,$top,$bot,$z] --> \
    If[$i>$p|$j>$q|SymbF[$bot[$j]=0],Ghg[$p,$q,$top,$bot,$z],($top[$i] \
    Ghg[$p,$q,Addh[$i,$top,1],Addh[$j,$bot,1],$z]+\
    ($bot[$j]-$top[$i]) Ghg[$p,$q,$top,Addh[$j,$bot,1],$z])/$bot[$j]]

/*: SGhgCont[6,i,j]
	calculates (ai-1)F=(ai-aj-1)F(ai-1)+ajF(ai-1,aj+1),
	a rearrangement of SGhgCont[1] */
SGhgCont[6,$i,$j] : Ghg[$p,$q,$top,$bot,$z] --> \
    If[$i>$p|$j>$p|SymbF[$top[$i]=1],Ghg[$p,$q,$top,$bot,$z],(($top[$i]\
    -$top[$j]-1) Ghg[$p,$q,Addh[$i,$top,-1],$bot,$z]+\
    $top[$j] Ghg[$p,$q,Addh[$j,Addl[$i,$top,-1],1]\
    ,$bot,$z])/($top[$i]-1)]

/*: SGhgCont[7,i,j]
	calculates [(2ai-bj)(1-z)+(Sum[ai,{i,1,p}]-Sum[bj,{j,1,p-1}]) z] F = 
	ai (1-z) F(ai+1)+(ai-bj) F(ai-1)-z Sum[Vj,k F(bk+1),{k,1,p-1,,k~=j}] */
SGhgCont[7,$i,$j] : Ghg[$p,$p-1,$top,$bot,$z] --> \
    Ap[If[$i>$p|$j>$p-1|SymbF[$1=0],Ghg[$p,$p-1,$top,$bot,$z],\
    ($top[$i] (1-$z) Ghg[$p,$p-1,Addh[$i,$top,1],$bot,$z]+\
    ($top[$i]-$bot[$j]) Ghg[$p,$p-1,Addh[$i,$top,-1],$bot,$z]-\
    $z Sum[($bot[$j]-$bot[%#k]) wGhg[$top,$bot,%#k,$i] \
    Ghg[$p,$p-1,$top,Addh[%#k,$bot,1],$z],{%#k,1,$p-1,,$k~=$j}])\
    /$1],{(2$top[$i]-$bot[$j]) (1-$z)+(Ghgsum[$top]-Ghgsum[$bot]) $z}]

/*: SGhgCont[8,i,j]
	calculates (ai-1)F=(ai-bj)F(ai-1)+(bj-1)F(ai-1,bj-1),
	a rearrangement of SGhgCont[2] */
SGhgCont[8,$i,$j] : Ghg[$p,$q,$top,$bot,$z] --> \
    If[$i>$p|$j>$q|SymbF[$top[$i]=1],Ghg[$p,$q,$top,$bot,$z],\
    (($top[$i]-$bot[$j] Ghg[$p,$q,Addh[$i,$top,-1],$bot,$z]+\
     ($bot[$j]-1) Ghg[$p,$q,Addh[$i,$top,-1],Addh[$j,$bot,-1],$z])/\
     ($top[$i]-1))]

/*: Addh[$n,$exp,$k]
	returns #[$$a] with $k added to its $n'th element
	where $exp is of the form #[$$a] or {$$a}. */
Addh[$n_=0<$n<=Len[{$$a}],#[$$a],$k] :: Ap[#,Addl[$n,{$$a},$k]]
Addh[$n_=0<$n<=Len[{$$a}], {$$a},$k] :: Ap[#,Addl[$n,{$$a},$k]]

/*: Addl[$n,$exp,$k]
	returns {$$a} with $k added to its $n'th element
	where $exp is of the form #[$$a] or {$$a}. */
Addl[$n_=0<$n<=Len[{$$a}],#[$$a],$k] :: \
   Cat[Ar[$n-1,{$$a}],{{$$a}[$n]+$k},Ar[Len[{$$a}]-$n,{$$a}[$n+$1]]]
Addl[$n_=0<$n<=Len[{$$a}], {$$a},$k] :: \
   Cat[Ar[$n-1,{$$a}],{{$$a}[$n]+$k},Ar[Len[{$$a}]-$n,{$$a}[$n+$1]]]

/*: uGhg[$a,$b,$j]
	is used by SGhgCont */
uGhg[$a,$b,$j]    :: Prod[$a[%u]-$b[$j],{%u,1,Len[$a]}]/\
                   ($b[$j] Prod[$b[%u]-$b[$j],{%u,1,Len[$b],,%u~=$j}])
/*: wGhg[$a,$b,$j,$k]
	is used by SGhgCont */
wGhg[$a,$b,$j,$k] :: Prod[$a[%w]-$b[$j],{%w,1,Len[$a],,%w~=$k}]/\
                   ($b[$j] Prod[$b[%w]-$b[$j],{%w,1,Len[$b],,%w~=$j}])
/*: Ghgsum[$x]
	is used by SGhgCont */
Ghgsum[$x]        :: Sum[$x[%#k],{%#k,1,Len[$x]}]

/*R: Rainville, Bull. Amer. Math. Soc., Vo.51, 1945, pp.714-723 */

_XGhgCont[Loaded] : 1

/*E:
#I[1]::  <XGhgCont

#I[2]::  a : Ghg[3,2,#[a1,a2,a3],#[b1,b2],z]

#O[2]:   Ghg[3,2,#[a1,a2,a3],#[b1,b2],z]

#I[3]::  S[a,SGhgCont[1,2,3]]

I will assume  ~(a2 = a3)

	 a2 Ghg[3,2,#[a1,1 + a2,a3],#[b1,b2],z]

		     - a3 Ghg[3,2,#[a1,a2,1 + a3],#[b1,b2],z]
#O[3]:   ----------------------------------------------------
			       a2 - a3

#I[4]::  b : Ghg[5,4,#[a1,a2,a3,a4,a5],#[b1,b2,b3,b4],z]

#O[4]:   Ghg[5,4,#[a1,a2,a3,a4,a5],#[b1,b2,b3,b4],z]

#I[5]::  S[b,SGhgCont[7,3,2]]

I will assume  ~(z (a1 + a2 + a3 + a4 + a5 - b1 - b2 - b3 - b4)

			       + (1 - z) (2a3 - b2) = 0)

	     Ghg[5,4,#[a1,a2,a3,a4,a5],#[b1,b2,b3,1 + b4],z] (a1 - b4)

				 * (a2 - b4) (a4 - b4) (a5 - b4)
	 -z (---------------------------------------------------------
			      b4 (b1 - b4) (b3 - b4)

				  Ghg[5,4,#[a1,a2,a3,a4,a5],

					    #[b1,b2,1 + b3,b4],z] (a1 - b3)

					  * (a2 - b3) (a4 - b3) (a5 - b3)
				+ -----------------------------------------
					   b3 (b1 - b3) (-b3 + b4)

				  Ghg[5,4,#[a1,a2,a3,a4,a5],

					    #[1 + b1,b2,b3,b4],z] (a1 - b1)

					  * (a2 - b1) (a4 - b1) (a5 - b1)
				+ -----------------------------------------)
					  b1 (-b1 + b3) (-b1 + b4)

		     + Ghg[5,4,#[a1,a2,-1 + a3,a4,a5],#[b1,b2,b3,b4],z]

			     * (a3 - b2)

		     + a3 Ghg[5,4,#[a1,a2,1 + a3,a4,a5],#[b1,b2,b3,b4],z]

			 * (1 - z)
#O[5]:   -------------------------------------------------------------------
	 z (a1 + a2 + a3 + a4 + a5 - b1 - b2 - b3 - b4) + (1 - z) (2a3 - b2)
*/
