Artifact facc55c591f8350862665e1bb39b69701e39a7a296b9dfaf93cf73ca72a977df:
- Executable file
r36/doc/SPECFN.TEX
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 30346) [annotate] [blame] [check-ins using] [more...]
\documentstyle[11pt,reduce]{article} \title{{\tt SPECFN}: Special Functions Package for REDUCE} \date{} \author{Chris Cannam\\[0.05in] Konrad--Zuse--Zentrum f\"ur Informationstechnik Berlin \\ Heilbronner Strasse 10 \\ D--10711 Berlin -- Wilmersdorf \\ Federal Republic of Germany \\[0.05in] E--mail: neun@sc.zib--berlin.de \\[0.05in] Version 2.0, November 1994} \begin{document} \maketitle \index{SPECFN package} \section{Introduction} This package provides the 'common' special functions for REDUCE. The names of the operators and implementation details can be found in this document. Due to the enormous number of special functions a package for special functions is never complete. Several users pointed out that important classes of special functions were missing in the first version. These comments and other hints from a number of contributors and users were very helpful. The first version of this package was developed while the author worked as a student exchange grantee at ZIB Berlin in 1992/93. The package is maintained by ZIB Berlin after the author left the ZIB. Therefore, please direct comments, hints and bug reports etc. to {\tt neun@sc.ZIB-Berlin.de}. This package is designed to provide algebraic and numeric manipulations of several common special functions, namely: \begin{itemize} \item Bernoulli numbers and Euler numbers; \item Stirling numbers; \item Binomial Coefficients; \item Pochhammer notation; \item The Gamma function; \item The psi function and its derivatives; \item The Riemann Zeta function; \item The Bessel functions J and Y of the first and second kinds; \item The modified Bessel functions I and K; \item The Hankel functions H1 and H2; \item The Kummer hypergeometric functions M and U; \item The Beta function, and Struve, Lommel and Whittaker functions; \item The Airy funcions; \item The Exponential Integral, the Sine and Cosine Integrals; \item The Hyperbolic Sine and Cosine Integrals; \item The Fresnel Integrals and the Error function; \item The Dilog function; \item Hermite Polynomials; \item Jacobi Polynomials; \item Legendre Polynomials; \item Associated Legendre Functions (Spherical and Solid Harmonics) \item Laguerre Polynomials; \item Chebyshev Polynomials; \item Gegenbauer Polynomials; \item Euler Polynomials; \item Bernoulli Polynomials; \item (Jacobi's) Elliptic Functions; \item Elliptic Integrals; \item 3j and 6j symbols , Clebsch-Gordan coefficients; \item and some well-known constants. \end{itemize} All algorithms whose sources are uncredited are culled from series or expressions found in the Dover Handbook of Mathematical Functions\cite{Abramowitz:72}. There is a nice collection of plot calls for special functions in the file \$reduce/plot/specplot.tst. These examples will reproduce a number of well-known pictures from \cite{Abramowitz:72}. \section{Compatibility with earlier \REDUCE\ versions} For {PSL} versions, this package is intended to be used with the new \REDUCE\ bigfloat mechanisms which is distributed together with REDUCE 3.5 and later versions. The package does work with the earlier bigfloat implementations, but in order to ensure that it works efficiently with the new versions, it has not been optimized for the old. \section{Simplification and Approximation} All of the operators supported by this package have certain algebraic simplification rules to handle special cases, poles, derivatives and so on. Such rules are applied whenever they are appropriate. However, if the {\tt ROUNDED} switch is on, numeric evaluation is also carried out. Unless otherwise stated below, the result of an application of a special function operator to real or complex numeric arguments in rounded mode will be approximated numerically whenever it is possible to do so. All approximations are to the current precision. Most algebraic simplifications within the special function package are defined in the form of a \REDUCE\ ruleset. Therefore, in order to get a quick insight into the simplification rules one can use the ShowRules operator, e.g.\\ \begin{verbatim} ShowRules BesselI; 1 ~z - ~z {besseli(~n,~z) => ---------------*(e - e ) sqrt(pi*2*~z) 1 when numberp(~n) and ~n=---, 2 1 ~z - ~z besseli(~n,~z) => ---------------*(e + e ) sqrt(pi*2*~z) 1 when numberp(~n) and ~n= - ---, 2 besseli(~n,~z) => 0 when numberp(~z) and ~z=0 and numberp(~n) and ~n neq 0, besseli(~n,~z) => besseli( - ~n,~z) when numberp(~n) and impart(~n)=0 and ~n=floor(~n) and ~n<0, besseli(~n,~z) => do*i(~n,~z) when numberp(~n) and numberp(~z) and *rounded, df(besseli(~n,~z),~z) besseli(~n - 1,~z) + besseli(~n + 1,~z) => -----------------------------------------, 2 df(besseli(~n,~z),~z) => besseli(1,~z) when numberp(~n) and ~n=0} \end{verbatim} Several \REDUCE\ packages (such as Sum or Limits) obtain different (hopefully better) results for the algebraic simplifications when the SPECFN package is loaded, because the later package contains some information which may be useful and directly applicable for other packages, e.g.: \begin{verbatim} sum(1/k^s,k,1,infinity); % will be evaluated to zeta(s) \end{verbatim} \ttindex{savesfs} A record is kept of all values previously approximated, so that should a value be required which has already been computed to the current precision or greater, it can be simply looked up. This can result in some storage overheads, particularly if many values are computed which will not be needed again. In this case, the switch {\tt savesfs} may be turned off in order to inhibit the storage of approximated values. The switch is on by default. \section{Constants} \ttindex{Euler\_Gamma}\ttindex{Khinchin}\ttindex{Golden\_Ratio} \ttindex{Catalan} Some well-known constants are defined in the special function package. Important properties of these constants which can be used to define them are also known. Numerical values are computed at arbitrary precision if the switch ROUNDED is on. \begin{itemize} \item Euler\_Gamma : Euler's constants, also available as -$\psi(1)$; \item Catalan : Catalan's constant; \item Khinchin : Khinchin's constant , defined in \cite{Khinchin:64}. (takes a lot of time to compute); \item Golden\_Ratio : $\frac{1 + \sqrt{5}}{2}$ \end{itemize} \section{Bernoulli Numbers and Euler Numbers} \ttindex{Bernoulli}\index{Bernoulli numbers} \ttindex{Euler}\index{Euler numbers} The unary operator {\tt Bernoulli} provides notation and computation for Bernoulli numbers. {\tt Bernoulli(n)} evaluates to the $n$th Bernoulli number; all of the odd Bernoulli numbers, except {\tt Bernoulli(1)}, are zero. The algorithms are based upon those by Herbert Wilf, presented by Sandra Fillebrown \cite{Fillebrown:92}. If the {\tt ROUNDED} switch is off, the algorithms are exactly those; if it is on, some further rounding may be done to prevent computation of redundant digits. Hence, these functions are particularly fast when used to approximate the Bernoulli numbers in rounded mode. Euler numbers are computed by the unary operator Euler, which return the nth Euler number. The computation is derived directly from Pascal's triangle of binomial coefficients. \section{Stirling Numbers} \index{Stirling Numbers}\ttindex{Stirling1}\ttindex{Stirling2} Stirling numbers of the first and second kind are computed by the binary operators {\tt Stirling1} and {\tt Stirling2} using explicit formulae. \section{The $\Gamma$ Function, and Related Functions} \ttindex{Gamma}\index{$\Gamma$ function}\index{Gamma function} \subsection{The $\Gamma$ Function} This is represented by the unary operator {\tt Gamma}. Initial transformations applied with {\tt ROUNDED} off are: $\Gamma(n)$ for integral $n$ is computed, $\Gamma(n+1/2)$ for integral $n$ is rewritten to an expression in $\sqrt\pi$, $\Gamma(n+1/m)$ for natural $n$ and $m$ a positive integral power of 2 less than or equal to 64 is rewritten to an expression in $\Gamma(1/m)$, expressions with arguments at which there is a pole are replaced by {\tt INFINITY}, and those with a negative (real) argument are rewritten so as to have positive arguments. The algorithm used for numerical approximation is an implementation of an asymptotic series for $ln(\Gamma)$, with a scaling factor obtained from the Pochhammer functions. An expression for $\Gamma'(z)$ in terms of $\Gamma$ and $\psi$ is included. \subsection{The Pochhammer Notation} \ttindex{Pochhammer}\index{Pochhammer notation} The Pochhammer notation $(a)_k$ is supported by the binary operator {\tt Pochhammer}. With {\tt ROUNDED} off, this expression is evaluated numerically if $a$ and $k$ are both integral, and otherwise may be simplified where appropriate. The simplification rules are based upon algorithms supplied by Wolfram Koepf \cite{Koepf:92}. \subsection{The Digamma Function, $\psi$} \ttindex{PSI}\index{$\psi$ function}\index{psi function}\index{Digamma function} This is represented by the unary operator {\tt PSI}. Initial transformations for $\psi$ are applied on a similar basis to those for $\Gamma$; where possible, $\psi(x)$ is rewritten in terms of $\psi(1)$ and $\psi(\frac{1}{2})$, and expressions with negative arguments are rewritten to have positive ones. Numerical evaluation of $\psi$ is only carried out if the argument is real. The algorithm used is based upon an asymptotic series, with a suitable scaler. Relations for the derivative and integral of $\psi$ are included. \subsection{The Polygamma Functions, $\psi^{(n)}$} \ttindex{Polygamma}\index{$\psi^{(n)}$ functions}\index{Polygamma functions} The $n$th derivative of the $\psi$ function is represented by the binary operator {\tt Polygamma}, whose first argument is $n$. Initial manipulations on $\psi^{(n)}$ are few; where the second argument is $1$ or $3/2$, the expression is rewritten to one involving the Riemann $\zeta$ function, and when the first is zero it is rewritten to $\psi$; poles are also handled. Numerical evaluation is only carried out with real arguments. The algorithm used is again an asymptotic series with a scaling factor; for negative (second) arguments, a Reflection Formula is used, introducing a term in the $n$th derivative of $\cot(z\pi)$. Simple relations for derivatives and integrals are provided. \subsection{The Riemann $\zeta$ Function} \ttindex{Zeta}\index{Riemann Zeta function}\index{Zeta function}\index{$\zeta$ function} This is represented by the unary operator {\tt Zeta}. With {\tt ROUNDED} off, $\zeta(z)$ is evaluated numerically for even integral arguments in the range $-31 < z < 31$, and for odd integral arguments in the range $-30 < z < 16$. Outside this range the values become a little unwieldy. Numerical evaluation of $\zeta$ is only carried out if the argument is real. The algorithms used for $\zeta$ are: for odd integral arguments, an expression relating $\zeta(n)$ with $\psi^{n-1}(3)$; for even arguments, a trivial relationship with the Bernoulli numbers; and for other arguments the approach is either (for larger arguments) to take the first few primes in the standard over-all-primes expansion, and then continue with the defining series with natural numbers not divisible by these primes, or (for smaller arguments) to use a fast-converging series obtained from \cite{Bender:78}. There are no rules for differentiation or integration of $\zeta$. \section{Bessel Functions} \ttindex{BesselJ}\ttindex{BesselY}\ttindex{BesselI}\ttindex{BesselK}\ttindex{Hankel1}\ttindex{Hankel2}\index{Bessel functions}\index{Hankel functions} Support is provided for the Bessel functions J and Y, the modified Bessel functions I and K, and the Hankel functions of the first and second kinds. The relevant operators are, respectively, {\tt BesselJ}, {\tt BesselY}, {\tt BesselI}, {\tt BesselK}, {\tt Hankel1} and {\tt Hankel2}, which are all binary operators. The following initial transformations are performed: \begin{itemize} \item trivial cases or poles of J, Y, I and K are handled; \item J, Y, I and K with negative first argument are transformed to have positive first argument; \item J with negative second argument is transformed for positive second argument; \item Y or K with non-integral or complex second argument is transformed into an expression in J or I respectively; \item derivatives of J, Y and I are carried out; \item derivatives of K with zero first argument are carried out; \item derivatives of Hankel functions are carried out. \end{itemize} Also, if the {\tt COMPLEX} switch is on and {\tt ROUNDED} is off, expressions in Hankel functions are rewritten in terms of Bessels. No numerical approximation is provided for the Bessel K function, or for the Hankel functions for anything other than special cases. The algorithms used for the other Bessels are generally implementations of standard ascending series for J, Y and I, together with asymptotic series for J and Y; usually, the asymptotic series are tried first, and if the argument is too small for them to attain the current precision, the standard series are applied. An obvious optimization prevents an attempt with the asymptotic series if it is clear from the outset that it will fail. There are no rules for the integration of Bessel and Hankel functions. \section{Hypergeometric and Other Functions} \ttindex{Beta}\ttindex{KummerM}\ttindex{KummerU}\ttindex{StruveH} \ttindex{StruveL}\ttindex{Lommel1}\ttindex{Lommel2}\ttindex{WhittakerM} \ttindex{WhittakerW}\index{Beta function}\index{$B$ function} \index{Kummer functions}\index{Struve functions}\index{Lommel functions} \index{Whittaker functions}\index{Hypergeometric functions} This package also provides some support for other functions, in the form of algebraic simplifications: \begin{itemize} \item The Beta function, a variation upon the $\Gamma$ function\cite{Abramowitz:72}, with the binary operator {\tt Beta}; \item The Struve {\bf H} and {\bf L} functions, through the binary operators {\tt StruveH} and {\tt StruveL}, for which manipulations are provided to handle special cases, simplify to more readily handled functions where appropriate, and differentiate with respect to the second argument; \item The Lommel functions of the first and second kinds, through the ternary operators {\tt Lommel1} and {\tt Lommel2}, for which manipulations are provided to handle special cases and simplify where appropriate; \item The Kummer confluent hypergeometric functions M and U (the hypergeometric ${_1F_1}$ or $\Phi$, and $z^{-a}{_2F_0}$ or $\Psi$, respectively), with the ternary operators {\tt KummerM} and {\tt KummerU}, for which there are manipulations for special cases and simplifications, derivatives and, for the M function, numerical approximations for real arguments; \item The Whittaker M and W functions, variations upon the Kummer functions, which, with the ternary operators {\tt WhittakerM} and {\tt WhittakerW}, simplify to expressions in the Kummer functions. \end{itemize} \section{Integral Functions} The SPECFN package includes manipulation and a limited numerical evaluation for some Integral functions, namely erf, erfc, Si, Shi, si, Ci, Chi, Ei, Fresnel\_C and Fresnel\_S. The definitions from integral, the derviatives and some limits are known together with some simple properties such as symmetry conditions. The numerical approximation for the Integral functions suffer from the fact that the precision is not set correctly for values of the argument above 10.0 (approx.) and from the usage of summations even for large arguments. \section{Airy Functions} \ttindex{Airy\_Ai}\ttindex{Airy\_Bi}\ttindex{Airy\_Aiprime} \ttindex{Airy\_Biprime}\index{Airy Functions} Support is provided for the Airy Functions Ai and Bi and for the Airyprime Functions Aiprime and Biprime. The relevant operators are respectively {\tt Airy\_Ai}, {\tt Airy\_Bi}, {\tt Airy\_Aiprime}, and {\tt Airy\_Biprime}, which are all unary operators with one argument. The following cases can be performed: \begin{itemize} \item Trivial cases of Airy\_Ai and Airy\_Bi and their primes are handled. \item All cases can handle both complex and real arguments. \item The Airy Functions can also be represented in terms of Bessel Functions by activating an inactive rule set. \end{itemize} In order to activate the Airy Function to Bessel Rules one should type: \\ {\tt let Airy2Bessel\_rules;}. As a result the Airy\_Ai function, for example will be calculated using the formula :- \\ \\ {\tt Ai(z) = } $\frac{1}{3}$\( \sqrt{z} \)[{\bf {\sl I}}$_{-1/3}$($\zeta$) - {\bf {\sl I}}$_{1/3}$({$\zeta$})] , where $\zeta$ = $\frac{2}{3} z^{\frac{2}{3}}$\\ \\ \underline{{\tt Note}}:- In order to obtain satisfactory approximations to results both the {\tt COMPLEX} and {\tt ROUNDED} switches must be on. The algorithms used for the Airy Functions are implementations of standard ascending series, together with asymptotic series. At some point it is better to use the asymptotic approach, rather than the series. This value is calculated by the program and depends on the given precision. There are no rules for the integration of Airy Functions. \section{Polynomial Functions} Two groups are defined, some well-known orthogonal Polynomials (Hermite, Jacobi, Legendre, Laguerre, Chebyshev, Gegenbauer) and Euler and Bernoulli Polynomials. The names of the \REDUCE\ operator are build by adding a P to the name of the polynomials, e.g. EulerP implements the Euler polynomials. Most definitions are equivalent to \cite{Abramowitz:72}, except for the ternary (associated) Legendre Polynomials. \begin{verbatim} P(n,m,x) = (-1)^m *(1-x^2)^(m/2)*df(legendreP (n,x),x,m) \end{verbatim} \section{Spherical and Solid Harmonics} \ttindex{SolidHarmonicY} \ttindex{SphericalHarmonicY} The relevant operators are, respectively,\\ {\tt SolidHarmonicY} and {\tt SphericalHarmonicY}. The SolidHarmonicY operator implements the Solid Harmonics described below. It expects 6 parameter, namely n,m,x,y,z and r2 and returns a polynomial in x,y,z and r2. The operator SphericalHarmonicY is a special case of SolidHarmonicY with the usual definition: \begin{verbatim} algebraic procedure SphericalHarmonicY(n,m,theta,phi); SolidHarmonicY(n,m,sin(theta)*cos(phi), sin(theta)*sin(phi),cos(theta),1)$ \end{verbatim} Solid Harmonics of order n (Laplace polynomials) are homogeneous polynomials of degree n in x,y,z which are solutions of Laplace equation:- \begin{verbatim} df(P,x,2) + df(P,y,2) + df(P,z,2) = 0. \end{verbatim} There are 2*n+1 independent such polynomials for any given $n >=0$ and with:- \begin{verbatim} w!0 = z, w!+ = i*(x-i*y)/2, w!- = i*(x+i*y)/2, \end{verbatim} they are given by the Fourier integral:- \begin{verbatim} S(n,m,w!-,w!0,w!+) = (1/(2*pi)) * for u:=-pi:pi integrate (w!0 + w!+ * exp(i*u) + w!- * exp(-i*u))^n * exp(i*m*u) * du; \end{verbatim} which is obviously zero if $|m| > n$ since then all terms in the expanded integrand contain the factor exp(i*k*u) with k neq 0, S(n,m,x,y,z) is proportional to \begin{verbatim} r^n * Legendre(n,m,cos theta) * exp(i*phi) \end{verbatim} Let r2 = $x^2 + y^2 + z^2$ and r = sqrt(r2). The spherical harmonics are simply the restriction of the solid harmonics to the surface of the unit sphere and the set of all spherical harmonics {$n >=0; -n <= m =< n$} form a complete orthogonal basis on it, i.e. $<n,m|n',m'>$ = Kronecker\_delta(n,n') * Kronecker\_delta(m,m') using $<...|...>$ to designate the scalar product of functions over the spherical surface. The coefficients of the solid harmonics are normalised in what follows to yield an ortho-normal system of spherical harmonics. Given their polynomial nature, there are many recursions formulae for the solid harmonics and any recursion valid for Legendre functions can be 'translated' into solid harmonics. However the direct proof is usually far simpler using Laplace's definition. It is also clear that all differentiations of solid harmonics are trivial, qua polynomials. Some substantial reduction in the symbolic form would occur if one maintained throughout the recursions the symbol r2 (r cannot occur as it is not rational in x,y,z). Formally the solid harmonics appear in this guise as more compact polynomials in (x,y,z,r2). Only two recursions are needed:- (i) along the diagonal (n,n); (ii) along a line of constant n: (m,m),(m+1,m),...,(n,m). Numerically these recursions are stable. For $m < 0$ one has:- \begin{verbatim} S(n,m,x,y,z) = (-1)^m * S(n,-m,x,-y,z); \end{verbatim} \section{Jacobi's Elliptic Functions} The following functions have been implemented: \begin{itemize} \item The Twelve Jacobi Functions \item Arithmetic Geometric Mean \item Descending Landen Transformation \end{itemize} \subsection{Jacobi Functions} The following Jacobi functions are available:- \begin{itemize} \item Jacobisn(u,m) \item Jacobidn(u,m) \item Jacobicn(u,m) \item Jacobicd(u,m) \item Jacobisd(u,m) \item Jacobind(u,m) \item Jacobidc(u,m) \item Jacobinc(u,m) \item Jacobisc(u,m) \item Jacobins(u,m) \item Jacobids(u,m) \item Jacobics(u,m) \end{itemize} They will be evaluated numerically if the {\tt rounded} switch is used. \subsection{Amplitude} The amplitude of u can be evaluated using the {\tt JacobiAmplitude(u,m)} command. \subsection{Arithmetic Geometric Mean} A procedure to evaluate the AGM of initial values \(a_0,b_0,c_0\) exists as \\ {\tt AGM\_function(\(a_0,b_0,c_0\))} and will return \\ $\{ N, AGM, \{ a_N, \ldots ,a_0\}, \{ b_N, \ldots ,b_0\}, \{c_N, \ldots ,c_0\}\}$, where N is the number of steps to compute the AGM to the desired acuracy. \\ To determine the Elliptic Integrals K($m$), E($m$) we use initial values \(a_0 = 1\); \(b_0 = \sqrt{1-m}\) ; \(c_0 = \sqrt{m}\). \subsection{Descending Landen Transformation} The procedure to evaluate the Descending Landen Transformation of phi and alpha uses the following equations:\\ \indent \ \ \ \ \( (1+sin \alpha_{n+1})(1+cos \alpha_n)=2 \) \ \ \ \ where \(\alpha_{n+1}<\alpha_n\) \\ \indent \ \ \ \ \(tan(\phi_{n+1}-\phi_n)=cos \alpha_n tan \phi_n \) \ \ \ where \(\phi_{n+1}>\phi_n\) \\ It can be called using {\tt landentrans($\phi_0$,$\alpha_0$)} and will return \\ $\{\{\phi_0, \ldots ,\phi_n\},\{\alpha_0, \ldots ,\alpha_n\}\}$. \section{Elliptic Integrals} The following functions have been implemented: \begin{itemize} \item Elliptic Integrals of the First Kind \item Elliptic Integrals of the Second Kind %\item Ellpitic Integrals of the Third Kind \item Jacobi $\theta$ Functions \item Jacobi $\zeta$ Function \end{itemize} \subsection{Elliptic F} The Elliptic F function can be used as {\tt EllipticF($\phi$,m)} and will return the value of the {\underline {Elliptic Integral of the First Kind}}. \subsection{Elliptic K} The Elliptic K function can be used as {\tt EllipticK(m)} and will return the value of the {\underline {Complete Elliptic Integral of the First Kind}}, K. It is often used in the calculation of other elliptic functions \subsection{Elliptic K$'$} The Elliptic K$'$ function can be used as {\tt EllipticK!$'$(m)} and will return the value K($1-m$). \subsection{Elliptic E} The Elliptic E function comes with two different numbers of arguments: It can be used with two arguments as {\tt EllipticE($\phi$,m)} and will return the value of the {\underline {Elliptic Integral of the Second Kind}}. The Elliptic E function can also be used as {\tt EllipticE(m)} and will return the value of the {\underline {Complete Elliptic Integral of the Second Kind}}, E. %\section{Ellpitic $\Pi$} % %The Elliptic $\pi$ function can be used as {\tt EllipticPi( )} and %will return the value of the {\underline {Elliptic Integral of the %Third Kind}}. % \subsection{Elliptic $\Theta$ Functions} This can be used as {\tt EllipticTheta(a,u,m)}, where $a$ is the index for the theta functions ($a = 1,2,3$ or $4$) and will return $H$; $H_1$; $\Theta_1$; $\Theta$. (Also denoted in some texts as $\vartheta_1$; $\vartheta_2$; $\vartheta_3$; $\vartheta_4$.) \subsection{Jacobi's Zeta Function Z } This can be used as {\tt JacobiZeta(u,m)} and will return Jacobi Zeta. Note: the operator {\tt Zeta} will invoke Riemann's $\zeta$ function. \section{Lambert's W function} Lambert's W function is the inverse of the function $w*e^w$. Therefore it is an important contribution for the solve package. The function is studied extensively in \cite{Corless:92}. The current implementation will compute the principal branch in ROUNDED mode only. \section{3j symbols and Clebsch-Gordan Coefficients} The operators {\tt ThreeJSymbol}, {\tt Clebsch\_Gordan} are defined like in \cite{Landolt:68} or \cite{Edmonds:57}. ThreeJSymbol expects as arguments three lists of values \{$j_i,m_i$\}, e.g. \begin{verbatim} ThreeJSymbol({J+1,M},{J,-M},{1,0}); Clebsch_Gordan({2,0},{2,0},{2,0}); \end{verbatim} \section{6j symbols } The operator {\tt SixJSymbol} is defined like in \cite{Landolt:68} or \cite{Edmonds:57}. SixJSymbol expects two lists of values \{$j_1,j_2,j_3$\} and \{$l_1,l_2,l_3$\} as arguments, e.g. \begin{verbatim} SixJSymbol({7,6,3},{2,4,6}); \end{verbatim} In the current implementation of the SixJSymbol, there is only a limited reasoning about the minima and maxima of the summation using the INEQ package, such that in most cases the special 6j-symbols (see e.g. \cite{Landolt:68}) will not be found. \section{Acknowledgements} The contributions of Kerry Gaskell, Matthew Rebbeck, Lisa Temme and Stephen Scowcroft (all students from the University of Bath on placement in ZIB Berlin for one year) were very helpful to augment the package. The advise of Ren\'e Grognard (CSIRO , Australia) for the development of the module for Clebsch-Gordan and 3j, 6j symbols and the module for spherical and solid harmonics was very much appreciated. \section{Table of Operators} \fbox{ \begin{tabular}{r l}\\ Function & Operator \\\\ %\hline $\left( { n \atop m } \right)$ & {\tt Binomial(n,m)} \\ Bernoulli($n$) or $ B_n $ & {\tt Bernoulli(n)} \\ Euler($n$) or $ E_n $ & {\tt Euler(n)} \\ $S_n^{(m)}$ & {\tt Stirling1(n,m)} \\ ${\bf S}_n^{(m)}$ & {\tt Stirling2(n,m)} \\ $\Gamma(z)$ & {\tt Gamma(z)} \\ $(a)_k$ & {\tt Pochhammer(a,k)} \\ $\psi(z)$ & {\tt Psi(z)} \\ $\psi^{(n)}(z)$ & {\tt Polygamma(n,z)} \\ $Riemann's \zeta(z)$ & {\tt Zeta(z)} \\ $J_\nu(z)$ & {\tt BesselJ(nu,z)}\\ $Y_\nu(z)$ & {\tt BesselY(nu,z)}\\ $I_\nu(z)$ & {\tt BesselI(nu,z)}\\ $K_\nu(z)$ & {\tt BesselK(nu,z)}\\ $H^{(1)}_\nu(z)$ & {\tt Hankel1(n,z)}\\ $H^{(2)}_\nu(z)$ & {\tt Hankel2(n,z)}\\ $B(z,w)$ & {\tt Beta(z,w)}\\ ${\bf H}_{\nu}(z)$ & {\tt StruveH(nu,z)}\\ ${\bf L}_{\nu}(z)$ & {\tt StruveL(n,z)}\\ $s_{a,b}(z)$ & {\tt Lommel1(a,b,z)}\\ $S_{a,b}(z)$ & {\tt Lommel2(a,b,z)}\\ $Ai(z)$ & {\tt Airy\_Ai(z)}\\ $Bi(z)$ & {\tt Airy\_Bi(z)}\\ $Ai'(z)$ & {\tt Airy\_Aiprime(z)}\\ $Bi'(z)$ & {\tt Airy\_Biprime(z)}\\ $M(a, b, z)$ or $_1F_1(a, b; z)$ or $\Phi(a, b; z)$ & {\tt KummerM(a,b,z)} \\ $U(a, b, z)$ or $z^{-a}{_2F_0(a, b; z)}$ or $\Psi(a, b; z)$ & {\tt KummerU(a,b,z)}\\ $M_{\kappa,\mu}(z)$ & {\tt WhittakerM(kappa,mu,z)}\\ $W_{\kappa,\mu}(z)$ & {\tt WhittakerW(kappa,mu,z)}\\ $B_n(x)$ & {\tt BernoulliP(n,x)}\\ $E_n(x)$ & {\tt EulerP(n,x)}\\ $C_n^{(\alpha)}(x)$ & {\tt GegenbauerP(n,alpha,x)}\\ $H_n(x)$ & {\tt HermiteP(n,x)}\\ $L_n(x)$ & {\tt LaguerreP(n,x)}\\ $L_n^{(m)}(x)$ & {\tt LaguerreP(n,m,x)}\\ $P_n(x)$ & {\tt LegendreP(n,x)}\\ $P_n^{(m)}(x)$ & {\tt LegendreP(n,m,x)}\\ \end{tabular}} \fbox{ \begin{tabular}{r l}\\ Function & Operator \\\\ %\hline $P_n^{(\alpha,\beta)} (x)$ & {\tt JacobiP(n,alpha,beta,x)}\\ $U_n(x)$ & {\tt ChebyshevU(n,x)}\\ $T_n(x)$ & {\tt ChebyshevT(n,x)}\\ $Y_n^{m}(x,y,z,r2)$ & {\tt SolidHarmonicY(n,m,x,y,z,r2)}\\ $Y_n^{m}(\theta,\phi)$ & {\tt SphericalHarmonicY(n,m,theta,phi)}\\ $\left( {j_1 \atop m_1} {j_2 \atop m_2} {j_3 \atop m_3} \right)$ & {\tt ThreeJSymbol(\{j1,m1\},\{j2,m2\},\{j3,m3\})}\\ $\left( {j_1m_1j_2m_2 | j_1j_2j_3 - m_3} \right)$ & {\tt Clebsch\_Gordan(\{j1,m1\},\{j2,m2\},\{j3,m3\})}\\ $\left\{ {j_1 \atop l_1} {j_2 \atop l_2} {j_3 \atop l_3} \right\}$ & {\tt SixJSymbol(\{j1,j2,j3\},\{l1,l2,l3\})}\\ \\ $Si(z)$ & {\tt Si(z) }\\ $si(z)$ & {\tt s\_i(z) }\\ $Ci(z)$ & {\tt Ci(z) }\\ $Shi(z)$ & {\tt Shi(z) }\\ $Chi(z)$ & {\tt Chi(z) }\\ $erf(z)$ & {\tt erf(z) }\\ $erfc(z)$ & {\tt erfc(z) }\\ $Ei(z)$ & {\tt Ei(z) }\\ $dilog(z)$ & {\tt dilog(z)} \\ $C(x)$ & {\tt Fresnel\_C(x)} \\ $S(x)$ & {\tt Fresnel\_S(x)} \\ \\ $sn(u|m)$ & {\tt Jacobisn(u,m)}\\ $dn(u|m)$ & {\tt Jacobidn(u,m)}\\ $cn(u|m)$ & {\tt Jacobicn(u,m)}\\ $cd(u|m)$ & {\tt Jacobicd(u,m)}\\ $sd(u|m)$ & {\tt Jacobisd(u,m)}\\ $nd(u|m)$ & {\tt Jacobind(u,m)}\\ $dc(u|m)$ & {\tt Jacobidc(u,m)}\\ $nc(u|m)$ & {\tt Jacobinc(u,m)}\\ $sc(u|m)$ & {\tt Jacobisc(u,m)}\\ $ns(u|m)$ & {\tt Jacobins(u,m)}\\ $ds(u|m)$ & {\tt Jacobids(u,m)}\\ $cs(u|m)$ & {\tt Jacobics(u,m)}\\ $F(\phi|m)$ & {\tt EllipticF(phi,m)}\\ $K(m)$ & {\tt EllipticK(m)}\\ $E(\phi|m) or E(m)$ & {\tt EllipticE(phi,m) or EllipticE(m)}\\ $H(u|m), H_1(u|m), \Theta_1(u|m), \Theta(u|m)$ & {\tt EllipticTheta(a,u,m)}\\ $\theta_1(u|m), \theta_2(u|m), \theta_3(u|m), \theta_4(u|m)$ & {\tt EllipticTheta(a,u,m)}\\ $Z(u|m)$ & {\tt Zeta\_function(u,m)} \end{tabular}} \bibliography{specfn} \bibliographystyle{plain} \end{document}