# GL Profile Suite / boost_1_51_0 / boost / math / special_functions / laguerre.hpp

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139``` ``` // (C) Copyright John Maddock 2006. // Use, modification and distribution are subject to 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_SPECIAL_LAGUERRE_HPP #define BOOST_MATH_SPECIAL_LAGUERRE_HPP #ifdef _MSC_VER #pragma once #endif #include #include #include namespace boost{ namespace math{ // Recurrance relation for Laguerre polynomials: template inline typename tools::promote_args::type laguerre_next(unsigned n, T1 x, T2 Ln, T3 Lnm1) { typedef typename tools::promote_args::type result_type; return ((2 * n + 1 - result_type(x)) * result_type(Ln) - n * result_type(Lnm1)) / (n + 1); } namespace detail{ // Implement Laguerre polynomials via recurrance: template T laguerre_imp(unsigned n, T x) { T p0 = 1; T p1 = 1 - x; if(n == 0) return p0; unsigned c = 1; while(c < n) { std::swap(p0, p1); p1 = laguerre_next(c, x, p0, p1); ++c; } return p1; } template inline typename tools::promote_args::type laguerre(unsigned n, T x, const Policy&, const mpl::true_&) { typedef typename tools::promote_args::type result_type; typedef typename policies::evaluation::type value_type; return policies::checked_narrowing_cast(detail::laguerre_imp(n, static_cast(x)), "boost::math::laguerre<%1%>(unsigned, %1%)"); } template inline typename tools::promote_args::type laguerre(unsigned n, unsigned m, T x, const mpl::false_&) { return boost::math::laguerre(n, m, x, policies::policy<>()); } } // namespace detail template inline typename tools::promote_args::type laguerre(unsigned n, T x) { return laguerre(n, x, policies::policy<>()); } // Recurrence for associated polynomials: template inline typename tools::promote_args::type laguerre_next(unsigned n, unsigned l, T1 x, T2 Pl, T3 Plm1) { typedef typename tools::promote_args::type result_type; return ((2 * n + l + 1 - result_type(x)) * result_type(Pl) - (n + l) * result_type(Plm1)) / (n+1); } namespace detail{ // Laguerre Associated Polynomial: template T laguerre_imp(unsigned n, unsigned m, T x, const Policy& pol) { // Special cases: if(m == 0) return boost::math::laguerre(n, x, pol); T p0 = 1; if(n == 0) return p0; T p1 = m + 1 - x; unsigned c = 1; while(c < n) { std::swap(p0, p1); p1 = laguerre_next(c, m, x, p0, p1); ++c; } return p1; } } template inline typename tools::promote_args::type laguerre(unsigned n, unsigned m, T x, const Policy& pol) { typedef typename tools::promote_args::type result_type; typedef typename policies::evaluation::type value_type; return policies::checked_narrowing_cast(detail::laguerre_imp(n, m, static_cast(x), pol), "boost::math::laguerre<%1%>(unsigned, unsigned, %1%)"); } template inline typename laguerre_result::type laguerre(unsigned n, T1 m, T2 x) { typedef typename policies::is_policy::type tag_type; return detail::laguerre(n, m, x, tag_type()); } } // namespace math } // namespace boost #endif // BOOST_MATH_SPECIAL_LAGUERRE_HPP ```