You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
1.4 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Copyright 2014 Anton Bikineev
// Copyright 2014 Christopher Kormanyos
// Copyright 2014 John Maddock
// Copyright 2014 Paul Bristow
// Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#ifndef BOOST_MATH_HYPERGEOMETRIC_SEPARATED_SERIES_HPP
#define BOOST_MATH_HYPERGEOMETRIC_SEPARATED_SERIES_HPP
namespace boost { namespace math { namespace detail {
template <class T, class Policy>
inline T hypergeometric_1F1_separated_series(const T& a, const T& b, const T& z, const Policy& pol)
{
BOOST_MATH_STD_USING
std::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
const T factor = policies::get_epsilon<T, Policy>();
T denom = 1, numer = 1;
T intermediate_result = 1, result = 1;
T a_pochhammer = a, z_pow = z;
unsigned N = 0;
while (--max_iter)
{
++N;
const T mult = (((b + N) - 1) * N);
denom *= mult; numer *= mult;
numer += a_pochhammer * z_pow;
result = numer / denom;
if (fabs(factor * result) > fabs(result - intermediate_result))
break;
intermediate_result = result;
a_pochhammer *= (a + N);
z_pow *= z;
}
return result;
}
} } } // namespaces
#endif // BOOST_MATH_HYPERGEOMETRIC_SEPARATED_SERIES_HPP