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++
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
|