xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/tr1/poly_laguerre.tcc (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // Special functions -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 2006, 2007, 2008, 2009, 2010
4*e4b17023SJohn Marino // Free Software Foundation, Inc.
5*e4b17023SJohn Marino //
6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino // any later version.
11*e4b17023SJohn Marino //
12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino // GNU General Public License for more details.
16*e4b17023SJohn Marino //
17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
25*e4b17023SJohn Marino 
26*e4b17023SJohn Marino /** @file tr1/poly_laguerre.tcc
27*e4b17023SJohn Marino  *  This is an internal header file, included by other library headers.
28*e4b17023SJohn Marino  *  Do not attempt to use it directly. @headername{tr1/cmath}
29*e4b17023SJohn Marino  */
30*e4b17023SJohn Marino 
31*e4b17023SJohn Marino //
32*e4b17023SJohn Marino // ISO C++ 14882 TR1: 5.2  Special functions
33*e4b17023SJohn Marino //
34*e4b17023SJohn Marino 
35*e4b17023SJohn Marino // Written by Edward Smith-Rowland based on:
36*e4b17023SJohn Marino //   (1) Handbook of Mathematical Functions,
37*e4b17023SJohn Marino //       Ed. Milton Abramowitz and Irene A. Stegun,
38*e4b17023SJohn Marino //       Dover Publications,
39*e4b17023SJohn Marino //       Section 13, pp. 509-510, Section 22 pp. 773-802
40*e4b17023SJohn Marino //   (2) The Gnu Scientific Library, http://www.gnu.org/software/gsl
41*e4b17023SJohn Marino 
42*e4b17023SJohn Marino #ifndef _GLIBCXX_TR1_POLY_LAGUERRE_TCC
43*e4b17023SJohn Marino #define _GLIBCXX_TR1_POLY_LAGUERRE_TCC 1
44*e4b17023SJohn Marino 
45*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
46*e4b17023SJohn Marino {
47*e4b17023SJohn Marino namespace tr1
48*e4b17023SJohn Marino {
49*e4b17023SJohn Marino   // [5.2] Special functions
50*e4b17023SJohn Marino 
51*e4b17023SJohn Marino   // Implementation-space details.
52*e4b17023SJohn Marino   namespace __detail
53*e4b17023SJohn Marino   {
54*e4b17023SJohn Marino   _GLIBCXX_BEGIN_NAMESPACE_VERSION
55*e4b17023SJohn Marino 
56*e4b17023SJohn Marino     /**
57*e4b17023SJohn Marino      *   @brief This routine returns the associated Laguerre polynomial
58*e4b17023SJohn Marino      *          of order @f$ n @f$, degree @f$ \alpha @f$ for large n.
59*e4b17023SJohn Marino      *   Abramowitz & Stegun, 13.5.21
60*e4b17023SJohn Marino      *
61*e4b17023SJohn Marino      *   @param __n The order of the Laguerre function.
62*e4b17023SJohn Marino      *   @param __alpha The degree of the Laguerre function.
63*e4b17023SJohn Marino      *   @param __x The argument of the Laguerre function.
64*e4b17023SJohn Marino      *   @return The value of the Laguerre function of order n,
65*e4b17023SJohn Marino      *           degree @f$ \alpha @f$, and argument x.
66*e4b17023SJohn Marino      *
67*e4b17023SJohn Marino      *  This is from the GNU Scientific Library.
68*e4b17023SJohn Marino      */
69*e4b17023SJohn Marino     template<typename _Tpa, typename _Tp>
70*e4b17023SJohn Marino     _Tp
__poly_laguerre_large_n(const unsigned __n,const _Tpa __alpha1,const _Tp __x)71*e4b17023SJohn Marino     __poly_laguerre_large_n(const unsigned __n, const _Tpa __alpha1,
72*e4b17023SJohn Marino                             const _Tp __x)
73*e4b17023SJohn Marino     {
74*e4b17023SJohn Marino       const _Tp __a = -_Tp(__n);
75*e4b17023SJohn Marino       const _Tp __b = _Tp(__alpha1) + _Tp(1);
76*e4b17023SJohn Marino       const _Tp __eta = _Tp(2) * __b - _Tp(4) * __a;
77*e4b17023SJohn Marino       const _Tp __cos2th = __x / __eta;
78*e4b17023SJohn Marino       const _Tp __sin2th = _Tp(1) - __cos2th;
79*e4b17023SJohn Marino       const _Tp __th = std::acos(std::sqrt(__cos2th));
80*e4b17023SJohn Marino       const _Tp __pre_h = __numeric_constants<_Tp>::__pi_2()
81*e4b17023SJohn Marino                         * __numeric_constants<_Tp>::__pi_2()
82*e4b17023SJohn Marino                         * __eta * __eta * __cos2th * __sin2th;
83*e4b17023SJohn Marino 
84*e4b17023SJohn Marino #if _GLIBCXX_USE_C99_MATH_TR1
85*e4b17023SJohn Marino       const _Tp __lg_b = std::tr1::lgamma(_Tp(__n) + __b);
86*e4b17023SJohn Marino       const _Tp __lnfact = std::tr1::lgamma(_Tp(__n + 1));
87*e4b17023SJohn Marino #else
88*e4b17023SJohn Marino       const _Tp __lg_b = __log_gamma(_Tp(__n) + __b);
89*e4b17023SJohn Marino       const _Tp __lnfact = __log_gamma(_Tp(__n + 1));
90*e4b17023SJohn Marino #endif
91*e4b17023SJohn Marino 
92*e4b17023SJohn Marino       _Tp __pre_term1 = _Tp(0.5L) * (_Tp(1) - __b)
93*e4b17023SJohn Marino                       * std::log(_Tp(0.25L) * __x * __eta);
94*e4b17023SJohn Marino       _Tp __pre_term2 = _Tp(0.25L) * std::log(__pre_h);
95*e4b17023SJohn Marino       _Tp __lnpre = __lg_b - __lnfact + _Tp(0.5L) * __x
96*e4b17023SJohn Marino                       + __pre_term1 - __pre_term2;
97*e4b17023SJohn Marino       _Tp __ser_term1 = std::sin(__a * __numeric_constants<_Tp>::__pi());
98*e4b17023SJohn Marino       _Tp __ser_term2 = std::sin(_Tp(0.25L) * __eta
99*e4b17023SJohn Marino                               * (_Tp(2) * __th
100*e4b17023SJohn Marino                                - std::sin(_Tp(2) * __th))
101*e4b17023SJohn Marino                                + __numeric_constants<_Tp>::__pi_4());
102*e4b17023SJohn Marino       _Tp __ser = __ser_term1 + __ser_term2;
103*e4b17023SJohn Marino 
104*e4b17023SJohn Marino       return std::exp(__lnpre) * __ser;
105*e4b17023SJohn Marino     }
106*e4b17023SJohn Marino 
107*e4b17023SJohn Marino 
108*e4b17023SJohn Marino     /**
109*e4b17023SJohn Marino      *  @brief  Evaluate the polynomial based on the confluent hypergeometric
110*e4b17023SJohn Marino      *          function in a safe way, with no restriction on the arguments.
111*e4b17023SJohn Marino      *
112*e4b17023SJohn Marino      *   The associated Laguerre function is defined by
113*e4b17023SJohn Marino      *   @f[
114*e4b17023SJohn Marino      *       L_n^\alpha(x) = \frac{(\alpha + 1)_n}{n!}
115*e4b17023SJohn Marino      *                       _1F_1(-n; \alpha + 1; x)
116*e4b17023SJohn Marino      *   @f]
117*e4b17023SJohn Marino      *   where @f$ (\alpha)_n @f$ is the Pochhammer symbol and
118*e4b17023SJohn Marino      *   @f$ _1F_1(a; c; x) @f$ is the confluent hypergeometric function.
119*e4b17023SJohn Marino      *
120*e4b17023SJohn Marino      *  This function assumes x != 0.
121*e4b17023SJohn Marino      *
122*e4b17023SJohn Marino      *  This is from the GNU Scientific Library.
123*e4b17023SJohn Marino      */
124*e4b17023SJohn Marino     template<typename _Tpa, typename _Tp>
125*e4b17023SJohn Marino     _Tp
__poly_laguerre_hyperg(const unsigned int __n,const _Tpa __alpha1,const _Tp __x)126*e4b17023SJohn Marino     __poly_laguerre_hyperg(const unsigned int __n, const _Tpa __alpha1,
127*e4b17023SJohn Marino 			   const _Tp __x)
128*e4b17023SJohn Marino     {
129*e4b17023SJohn Marino       const _Tp __b = _Tp(__alpha1) + _Tp(1);
130*e4b17023SJohn Marino       const _Tp __mx = -__x;
131*e4b17023SJohn Marino       const _Tp __tc_sgn = (__x < _Tp(0) ? _Tp(1)
132*e4b17023SJohn Marino                          : ((__n % 2 == 1) ? -_Tp(1) : _Tp(1)));
133*e4b17023SJohn Marino       //  Get |x|^n/n!
134*e4b17023SJohn Marino       _Tp __tc = _Tp(1);
135*e4b17023SJohn Marino       const _Tp __ax = std::abs(__x);
136*e4b17023SJohn Marino       for (unsigned int __k = 1; __k <= __n; ++__k)
137*e4b17023SJohn Marino         __tc *= (__ax / __k);
138*e4b17023SJohn Marino 
139*e4b17023SJohn Marino       _Tp __term = __tc * __tc_sgn;
140*e4b17023SJohn Marino       _Tp __sum = __term;
141*e4b17023SJohn Marino       for (int __k = int(__n) - 1; __k >= 0; --__k)
142*e4b17023SJohn Marino         {
143*e4b17023SJohn Marino           __term *= ((__b + _Tp(__k)) / _Tp(int(__n) - __k))
144*e4b17023SJohn Marino                   * _Tp(__k + 1) / __mx;
145*e4b17023SJohn Marino           __sum += __term;
146*e4b17023SJohn Marino         }
147*e4b17023SJohn Marino 
148*e4b17023SJohn Marino       return __sum;
149*e4b17023SJohn Marino     }
150*e4b17023SJohn Marino 
151*e4b17023SJohn Marino 
152*e4b17023SJohn Marino     /**
153*e4b17023SJohn Marino      *   @brief This routine returns the associated Laguerre polynomial
154*e4b17023SJohn Marino      *          of order @f$ n @f$, degree @f$ \alpha @f$: @f$ L_n^\alpha(x) @f$
155*e4b17023SJohn Marino      *          by recursion.
156*e4b17023SJohn Marino      *
157*e4b17023SJohn Marino      *   The associated Laguerre function is defined by
158*e4b17023SJohn Marino      *   @f[
159*e4b17023SJohn Marino      *       L_n^\alpha(x) = \frac{(\alpha + 1)_n}{n!}
160*e4b17023SJohn Marino      *                       _1F_1(-n; \alpha + 1; x)
161*e4b17023SJohn Marino      *   @f]
162*e4b17023SJohn Marino      *   where @f$ (\alpha)_n @f$ is the Pochhammer symbol and
163*e4b17023SJohn Marino      *   @f$ _1F_1(a; c; x) @f$ is the confluent hypergeometric function.
164*e4b17023SJohn Marino      *
165*e4b17023SJohn Marino      *   The associated Laguerre polynomial is defined for integral
166*e4b17023SJohn Marino      *   @f$ \alpha = m @f$ by:
167*e4b17023SJohn Marino      *   @f[
168*e4b17023SJohn Marino      *       L_n^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n + m}(x)
169*e4b17023SJohn Marino      *   @f]
170*e4b17023SJohn Marino      *   where the Laguerre polynomial is defined by:
171*e4b17023SJohn Marino      *   @f[
172*e4b17023SJohn Marino      *       L_n(x) = \frac{e^x}{n!} \frac{d^n}{dx^n} (x^ne^{-x})
173*e4b17023SJohn Marino      *   @f]
174*e4b17023SJohn Marino      *
175*e4b17023SJohn Marino      *   @param __n The order of the Laguerre function.
176*e4b17023SJohn Marino      *   @param __alpha The degree of the Laguerre function.
177*e4b17023SJohn Marino      *   @param __x The argument of the Laguerre function.
178*e4b17023SJohn Marino      *   @return The value of the Laguerre function of order n,
179*e4b17023SJohn Marino      *           degree @f$ \alpha @f$, and argument x.
180*e4b17023SJohn Marino      */
181*e4b17023SJohn Marino     template<typename _Tpa, typename _Tp>
182*e4b17023SJohn Marino     _Tp
__poly_laguerre_recursion(const unsigned int __n,const _Tpa __alpha1,const _Tp __x)183*e4b17023SJohn Marino     __poly_laguerre_recursion(const unsigned int __n,
184*e4b17023SJohn Marino                               const _Tpa __alpha1, const _Tp __x)
185*e4b17023SJohn Marino     {
186*e4b17023SJohn Marino       //   Compute l_0.
187*e4b17023SJohn Marino       _Tp __l_0 = _Tp(1);
188*e4b17023SJohn Marino       if  (__n == 0)
189*e4b17023SJohn Marino         return __l_0;
190*e4b17023SJohn Marino 
191*e4b17023SJohn Marino       //  Compute l_1^alpha.
192*e4b17023SJohn Marino       _Tp __l_1 = -__x + _Tp(1) + _Tp(__alpha1);
193*e4b17023SJohn Marino       if  (__n == 1)
194*e4b17023SJohn Marino         return __l_1;
195*e4b17023SJohn Marino 
196*e4b17023SJohn Marino       //  Compute l_n^alpha by recursion on n.
197*e4b17023SJohn Marino       _Tp __l_n2 = __l_0;
198*e4b17023SJohn Marino       _Tp __l_n1 = __l_1;
199*e4b17023SJohn Marino       _Tp __l_n = _Tp(0);
200*e4b17023SJohn Marino       for  (unsigned int __nn = 2; __nn <= __n; ++__nn)
201*e4b17023SJohn Marino         {
202*e4b17023SJohn Marino             __l_n = (_Tp(2 * __nn - 1) + _Tp(__alpha1) - __x)
203*e4b17023SJohn Marino                   * __l_n1 / _Tp(__nn)
204*e4b17023SJohn Marino                   - (_Tp(__nn - 1) + _Tp(__alpha1)) * __l_n2 / _Tp(__nn);
205*e4b17023SJohn Marino             __l_n2 = __l_n1;
206*e4b17023SJohn Marino             __l_n1 = __l_n;
207*e4b17023SJohn Marino         }
208*e4b17023SJohn Marino 
209*e4b17023SJohn Marino       return __l_n;
210*e4b17023SJohn Marino     }
211*e4b17023SJohn Marino 
212*e4b17023SJohn Marino 
213*e4b17023SJohn Marino     /**
214*e4b17023SJohn Marino      *   @brief This routine returns the associated Laguerre polynomial
215*e4b17023SJohn Marino      *          of order n, degree @f$ \alpha @f$: @f$ L_n^alpha(x) @f$.
216*e4b17023SJohn Marino      *
217*e4b17023SJohn Marino      *   The associated Laguerre function is defined by
218*e4b17023SJohn Marino      *   @f[
219*e4b17023SJohn Marino      *       L_n^\alpha(x) = \frac{(\alpha + 1)_n}{n!}
220*e4b17023SJohn Marino      *                       _1F_1(-n; \alpha + 1; x)
221*e4b17023SJohn Marino      *   @f]
222*e4b17023SJohn Marino      *   where @f$ (\alpha)_n @f$ is the Pochhammer symbol and
223*e4b17023SJohn Marino      *   @f$ _1F_1(a; c; x) @f$ is the confluent hypergeometric function.
224*e4b17023SJohn Marino      *
225*e4b17023SJohn Marino      *   The associated Laguerre polynomial is defined for integral
226*e4b17023SJohn Marino      *   @f$ \alpha = m @f$ by:
227*e4b17023SJohn Marino      *   @f[
228*e4b17023SJohn Marino      *       L_n^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n + m}(x)
229*e4b17023SJohn Marino      *   @f]
230*e4b17023SJohn Marino      *   where the Laguerre polynomial is defined by:
231*e4b17023SJohn Marino      *   @f[
232*e4b17023SJohn Marino      *       L_n(x) = \frac{e^x}{n!} \frac{d^n}{dx^n} (x^ne^{-x})
233*e4b17023SJohn Marino      *   @f]
234*e4b17023SJohn Marino      *
235*e4b17023SJohn Marino      *   @param __n The order of the Laguerre function.
236*e4b17023SJohn Marino      *   @param __alpha The degree of the Laguerre function.
237*e4b17023SJohn Marino      *   @param __x The argument of the Laguerre function.
238*e4b17023SJohn Marino      *   @return The value of the Laguerre function of order n,
239*e4b17023SJohn Marino      *           degree @f$ \alpha @f$, and argument x.
240*e4b17023SJohn Marino      */
241*e4b17023SJohn Marino     template<typename _Tpa, typename _Tp>
242*e4b17023SJohn Marino     inline _Tp
__poly_laguerre(const unsigned int __n,const _Tpa __alpha1,const _Tp __x)243*e4b17023SJohn Marino     __poly_laguerre(const unsigned int __n, const _Tpa __alpha1,
244*e4b17023SJohn Marino                     const _Tp __x)
245*e4b17023SJohn Marino     {
246*e4b17023SJohn Marino       if (__x < _Tp(0))
247*e4b17023SJohn Marino         std::__throw_domain_error(__N("Negative argument "
248*e4b17023SJohn Marino                                       "in __poly_laguerre."));
249*e4b17023SJohn Marino       //  Return NaN on NaN input.
250*e4b17023SJohn Marino       else if (__isnan(__x))
251*e4b17023SJohn Marino         return std::numeric_limits<_Tp>::quiet_NaN();
252*e4b17023SJohn Marino       else if (__n == 0)
253*e4b17023SJohn Marino         return _Tp(1);
254*e4b17023SJohn Marino       else if (__n == 1)
255*e4b17023SJohn Marino         return _Tp(1) + _Tp(__alpha1) - __x;
256*e4b17023SJohn Marino       else if (__x == _Tp(0))
257*e4b17023SJohn Marino         {
258*e4b17023SJohn Marino           _Tp __prod = _Tp(__alpha1) + _Tp(1);
259*e4b17023SJohn Marino           for (unsigned int __k = 2; __k <= __n; ++__k)
260*e4b17023SJohn Marino             __prod *= (_Tp(__alpha1) + _Tp(__k)) / _Tp(__k);
261*e4b17023SJohn Marino           return __prod;
262*e4b17023SJohn Marino         }
263*e4b17023SJohn Marino       else if (__n > 10000000 && _Tp(__alpha1) > -_Tp(1)
264*e4b17023SJohn Marino             && __x < _Tp(2) * (_Tp(__alpha1) + _Tp(1)) + _Tp(4 * __n))
265*e4b17023SJohn Marino         return __poly_laguerre_large_n(__n, __alpha1, __x);
266*e4b17023SJohn Marino       else if (_Tp(__alpha1) >= _Tp(0)
267*e4b17023SJohn Marino            || (__x > _Tp(0) && _Tp(__alpha1) < -_Tp(__n + 1)))
268*e4b17023SJohn Marino         return __poly_laguerre_recursion(__n, __alpha1, __x);
269*e4b17023SJohn Marino       else
270*e4b17023SJohn Marino         return __poly_laguerre_hyperg(__n, __alpha1, __x);
271*e4b17023SJohn Marino     }
272*e4b17023SJohn Marino 
273*e4b17023SJohn Marino 
274*e4b17023SJohn Marino     /**
275*e4b17023SJohn Marino      *   @brief This routine returns the associated Laguerre polynomial
276*e4b17023SJohn Marino      *          of order n, degree m: @f$ L_n^m(x) @f$.
277*e4b17023SJohn Marino      *
278*e4b17023SJohn Marino      *   The associated Laguerre polynomial is defined for integral
279*e4b17023SJohn Marino      *   @f$ \alpha = m @f$ by:
280*e4b17023SJohn Marino      *   @f[
281*e4b17023SJohn Marino      *       L_n^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n + m}(x)
282*e4b17023SJohn Marino      *   @f]
283*e4b17023SJohn Marino      *   where the Laguerre polynomial is defined by:
284*e4b17023SJohn Marino      *   @f[
285*e4b17023SJohn Marino      *       L_n(x) = \frac{e^x}{n!} \frac{d^n}{dx^n} (x^ne^{-x})
286*e4b17023SJohn Marino      *   @f]
287*e4b17023SJohn Marino      *
288*e4b17023SJohn Marino      *   @param __n The order of the Laguerre polynomial.
289*e4b17023SJohn Marino      *   @param __m The degree of the Laguerre polynomial.
290*e4b17023SJohn Marino      *   @param __x The argument of the Laguerre polynomial.
291*e4b17023SJohn Marino      *   @return The value of the associated Laguerre polynomial of order n,
292*e4b17023SJohn Marino      *           degree m, and argument x.
293*e4b17023SJohn Marino      */
294*e4b17023SJohn Marino     template<typename _Tp>
295*e4b17023SJohn Marino     inline _Tp
__assoc_laguerre(const unsigned int __n,const unsigned int __m,const _Tp __x)296*e4b17023SJohn Marino     __assoc_laguerre(const unsigned int __n, const unsigned int __m,
297*e4b17023SJohn Marino                      const _Tp __x)
298*e4b17023SJohn Marino     {
299*e4b17023SJohn Marino       return __poly_laguerre<unsigned int, _Tp>(__n, __m, __x);
300*e4b17023SJohn Marino     }
301*e4b17023SJohn Marino 
302*e4b17023SJohn Marino 
303*e4b17023SJohn Marino     /**
304*e4b17023SJohn Marino      *   @brief This routine returns the Laguerre polynomial
305*e4b17023SJohn Marino      *          of order n: @f$ L_n(x) @f$.
306*e4b17023SJohn Marino      *
307*e4b17023SJohn Marino      *   The Laguerre polynomial is defined by:
308*e4b17023SJohn Marino      *   @f[
309*e4b17023SJohn Marino      *       L_n(x) = \frac{e^x}{n!} \frac{d^n}{dx^n} (x^ne^{-x})
310*e4b17023SJohn Marino      *   @f]
311*e4b17023SJohn Marino      *
312*e4b17023SJohn Marino      *   @param __n The order of the Laguerre polynomial.
313*e4b17023SJohn Marino      *   @param __x The argument of the Laguerre polynomial.
314*e4b17023SJohn Marino      *   @return The value of the Laguerre polynomial of order n
315*e4b17023SJohn Marino      *           and argument x.
316*e4b17023SJohn Marino      */
317*e4b17023SJohn Marino     template<typename _Tp>
318*e4b17023SJohn Marino     inline _Tp
__laguerre(const unsigned int __n,const _Tp __x)319*e4b17023SJohn Marino     __laguerre(const unsigned int __n, const _Tp __x)
320*e4b17023SJohn Marino     {
321*e4b17023SJohn Marino       return __poly_laguerre<unsigned int, _Tp>(__n, 0, __x);
322*e4b17023SJohn Marino     }
323*e4b17023SJohn Marino 
324*e4b17023SJohn Marino   _GLIBCXX_END_NAMESPACE_VERSION
325*e4b17023SJohn Marino   } // namespace std::tr1::__detail
326*e4b17023SJohn Marino }
327*e4b17023SJohn Marino }
328*e4b17023SJohn Marino 
329*e4b17023SJohn Marino #endif // _GLIBCXX_TR1_POLY_LAGUERRE_TCC
330