|
Packit |
67cb25 |
/* specfunc/laguerre.c
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* Copyright (C) 2007 Brian Gough
|
|
Packit |
67cb25 |
* Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
67cb25 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
67cb25 |
* the Free Software Foundation; either version 3 of the License, or (at
|
|
Packit |
67cb25 |
* your option) any later version.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* This program is distributed in the hope that it will be useful, but
|
|
Packit |
67cb25 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
67cb25 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
67cb25 |
* General Public License for more details.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
67cb25 |
* along with this program; if not, write to the Free Software
|
|
Packit |
67cb25 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Author: G. Jungman */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include <config.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_math.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_errno.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_sf_exp.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_sf_gamma.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_sf_laguerre.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include "error.h"
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* based on the large 2b-4a asymptotic for 1F1
|
|
Packit |
67cb25 |
* [Abramowitz+Stegun, 13.5.21]
|
|
Packit |
67cb25 |
* L^a_n(x) = (a+1)_n / n! 1F1(-n,a+1,x)
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* The second term (ser_term2) is from Slater,"The Confluent
|
|
Packit |
67cb25 |
* Hypergeometric Function" p.73. I think there may be an error in
|
|
Packit |
67cb25 |
* the first term of the expression given there, comparing with AS
|
|
Packit |
67cb25 |
* 13.5.21 (cf sin(a\pi+\Theta) vs sin(a\pi) + sin(\Theta)) - but the
|
|
Packit |
67cb25 |
* second term appears correct.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
static
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
laguerre_large_n(const int n, const double alpha, const double x,
|
|
Packit |
67cb25 |
gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const double a = -n;
|
|
Packit |
67cb25 |
const double b = alpha + 1.0;
|
|
Packit |
67cb25 |
const double eta = 2.0*b - 4.0*a;
|
|
Packit |
67cb25 |
const double cos2th = x/eta;
|
|
Packit |
67cb25 |
const double sin2th = 1.0 - cos2th;
|
|
Packit |
67cb25 |
const double eps = asin(sqrt(cos2th)); /* theta = pi/2 - eps */
|
|
Packit |
67cb25 |
const double pre_h = 0.25*M_PI*M_PI*eta*eta*cos2th*sin2th;
|
|
Packit |
67cb25 |
gsl_sf_result lg_b;
|
|
Packit |
67cb25 |
gsl_sf_result lnfact;
|
|
Packit |
67cb25 |
int stat_lg = gsl_sf_lngamma_e(b+n, &lg_b);
|
|
Packit |
67cb25 |
int stat_lf = gsl_sf_lnfact_e(n, &lnfact);
|
|
Packit |
67cb25 |
double pre_term1 = 0.5*(1.0-b)*log(0.25*x*eta);
|
|
Packit |
67cb25 |
double pre_term2 = 0.25*log(pre_h);
|
|
Packit |
67cb25 |
double lnpre_val = lg_b.val - lnfact.val + 0.5*x + pre_term1 - pre_term2;
|
|
Packit |
67cb25 |
double lnpre_err = lg_b.err + lnfact.err + GSL_DBL_EPSILON * (fabs(pre_term1)+fabs(pre_term2));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double phi1 = 0.25*eta*(2*eps + sin(2.0*eps));
|
|
Packit |
67cb25 |
double ser_term1 = -sin(phi1);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double A1 = (1.0/12.0)*(5.0/(4.0*sin2th)+(3.0*b*b-6.0*b+2.0)*sin2th - 1.0);
|
|
Packit |
67cb25 |
double ser_term2 = -A1 * cos(phi1)/(0.25*eta*sin(2.0*eps));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double ser_val = ser_term1 + ser_term2;
|
|
Packit |
67cb25 |
double ser_err = ser_term2*ser_term2 + GSL_DBL_EPSILON * (fabs(ser_term1) + fabs(ser_term2));
|
|
Packit |
67cb25 |
int stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err, ser_val, ser_err, result);
|
|
Packit |
67cb25 |
result->err += 2.0 * GSL_SQRT_DBL_EPSILON * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_3(stat_e, stat_lf, stat_lg);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Evaluate polynomial based on confluent hypergeometric representation.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* L^a_n(x) = (a+1)_n / n! 1F1(-n,a+1,x)
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* assumes n > 0 and a != negative integer greater than -n
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
static
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
laguerre_n_cp(const int n, const double a, const double x, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_sf_result lnfact;
|
|
Packit |
67cb25 |
gsl_sf_result lg1;
|
|
Packit |
67cb25 |
gsl_sf_result lg2;
|
|
Packit |
67cb25 |
double s1, s2;
|
|
Packit |
67cb25 |
int stat_f = gsl_sf_lnfact_e(n, &lnfact);
|
|
Packit |
67cb25 |
int stat_g1 = gsl_sf_lngamma_sgn_e(a+1.0+n, &lg1, &s1;;
|
|
Packit |
67cb25 |
int stat_g2 = gsl_sf_lngamma_sgn_e(a+1.0, &lg2, &s2;;
|
|
Packit |
67cb25 |
double poly_1F1_val = 1.0;
|
|
Packit |
67cb25 |
double poly_1F1_err = 0.0;
|
|
Packit |
67cb25 |
int stat_e;
|
|
Packit |
67cb25 |
int k;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double lnpre_val = (lg1.val - lg2.val) - lnfact.val;
|
|
Packit |
67cb25 |
double lnpre_err = lg1.err + lg2.err + lnfact.err + 2.0 * GSL_DBL_EPSILON * fabs(lnpre_val);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for(k=n-1; k>=0; k--) {
|
|
Packit |
67cb25 |
double t = (-n+k)/(a+1.0+k) * (x/(k+1));
|
|
Packit |
67cb25 |
double r = t + 1.0/poly_1F1_val;
|
|
Packit |
67cb25 |
if(r > 0.9*GSL_DBL_MAX/poly_1F1_val) {
|
|
Packit |
67cb25 |
/* internal error only, don't call the error handler */
|
|
Packit |
67cb25 |
INTERNAL_OVERFLOW_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
/* Collect the Horner terms. */
|
|
Packit |
67cb25 |
poly_1F1_val = 1.0 + t * poly_1F1_val;
|
|
Packit |
67cb25 |
poly_1F1_err += GSL_DBL_EPSILON + fabs(t) * poly_1F1_err;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err,
|
|
Packit |
67cb25 |
poly_1F1_val, poly_1F1_err,
|
|
Packit |
67cb25 |
result);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_4(stat_e, stat_f, stat_g1, stat_g2);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Evaluate the polynomial based on the confluent hypergeometric
|
|
Packit |
67cb25 |
* function in a safe way, with no restriction on the arguments.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* assumes x != 0
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
static
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
laguerre_n_poly_safe(const int n, const double a, const double x, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const double b = a + 1.0;
|
|
Packit |
67cb25 |
const double mx = -x;
|
|
Packit |
67cb25 |
const double tc_sgn = (x < 0.0 ? 1.0 : (GSL_IS_ODD(n) ? -1.0 : 1.0));
|
|
Packit |
67cb25 |
gsl_sf_result tc;
|
|
Packit |
67cb25 |
int stat_tc = gsl_sf_taylorcoeff_e(n, fabs(x), &tc);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(stat_tc == GSL_SUCCESS) {
|
|
Packit |
67cb25 |
double term = tc.val * tc_sgn;
|
|
Packit |
67cb25 |
double sum_val = term;
|
|
Packit |
67cb25 |
double sum_err = tc.err;
|
|
Packit |
67cb25 |
int k;
|
|
Packit |
67cb25 |
for(k=n-1; k>=0; k--) {
|
|
Packit |
67cb25 |
term *= ((b+k)/(n-k))*(k+1.0)/mx;
|
|
Packit |
67cb25 |
sum_val += term;
|
|
Packit |
67cb25 |
sum_err += 4.0 * GSL_DBL_EPSILON * fabs(term);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
result->val = sum_val;
|
|
Packit |
67cb25 |
result->err = sum_err + 2.0 * GSL_DBL_EPSILON * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(stat_tc == GSL_EOVRFLW) {
|
|
Packit |
67cb25 |
result->val = 0.0; /* FIXME: should be Inf */
|
|
Packit |
67cb25 |
result->err = 0.0;
|
|
Packit |
67cb25 |
return stat_tc;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
result->val = 0.0;
|
|
Packit |
67cb25 |
result->err = 0.0;
|
|
Packit |
67cb25 |
return stat_tc;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_laguerre_1_e(const double a, const double x, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* CHECK_POINTER(result) */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
result->val = 1.0 + a - x;
|
|
Packit |
67cb25 |
result->err = 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(a) + fabs(x));
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_laguerre_2_e(const double a, const double x, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* CHECK_POINTER(result) */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(a == -2.0) {
|
|
Packit |
67cb25 |
result->val = 0.5*x*x;
|
|
Packit |
67cb25 |
result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
double c0 = 0.5 * (2.0+a)*(1.0+a);
|
|
Packit |
67cb25 |
double c1 = -(2.0+a);
|
|
Packit |
67cb25 |
double c2 = -0.5/(2.0+a);
|
|
Packit |
67cb25 |
result->val = c0 + c1*x*(1.0 + c2*x);
|
|
Packit |
67cb25 |
result->err = 2.0 * GSL_DBL_EPSILON * (fabs(c0) + 2.0 * fabs(c1*x) * (1.0 + 2.0 * fabs(c2*x)));
|
|
Packit |
67cb25 |
result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_laguerre_3_e(const double a, const double x, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* CHECK_POINTER(result) */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(a == -2.0) {
|
|
Packit |
67cb25 |
double x2_6 = x*x/6.0;
|
|
Packit |
67cb25 |
result->val = x2_6 * (3.0 - x);
|
|
Packit |
67cb25 |
result->err = x2_6 * (3.0 + fabs(x)) * 2.0 * GSL_DBL_EPSILON;
|
|
Packit |
67cb25 |
result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(a == -3.0) {
|
|
Packit |
67cb25 |
result->val = -x*x/6.0;
|
|
Packit |
67cb25 |
result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
double c0 = (3.0+a)*(2.0+a)*(1.0+a) / 6.0;
|
|
Packit |
67cb25 |
double c1 = -c0 * 3.0 / (1.0+a);
|
|
Packit |
67cb25 |
double c2 = -1.0/(2.0+a);
|
|
Packit |
67cb25 |
double c3 = -1.0/(3.0*(3.0+a));
|
|
Packit |
67cb25 |
result->val = c0 + c1*x*(1.0 + c2*x*(1.0 + c3*x));
|
|
Packit |
67cb25 |
result->err = 1.0 + 2.0 * fabs(c3*x);
|
|
Packit |
67cb25 |
result->err = 1.0 + 2.0 * fabs(c2*x) * result->err;
|
|
Packit |
67cb25 |
result->err = 2.0 * GSL_DBL_EPSILON * (fabs(c0) + 2.0 * fabs(c1*x) * result->err);
|
|
Packit |
67cb25 |
result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int gsl_sf_laguerre_n_e(const int n, const double a, const double x,
|
|
Packit |
67cb25 |
gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* CHECK_POINTER(result) */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(n < 0) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(n == 0) {
|
|
Packit |
67cb25 |
result->val = 1.0;
|
|
Packit |
67cb25 |
result->err = 0.0;
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(n == 1) {
|
|
Packit |
67cb25 |
result->val = 1.0 + a - x;
|
|
Packit |
67cb25 |
result->err = 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(a) + fabs(x));
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(x == 0.0) {
|
|
Packit |
67cb25 |
double product = a + 1.0;
|
|
Packit |
67cb25 |
int k;
|
|
Packit |
67cb25 |
for(k=2; k<=n; k++) {
|
|
Packit |
67cb25 |
product *= (a + k)/k;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
result->val = product;
|
|
Packit |
67cb25 |
result->err = 2.0 * (n + 1.0) * GSL_DBL_EPSILON * fabs(product) + GSL_DBL_EPSILON;
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(x < 0.0 && a > -1.0) {
|
|
Packit |
67cb25 |
/* In this case all the terms in the polynomial
|
|
Packit |
67cb25 |
* are of the same sign. Note that this also
|
|
Packit |
67cb25 |
* catches overflows correctly.
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
return laguerre_n_cp(n, a, x, result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(n < 5 || (x > 0.0 && a < -n-1)) {
|
|
Packit |
67cb25 |
/* Either the polynomial will not lose too much accuracy
|
|
Packit |
67cb25 |
* or all the terms are negative. In any case,
|
|
Packit |
67cb25 |
* the error estimate here is good. We try both
|
|
Packit |
67cb25 |
* explicit summation methods, as they have different
|
|
Packit |
67cb25 |
* characteristics. One may underflow/overflow while the
|
|
Packit |
67cb25 |
* other does not.
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
if(laguerre_n_cp(n, a, x, result) == GSL_SUCCESS)
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
else
|
|
Packit |
67cb25 |
return laguerre_n_poly_safe(n, a, x, result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(n > 1.0e+07 && x > 0.0 && a > -1.0 && x < 2.0*(a+1.0)+4.0*n) {
|
|
Packit |
67cb25 |
return laguerre_large_n(n, a, x, result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(a >= 0.0 || (x > 0.0 && a < -n-1)) {
|
|
Packit |
67cb25 |
gsl_sf_result lg2;
|
|
Packit |
67cb25 |
int stat_lg2 = gsl_sf_laguerre_2_e(a, x, &lg2;;
|
|
Packit |
67cb25 |
double Lkm1 = 1.0 + a - x;
|
|
Packit |
67cb25 |
double Lk = lg2.val;
|
|
Packit |
67cb25 |
double Lkp1;
|
|
Packit |
67cb25 |
int k;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for(k=2; k
|
|
Packit |
67cb25 |
Lkp1 = (-(k+a)*Lkm1 + (2.0*k+a+1.0-x)*Lk)/(k+1.0);
|
|
Packit |
67cb25 |
Lkm1 = Lk;
|
|
Packit |
67cb25 |
Lk = Lkp1;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
result->val = Lk;
|
|
Packit |
67cb25 |
result->err = (fabs(lg2.err/lg2.val) + GSL_DBL_EPSILON) * n * fabs(Lk);
|
|
Packit |
67cb25 |
return stat_lg2;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
/* Despair... or magic? */
|
|
Packit |
67cb25 |
return laguerre_n_poly_safe(n, a, x, result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include "eval.h"
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_laguerre_1(double a, double x)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_laguerre_1_e(a, x, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_laguerre_2(double a, double x)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_laguerre_2_e(a, x, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_laguerre_3(double a, double x)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_laguerre_3_e(a, x, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_laguerre_n(int n, double a, double x)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_laguerre_n_e(n, a, x, &result));
|
|
Packit |
67cb25 |
}
|