\documentclass[12pt]{article}

%\addtolength{\textwidth}{-1.2cm}
%\addtolength{\textheight}{-1.4cm}

%addtolength{\oddsidemargin}{0.5cm}
%\let\evensidemargin=\oddsidemargin

%\addtolength{\topmargin}{-1.3cm}
%\addtolength{\topmargin}{-5cm}

\usepackage{amssymb, amsbsy}
\usepackage{amsmath, amsthm}
\usepackage{amsfonts}

\usepackage{a4,xy,verbatim}
\xyoption{all}

\newenvironment{definition}
{
\noindent \hspace*{0.4cm} {\bf Definition}
}

\newenvironment{proposition}
{
\noindent \hspace*{0.4cm} {\bf Proposition} \\
\smallskip
}

\newenvironment{theorem}[1]
{
\noindent \hspace*{0.4cm} {\bf Theorem} #1 \\
\smallskip
}

\newenvironment{example}[1]
{
\noindent \hspace*{0.4cm} {\bf Example} { \smallskip \em (#1)} \\
}


\newenvironment{alg}
{
\smallskip
{\small Pseudocode} 
\begin{list}{- \labelwidth0.6cm  \parsep0ex \itemsep0ex  \labelsep0ex \topsep0cm \leftmargin0.5cm }}       
{\end{list}}



\newenvironment{remark}[1]
{  
{\bf Remark} {\em ( #1 )} \\
\noindent \hspace*{0.5cm}
}


\newenvironment{com}[2]
{
\noindent{\texttt #1}{\bf (#2) } \\
}







% ---------------------------------------------------------------

%\newcommand{\binomial}[2]
%{$\begin{pmatrix} #1 \\ #2  \end{pmatrix}$}

%\newcommand{\opE}[2]{{#1}: $\rightarrow$ {#2}}
%\newcommand{\opI}[3]{{#1}: {#2}$\rightarrow$ {#3}}
%\newcommand{\opII}[4]{{#1}: {#2}$\times${#3}$\rightarrow$ {#4}}
%\newcommand{\opIII}[5]{{#1}: {#2}$\times${#3}$\times${#4}$\rightarrow$ {#5}}
%\newcommand{\opIV}[6]{{#1}: {#2}$\times${#3}$\times${#4}$\times${#5}$\rightarrow$ {#6}}
%\newcommand{\emptyL}{{[$\;\;$]}}



%\newenvironment{spec}[1]
%{\noindent
%{\bf spec }
%{#1}
%\begin{list}{\labelwidth0.6cm \parsep0ex \partopsep0ex \itemsep0ex  \labelsep2ex \topsep0cm  \parskip0ex\leftmargin0.5cm }}       
%{\end{list}
%\noindent
%{\bf endspec}}



%\newenvironment{opns}
%{
%{\bf opns }
%\begin{list}{\labelwidth0.6cm \parsep0ex \itemsep0ex  \labelsep0ex \topsep0cm \leftmargin0.5cm }}       
%{\end{list}}





\bibliographystyle{alpha}

\begin{document}


\title{A Macsyma\footnote{Comp. algebra system dev. by Macsyma Inc., version 419}  Implementation of Zeilberger's Fast Algorithm\footnote{Supported by the SFB grant F1305 of the Austrian FWF}}

\author{Fabrizio Caruso}  

\maketitle

\begin{abstract}
We present the first implementation within the
Macsyma computer algebra system of Zeilberger's fast algorithm 
for the definite summation problem for a very large class of sequences; 
i.e. given a hypergeometric sequence $F(n,k)$, we want to represent
$f(n)=\sum_{k=0}^{n}F(n,k)$ in a ``simpler'' form.
We do this
by finding a linear recurrence for the summand $F(n,k)$,
from which we can obtain a homogeneous $k-$free recurrence for $f(n)$. 
The solution of this recurrence is left as a post-processing,
and it will give the ``simpler'' form we were looking for.

Zeilberger's fast algorithm exploits a specialized
version of Gosper's algorithm for the indefinite summation problem; 
i.e. given a hypergeometric sequence $t(k)$, the problem of finding 
another sequence $T(k)$ such that $t(k)=\Delta_{k}T(k)=T(k+1)-T(k)$.
The implementation of this algorithm has also been 
carried out in Macsyma, and
its details are also briefly described in this paper. 

\end{abstract}


%\tableofcontents

\section{Introduction}

%\vspace*{-0.4cm}

We present the first implementation within the Macsyma computer
algebra system of Zeilberger's fast algorithm \cite{Z1}, \cite{Z2}
for the definite summation problem for the large class of proper 
hypergeometric sequences \cite{WZ}. This means that  given a 
double-indexed sequence
$F(n,k)$, we want to rewrite the definite sum 
$f(n)=\sum_{k=0}^{n}F(n,k)$ in a form free of quantifier $\sum$.
We do this by finding a special $k-$free linear recurrence 
with polynomial coefficients for the summand $F(n,k)$,
which, under the condition of natural boundary for $F(n,k)$,
can be extended into a $k-$free homogeneous linear recurrence 
with polynomial coefficients.  
The desired linear recurrence for the summand has the form:
$\sum_{i=0}^{m}a_{i}(n)F(n+i,k)=G(n,k+1)-G(n,k)$, where 
the $a_i(n)$ are polynomials in $n$ free of $k$.
The search for this recurrence is done by guessing the 
order $m$ of the left hand side of this recurrence and then trying to find
the corresponding $G(n,k)$ of the right hand side by means of
a specialized Gosper algorithm \cite{G} (We note that a priori upper bounds 
for $m$ can be given; however they turn out to be too large and 
therefore not useful from the practical point of view). 
%A new version of Gosper's algorithm for this purpose has
%also been implemented and included in this package.

Gosper's algorithm for the indefinite summation problem
solves the hypergeometric telescoping problem, i.e.
given a hypergeometric sequence $t(k)$, it decides whether there
is a hypergeometric sequence $T(k)$ such that 
$t(k)=\Delta_{k}T(k)=T(k+1)-T(k)$, and if it exists, it
finds it by rewriting this problem as a linear recurrence
in which the unknown is a polynomial which determines $T(k)$. 
For a simple and thorough description of these algorithms see
\cite{GKP}, \cite{PWZ}.
For alternative
approaches and a detailed explanation of
the connection between these strategies see, for instance,  chapter 23 in 
\cite{GV} or \cite{P}, \cite{A}.


However the standard Gosper's algorithm, which is already implemented in Macsyma, cannot be used in Zeilberger's 
algorithm because it does not take into account that there are some polynomial
parameters. Therefore a specialized 
parameterized version of this algorithm, in which unknown parameters 
$a_{i}$'s are taken into account,
has been implemented and it is used by our implementation of Zeilberger's
algorithm to compute the right hand side of the desired recurrence.

This package \cite{Ca} can be downloaded from the home page\break 
\texttt{http://www.risc.\-uni-linz.ac.at/research/combinat/risc/} and 
will also be soon available on the macsyma home page \texttt{http://www.macsyma.com}.

At the same home page a Mathematica implementation of this
algorithm, which considers the more general $q$-case \cite{PR}, as well as the
Paule-Schorn implementation \cite{PS} for the ordinary case, can be found.














%\chapter{Some Theory}
%\input{theory.tex}

%\chapter{The Algorithms}
%\input{algorithms.tex}

\section{The Implementation}

In this section we report on some of the details of the implementation.

The implementation of this algorithm has been done in the internal
LISP-like language of the Macsyma computer algebra system.

It has been implemented in Macsyma in a straightforward way
and no significant changes have been made in the classical
algorithms.

This version of Zeilberger's algorithm works in the proper hypergeometric
case. We remark that there are implementations that could work 
at least in principle in a slightly
larger class of sequences (holonomic hypergeometric sequences, see \cite{C}).
Our choice makes the implementation simpler and allows us to use our
implementation of Gosper's algorithm for the proper hypergeometric case. \\


%\subsection{Performance}

%\vspace*{-0.8cm}

%First of all we must point out that this implementation is only
%the first attempt to incorporate Zeilberger's fast algorithm into 
%the Macsyma computer algebra system and therefore it is very far
%from being competitive with the best existing optimized
%implementations (for example see \cite{PS}) due partially
%to the fact that these implementations use special linear solvers.

%No large scale test has been carried out to assess the speed of
%this implementation. The only test that has been run on this
%implementation is the collection of sequences contained in the
%file \texttt{testZeilberger.ma\-csyma},
%among which there are some powers of the binomial coefficient.
%Increasing powers of the binomial coefficients have been used
%to test the stability of the system and to obtain a rough idea of
%the performance of the system and to compare it to some other implementations.
%I used this test suite because of its simplicity and
%because we know a priori the order
%of the recurrence for the summand $(\lceil \frac{exponent}{2} \rceil)$.

\vspace*{-0.1cm}

%\small

\subsubsection{Timings}

We present some timings obtained by testing the function \texttt{parGosper}
on increasing powers of the binomial coefficients in which no loop on 
the order of the recurrence is run (we know it in advance).
In these tests the Paule-Schorn Mathematica implementation \cite{PS} and our Macsyma 
implementation are compared.
These implementations have been run on an SGI Octane with 2 gigabytes
of ram and two 250 Mhz RISC processors (although much less memory was 
necessary for
running the program on these examples).  

%\smallskip
\bigskip

{\em Results \hspace{5cm} {\small Note:Timings are in seconds}}
$$
\begin{array}{cccccc}
 {\bf power} & {\bf order} & {Paule/Schorn \;Mathematica} & {Macsyma} & {diff. \; ratio} \\
 3           & 2           & 0.36s           & 3.31s      & 9.19 \\
 4           & 2           & 0.92s           & 3.95s      & 4.29 \\
 5           & 3           & 4.47s           & 37.11s     & 8.30 \\
 6           & 3           & 16.98s          & 121.64s   & 7.16 \\ 
{\bf Average \; ratio : } & {} & {} & {} & 7.23 \\
\end{array}
$$


\bigskip


%\subsection{Stability}

%\smallskip

%Our Macsyma implementation tested on an SGI Octane equipped with 2 gigabytes
%of ram could no go beyond the sixth power of the binomial
%coefficient
%whereas Paule-Schorn Mathematica implementation
%was able to handle the eleventh power.
%The sixth power of the binomial coefficient required less than 
%50 megabytes of memory.

%\bigskip

\subsubsection{What can be done to improve this implementation}
An analysis on the distribution of the computation
time shows that in the ``heavy cases'' (binomial coefficient to the fifth and sixth powers)
the bottle neck is the computation of the solution of 
the linear systems of equations that is required to solve
the recurrence equation ({\em Gosper's equation}).

\smallskip

Therefore future optimized versions should use
a special purpose linear solver that takes advantage of the
specific structure of the system.

\normalsize





%\section{Performance}
%\input{performance.tex}

\section{Manual}

\subsection{Loading the files}

The entire package can be downloaded from the 
RISC Combinatorics home page at the following u.r.l.
http://www.risc.uni-linz.ac.at/research/combinat/risc/

\noindent The user will find the following files:

\bigskip

{
%\small

\texttt{algUtil.macsyma} 

\texttt{shiftQuotient.macsyma}

\texttt{poly2quint.macsyma}

\texttt{makeGosperForm.macsyma}

\texttt{GosperEq.macsyma}

\texttt{Gosper.macsyma}

\texttt{Zeilberger.macsyma}

\texttt{LOADZeilberger.macsyma}

\texttt{testZeilberger.macsyma}

\texttt{testGosper.macsyma} 
}

\bigskip

The entire package can be loaded into memory by simply loading the file 
\texttt{LOAD\-Zeilberger.macsyma}; this file will take care of loading 
the other components except the files containing some examples on which the 
system has been tested, namely 
(\texttt{testZeil\-berger.macsyma}, \texttt{testGosper.macsyma}).

\bigskip

\subsection{The Commands}


Zeilberger's algorithm (\texttt{Zeilberger}) as well as a 
parametrized version of Gosper's algorithm (\texttt{parGosper})
have been implemented in two versions: a verbose version, 
which allows the user to choose different levels of verbosity, 
and a non-verbose version \cite{Ca}, which should provide a bit of better 
performance.



%\small

\subsubsection{Verbosity Levels}
The levels of verbosity are selected by the user just adding a suffix
to the command name (\texttt{parGosper}, \texttt{Zeilberger}) 
or by passing a parameter in the generic verbose version of the algorithm.


These are the levels of verbosity that have been implemented: \texttt {Summary}, \texttt {Verbose}, \texttt {VeryVerbose}, \texttt{Debugging}, \texttt{LinSys}.

%$$
%\begin{array}{lll}
% {\bf Level} & {\bf Suffix} & {\bf Scope} \\
% \\
% {\bf summary} \; & \texttt {Summary} & summary \; of \; the \; main \; computations \\
% {\bf normal} \; & \texttt {Verbose} & verbosity \; on \; the \; main \; procedure \\
% {\bf very} \; & \texttt {VeryVerbose} & verbosity \; on \; the \; subroutines \\
% {\bf debugging} \; & \texttt{Debugging} & deepest \; verbosity \\
%  \\
% {\bf linsys} \; & \texttt{LinSys} &  verbosity \; on \; the \; linear \; system\\
%\end{array}
%$$



\smallskip

\noindent {\bf Examples}

\smallskip

\noindent \texttt{GosperVerbose(f,k) } invokes Gosper's algorithm in 
verbose mode

\smallskip

\noindent \texttt{ZeilbergerVeryVerbose(f,k,n) } invokes Zeilberger's 
algorithm in the very verbose mode


\bigskip

%\subsubsection{Gosper's Algorithm}

%\small

%\begin{itemize}

%\item
%\begin{com}{Gosper}{f, k}
%It solves the indefinite summation problem of
%finding an hypergeometric sequence $g(k)$ such that
%$f(k)=\Delta_{k} g(k) = g(k+1)- g(k)$. If such 
%a hypergeometric sequence exists it returns it as
%output, otherwise it will return {\bf NO\_HYP\_SOL}.
%\end{com} 

%\item
%\begin{com}{GosperVerboseOpt}{f, k, verbosity}
%As \texttt{Gosper} but the level of verbosity is
%passed as a parameter.
%\end{com} 

%\item

%\begin{com}{GosperSum}{f, k, a, b}
%It computes $\sum_{k=a}^{b}f$ by using \texttt{Gosper}
%to solve the indefinite sum.
%(It only works if the indefinite sum is Gosper-summable).
%\end{com}

%\item

%\begin{com}{GosperSumVerboseOpt}{f, k, a, b, verbosity}
%As \texttt{GosperSum} but the level of verbosity is passed as a parameter.
%\end{com}

%\end{itemize}

\subsubsection{Functions' Calls}

\begin{itemize}

\item \texttt{Zeilberger}(F, k, n) 

Given a double-indexed proper hypergeometric sequence $F(n,k)$, 
it computes by Zeilberger's
algorithm a recurrence equation for $F$ of the form: 
$\sum_{i=0}^{m}a_{i}(n) F(n+i,k) = \Delta_{k}(Cert(n,k)F(n,k))$, where the
$a_{i}$'s are polynomials free of $k$ and $Cert$ (``rational certificate'') 
is a rational function in $n$ and $k$.
The output will be a print-out of the recurrence and the explicit 
expressions for the polynomial parameters $a_{i}$ and the 
``rational certificate'' $Cert(n,k)$.
$Cert(n,k)$.



\item \texttt{ZeilbergerVerboseOpt}(F, k, n, verbosity)

As \texttt{Zeilberger} but the level of verbosity is passed as a parameter.



\item \texttt{parGosper}(F, k, n, ord)

Given a double-indexed proper hypergeometric sequence, 
it computes, when it exists, a recurrence equation of order 
$ord$ for $F$ of the form:\break
$\sum_{i=0}^{ord}a_{i}(n)F(n+i,k) = \Delta_k(R(n,k)F(n,k))$,  where
$a_{i}$'s are polynomials and $Cert(n,k)$ is a rational function (the {\em certificate}), 
and it yields a sequence $[Cert(n,k),$ $[a_0, \dots, a_{ord}]]$; if no such 
recurrence exists them it yields $[0,[ \text{dummy-value},$ $\dots, \text{dummy-value}]]$.


\item \texttt{parGosperVerboseOpt}(F, k, n, ord, verbosity)

As \texttt{parGosper} but the level of verbosity is passed as a parameter.


\end{itemize}


\subsubsection{Settings}
No much settings and fine-tuning is necessary to use this package.
The only setting is done through the
environment variables \texttt{MAX\_ORD} that
sets an a priori bound on the order
of the recurrence that Zeilberger's algorithm iteratively tries
to find by applying \texttt{parGosper} with increasing order.
The default value of \texttt{MAX\_ORD} is $3$.

\normalsize




\subsection{Examples}

Let us take a look at some examples, that can be found in the file
 
\noindent \texttt{testZeilberger.macsyma}.

\smallskip

%\small

\bigskip

\begin{example}{Binomial Theorem} 
To evaluate $\sum_{i=0}^{n}{\binom n  k }x^k$ we can use \texttt{Zeilberger}, 
or \texttt{parGosper} and use the fact the we know that 
we expect a first order recurrence:

\smallskip

\noindent {\bf (prompt)} \verb+parGosper(binomial(n,k)x^k,k,n,1);+ \\

\noindent {\bf output:} \hspace{2cm}

$$ \left\{ -{\frac{k}{n-k+1}},\left\{ -\left(x+1\right),1\right\} %
 \right\}  $$\\

\smallskip

\noindent Where $-\frac{k}{-n-k+1}$ is the rational certificate $Cert(n,k)$,
and $-(x+1)$ and $1$ are respectivelly the polynomial coefficients $a_0$ and 
$a_1$ of the linear recurrence
such that
$a_0(n){\binom n  k}+a_1(n){\binom {n+1} k } = 
\Delta_{k}(Cert(n,k){\binom n  k})$.

\end{example}


%\begin{example}{Squared binomial coefficient} \\
%We can try to sum the squared binomial coefficient with \texttt{parGosper},
%but to do this we must guess the order of the recurrence:

%\smallskip

%\noindent {\bf (prompt)} \verb+parGosper(binomial(n,k)^2,k,n,1);+ \\
%\\
%\noindent{\bf output:} \input{f2p.tex} \\
%\end{example}

%\bigskip


%\begin{example}{Vandermonde Identity recurrence}

%\smallskip

%\noindent {\bf (prompt)} \verb+Zeilberger(binomial(a,k)*binomial(b,n-k),k,n);+ \\

%\noindent {\bf output:} 

%$$a[0]f(n,k)+a[1]f(n+1,k) = \delta_k(Cert(n,k)f(n,k))$$

%where 

%$$f(n,k) = { \binom A  k}{\binom b  {n-k}}$$

%and 

%$$Cert(n,k) = \frac{k(-n+k+b)}{n-k+1}$$

%and 

%$$a[0](n) = -(n-b-A)$$
%$$a[1](n) = -(n+1)$$

%\end{example}

\bigskip

\newpage

\begin{example}{Special case of the Ap{\'e}ry-Schmidt-Strehl identity
\footnote{See \cite{S} for more information on this identity}}
{\bf (prompt)} \verb+Zeilberger(binomial(2*k,k)*binomial(n,k)^2,k,n);+ \\
\noindent {\bf output:} 

$$a[0]f(n,k)+a[1]f(n+1,k)+a[2]f(n+2,k) = \Delta_k(Cert(n,k)f(n,k))$$

where 

$$Cert(n,k) = -\frac{k^3(n+1)^2(4n-3k+8)}{(n-k+1)^2(n-k+2)^2}$$

and

\hspace{3cm} $a[0](n) = 9(n+1)^2$

\hspace{3cm} $a[1](n) = -(10n^2+30n+23)$

\hspace{3cm} $a[2](n) = (n+2)^2$

\end{example}



\bigskip

% \begin{example}{Second special case of the Strehl identity}
%{\bf (prompt)} \texttt{Zeilberger(binomial(2*k,k+a)*binomial(n,k)^2,k,n)} \\
%\noindent {\bf output:} \\

%$$a[0]f(n,k)+a[1]f(n+1,k)+a[2]f(n+2,k)+a[3]f(n+3,k) = \delta_k(Cert(n,k)f(n,k))$$

%where

%$$Cert(n,k) = $$

%\end{example}


%\bigskip


\begin{example}{Binomial coefficient to the fourth power} 
\noindent {\bf (prompt)} \verb+Zeilberger(binomial(n,k)^4,k,n);+ \\
\noindent {\bf output:} 

$$a[0]f(n,k)+a[1]f(n+1,k)+a[2]f(n+2,k) = \Delta_k(Cert(n,k)f(n,k))$$

where

$$f(n,k) = { \binom n  k}^4$$

and


%$$\begin{array}{c}
%k^4(n+1)(74n^6-260kn^5+725n^5+374k^2n^4-2056kn^4+2885n^4-276k^3n^3-6420kn^3+ \\
%6045n^3+104k^4n^2-1244k^3n^2+5298k^2n^2-9892kn^2+7030n^2-16k^5n+298k^4n-1884k^3+ \\
%5322k^2n-7520kn+4300n-20k^5+210k^4-900k^3+1980k^2-2256k+1080 \\
%\end{array}$$

$$Cert(n,k) = -\frac{\begin{array}{c}
k^4(n+1)(74n^6-260kn^5+725n^5+374k^2n^4-2056kn^4+2885n^4- \\
276k^3n^3-6420kn^3+6045n^3+104k^4n^2-1244k^3n^2+5298k^2n^2- \\
9892kn^2+7030n^2-16k^5n+298k^4n-1884k^3+5322k^2n-7520kn+ \\
4300n-20k^5+210k^4-900k^3+1980k^2-2256k+1080 \\
\end{array}}
                    {(n-k+1)^4(n-k+2)^4}$$
%$$Cert(n,k) = \dots$$


and

\hspace{3cm} $a[0](n) = -4(n+1)(4n+3)(4n+5)$

\hspace{3cm} $a[1](n) = -2(2n+3)(3n^2+9n+7)$

\hspace{3cm} $a[2](n) =(n+2)^3$

\end{example}


\normalsize









%\section{Some Examples}
%\input{examples.tex}

%\chapter{The Code}
%\input{code.tex}

\paragraph{Acknowledgements}

\vspace{1.5cm}


I want to thank Professor Peter Paule for his useful
suggestions. 

\newpage

\begin{thebibliography}{10}




%\begin{thebibliography}{10}


\small

\bibitem{A}


{\bf Abramov, S.A.}
{\em Rational solutions of linear differential and difference
equations with polynomial coefficients}, 
Proc. ISSAC '95, ACM Press (1995), 285-289.


\bibitem{Ca}

{\bf Caruso, F.}
{\em A Macsyma Implementation of Zeilberger's Fast Algorithm},
SFB-Report No. 99-16, RISC, J.K. University, Linz, Austria (1999).

\bibitem{C}

{\bf Chyzak, F.}
{\em Fonctions holonomes en calcul formel}, 
Th{\`e}se universitaire no. TU 0531, INRIA. Defended on May 27 (1998).

\bibitem{GV}

{\bf Gerhard, J., von zur Gathen, J.}
{\em Modern Computer Algebra}
Cambridge University Press (1999), 617-622.

\bibitem{G}

{\bf Gosper, R.W. }
{\em Decision procedure for indefinite hypergeometric summation}, 
Proceedings of the National Academy of Sciences of USA, {\bf 75} 
(1978), 40-42.

\bibitem{GKP}

{\bf Graham, R., Knuth, D. E., Patashnik, O.}
{\em Concrete Mathematics - A Foundation for Computer Science}, 
Addison Wesley (1994).


\bibitem{P}

{\bf Paule, P.}
{\em Greatest factorial factorization and symbolic summation},
J. Symbolic Computation, {\bf 20} (1995), 235-268.


\bibitem{PS}

{\bf Paule, P., Schorn, M.}
{\em A Mathematica Version of Zeilberger's Algorithm for Proving 
Binomial Coefficient Identities},
J. Symbolic Computation, {\bf 20} (1995), 673-698.


\bibitem{PR}

{\bf Paule, P., and Riese, A.}
{\em A Mathematica q-Analogue of Zeilberger's Algorithm Based on an
Algebraically Motivated Approach to q-Hypergeometric Telescoping},
Special Functions, q-Series and Related Topics, 
Fields Institute Communications, {\bf 14} (1997), 179-210.


\bibitem{PWZ}

{\bf Petkov\v sek, M., Wilf, H., Zeilberger, D.}
{\em A=B}, 
A K Peters, MA (1996).

\bibitem{S}
{\bf Strehl, V.}
{\em Binomial identities - combinatorial and algorithmical aspects},
Discrete Mathematics, {\bf 136} (1994), 309-346.

\bibitem{WZ}

{\bf Wilf, H.S., Zeilberger,D.}
{\em An algorithmic proof theory for hypergeometric (ordinary
and ``q'') multisum/integral identities''},
Invent. Math., {\bf 108} (1992), 575-633.


\bibitem{Z1}

{\bf Zeilberger, D.}
{\em A fast algorithm for proving terminating hypergeometric identities},
Discrete Mathematics, {\bf 80} (1990), 207-211.


\bibitem{Z2}

{\bf Zeilberger, D.}
{\em The method of creative telescoping},
Journal of Symbolic Computation {\bf 11} (1991), 195-204.






%\end{thebibliography}










\end{thebibliography}


\end{document}







