#
# = Discrete Hankel Transforms
# This chapter describes functions for performing Discrete Hankel Transforms
# (DHTs).
#
# 1. {Definitions}[link:dht_rdoc.html#label-Definitions]
# 1. {Initialization}[link:dht_rdoc.html#label-Initialization]
# 1. {Methods}[link:dht_rdoc.html#label-Methods]
#
# == Definitions
# The discrete Hankel transform acts on a vector of sampled data, where the
# samples are assumed to have been taken at points related to the zeroes of a
# Bessel function of fixed order; compare this to the case of the discrete
# Fourier transform, where samples are taken at points related to the zeroes
# of the sine or cosine function.
#
# Specifically, let f(t) be a function on the unit interval. Then the finite
# \nu-Hankel transform of f(t) is defined to be the set of numbers g_m given by,
# so that, Suppose that f is band-limited in the sense that g_m=0 for m > M.
# Then we have the following fundamental sampling theorem. It is this discrete
# expression which defines the discrete Hankel transform. The kernel in the
# summation above defines the matrix of the \nu-Hankel transform of size M-1.
# The coefficients of this matrix, being dependent on \nu and M, must be
# precomputed and stored; the <tt>GSL::Dht</tt> object encapsulates this data.
# The constructor <tt>GSL::Dht.alloc</tt> returns a <tt>GSL::Dht</tt> object
# which must be properly initialized with <tt>GSL::Dht#init</tt> before
# it can be used to perform transforms on data sample vectors,
# for fixed \nu and M, using the <tt>GSL::Dht#apply</tt> method.
# The implementation allows a scaling of the fundamental
# interval, for convenience, so that one can assume the function is defined on
# the interval [0,X], rather than the unit interval.
#
# Notice that by assumption f(t) vanishes at the endpoints of the interval,
# consistent with the inversion formula and the sampling formula given above.
# Therefore, this transform corresponds to an orthogonal expansion in
# eigenfunctions of the Dirichlet problem for the Bessel differential equation.
#
#
# == Initialization
#
# ---
# * GSL::Dht.alloc(size)
# * GSL::Dht.alloc(size, nu, xmax)
#
#   These methods allocate a Discrete Hankel transform object <tt>GSL::Dht</tt>
#   of size <tt>size</tt>.
#   If three arguments are given, the object is initialized with the values of
#   <tt>nu, xmax</tt>.
#
# ---
# * GSL::Dht#init(nu, xmax)
#
#   This initializes the transform <tt>self</tt> for the given values of <tt>nu</tt> and <tt>xmax</tt>.
#
# == Methods
# ---
# * GSL::Dht#apply(vin, vout)
# * GSL::Dht#apply(vin)
#
#   This applies the transform <tt>self</tt> to the vector <tt>vin</tt> whose size is
#   equal to the size of the transform.
#
# ---
# * GSL::Dht#x_sample(n)
#
#   This method returns the value of the n'th sample point in the unit interval,
#   (j_{nu,n+1}/j_{nu,M}) X. These are the points where the function f(t) is
#   assumed to be sampled.
#
# ---
# * GSL::Dht#k_sample(n)
#
#   This method returns the value of the n'th sample point in "k-space",
#   j_{nu,n+1}/X.
#
# ---
# * GSL::Dht#size
#
#   Returns the size of the sample arrays to be transformed
# ---
# * GSL::Dht#nu
#
#   Returns the Bessel function order
# ---
# * GSL::Dht#xmax
#
#   Returns the upper limit to the x-sampling domain
# ---
# * GSL::Dht#kmax
#
#   Returns the upper limit to the k-sampling domain
#
# ---
# * GSL::Dht#j
#
#   Returns an array of computed J_nu zeros, j_{nu,s} = \j[s]
#   as a <tt>GSL::Vector::View</tt>.
#
# ---
# * GSL::Dht#Jjj
#
#   Returns an array of transform numerator, J_nu(j_i j_m / j_N)
#   as a <tt>GSL::Vector::View</tt>.
#
# ---
# * GSL::Dht#J2
#
#   Returns an array of transform numerator, J_nu(j_i j_m / j_N).
#
# ---
# * GSL::Dht#coef
# * GSL::Dht#coef(n, m)
#
#   Return the (n,m)-th transform coefficient.
#
# {prev}[link:sum_rdoc.html]
# {next}[link:roots_rdoc.html]
#
# {Reference index}[link:ref_rdoc.html]
# {top}[link:index.html]
#
#