@cindex hypergeometric functions
@cindex confluent hypergeometric functions

Hypergeometric functions are described in Abramowitz & Stegun, Chapters
13 and 15.  These functions are declared in the header file
@file{gsl_sf_hyperg.h}.

@deftypefun double gsl_sf_hyperg_0F1 (double @var{c}, double @var{x})
@deftypefunx int gsl_sf_hyperg_0F1_e (double @var{c}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the hypergeometric function @c{${}_0F_1(c,x)$}
@math{0F1(c,x)}.  
@comment It is related to Bessel functions
@comment 0F1[c,x] =
@comment   Gamma[c]    x^(1/2(1-c)) I_(c-1)(2 Sqrt[x])
@comment   Gamma[c] (-x)^(1/2(1-c)) J_(c-1)(2 Sqrt[-x])
@comment exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
@end deftypefun

@deftypefun double gsl_sf_hyperg_1F1_int (int @var{m}, int @var{n}, double @var{x})
@deftypefunx int gsl_sf_hyperg_1F1_int_e (int @var{m}, int @var{n}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the confluent hypergeometric function
@c{${}_1F_1(m,n,x) = M(m,n,x)$}
@math{1F1(m,n,x) = M(m,n,x)} for integer parameters @var{m}, @var{n}.
@comment exceptions: 
@end deftypefun

@deftypefun double gsl_sf_hyperg_1F1 (double @var{a}, double @var{b}, double @var{x})
@deftypefunx int gsl_sf_hyperg_1F1_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the confluent hypergeometric function
@c{${}_1F_1(a,b,x) = M(a,b,x)$}
@math{1F1(a,b,x) = M(a,b,x)} for general parameters @var{a}, @var{b}.
@comment exceptions:
@end deftypefun

@deftypefun double gsl_sf_hyperg_U_int (int @var{m}, int @var{n}, double @var{x})
@deftypefunx int gsl_sf_hyperg_U_int_e (int @var{m}, int @var{n}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the confluent hypergeometric function
@math{U(m,n,x)} for integer parameters @var{m}, @var{n}.
@comment exceptions:
@end deftypefun

@deftypefun int gsl_sf_hyperg_U_int_e10_e (int @var{m}, int @var{n}, double @var{x}, gsl_sf_result_e10 * @var{result})
This routine computes the confluent hypergeometric function
@math{U(m,n,x)} for integer parameters @var{m}, @var{n} using the
@code{gsl_sf_result_e10} type to return a result with extended range.
@end deftypefun

@deftypefun double gsl_sf_hyperg_U (double @var{a}, double @var{b}, double @var{x})
@deftypefunx int gsl_sf_hyperg_U_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the confluent hypergeometric function @math{U(a,b,x)}.
@comment exceptions:
@end deftypefun

@deftypefun int gsl_sf_hyperg_U_e10_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result_e10 * @var{result})
This routine computes the confluent hypergeometric function
@math{U(a,b,x)} using the @code{gsl_sf_result_e10} type to return a
result with extended range. 
@comment exceptions:
@end deftypefun

@deftypefun double gsl_sf_hyperg_2F1 (double @var{a}, double @var{b}, double @var{c}, double @var{x})
@deftypefunx int gsl_sf_hyperg_2F1_e (double @var{a}, double @var{b}, double @var{c}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the Gauss hypergeometric function 
@c{${}_2F_1(a,b,c,x)$}
@math{2F1(a,b,c,x)} for @math{|x| < 1}.  

If the arguments @math{(a,b,c,x)} are too close to a singularity then
the function can return the error code @code{GSL_EMAXITER} when the
series approximation converges too slowly.  This occurs in the region of
@math{x=1}, @math{c - a - b = m} for integer m.
@comment exceptions:
@end deftypefun

@deftypefun double gsl_sf_hyperg_2F1_conj (double @var{aR}, double @var{aI}, double @var{c}, double @var{x})
@deftypefunx int gsl_sf_hyperg_2F1_conj_e (double @var{aR}, double @var{aI}, double @var{c}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the Gauss hypergeometric function
@c{${}_2F_1(a_R + i a_I, aR - i aI, c, x)$}
@math{2F1(a_R + i a_I, a_R - i a_I, c, x)} with complex parameters 
for @math{|x| < 1}.
exceptions:
@end deftypefun

@deftypefun double gsl_sf_hyperg_2F1_renorm (double @var{a}, double @var{b}, double @var{c}, double @var{x})
@deftypefunx int gsl_sf_hyperg_2F1_renorm_e (double @var{a}, double @var{b}, double @var{c}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the renormalized Gauss hypergeometric function
@c{${}_2F_1(a,b,c,x) / \Gamma(c)$}
@math{2F1(a,b,c,x) / \Gamma(c)} for @math{|x| < 1}.
@comment exceptions:
@end deftypefun

@deftypefun double gsl_sf_hyperg_2F1_conj_renorm (double @var{aR}, double @var{aI}, double @var{c}, double @var{x})
@deftypefunx int gsl_sf_hyperg_2F1_conj_renorm_e (double @var{aR}, double @var{aI}, double @var{c}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the renormalized Gauss hypergeometric function
@c{${}_2F_1(a_R + i a_I, a_R - i a_I, c, x) / \Gamma(c)$}
@math{2F1(a_R + i a_I, a_R - i a_I, c, x) / \Gamma(c)} for @math{|x| < 1}.
@comment exceptions:
@end deftypefun

@deftypefun double gsl_sf_hyperg_2F0 (double @var{a}, double @var{b}, double @var{x})
@deftypefunx int gsl_sf_hyperg_2F0_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the hypergeometric function @c{${}_2F_0(a,b,x)$}
@math{2F0(a,b,x)}.  The series representation
is a divergent hypergeometric series.  However, for @math{x < 0} we
have 
@c{${}_2F_0(a,b,x) = (-1/x)^a U(a,1+a-b,-1/x)$}
@math{2F0(a,b,x) = (-1/x)^a U(a,1+a-b,-1/x)}
@comment exceptions: GSL_EDOM
@end deftypefun
