From 636ca0be397affaf28a9e4192adaf88d27a205a9 Mon Sep 17 00:00:00 2001 From: fredrik Date: Thu, 23 Sep 2021 19:08:48 +0200 Subject: [PATCH] wrap more functions --- arb_fpwrap.h | 63 ++++++++++++++++++++++ arb_fpwrap/fpwrap.c | 107 +++++++++++++++++++++++++++++++++++--- doc/source/arb_fpwrap.rst | 72 +++++++++++++++++++++++++ 3 files changed, 235 insertions(+), 7 deletions(-) diff --git a/arb_fpwrap.h b/arb_fpwrap.h index f40fffed..5e267835 100644 --- a/arb_fpwrap.h +++ b/arb_fpwrap.h @@ -149,6 +149,69 @@ int arb_fpwrap_cdouble_polygamma(complex_double * res, complex_double s, complex int arb_fpwrap_double_polylog(double * res, double s, double z, int flags); int arb_fpwrap_cdouble_polylog(complex_double * res, complex_double s, complex_double z, int flags); +int arb_fpwrap_double_erf(double * res, double x, int flags); +int arb_fpwrap_cdouble_erf(complex_double * res, complex_double x, int flags); + +int arb_fpwrap_double_erfc(double * res, double x, int flags); +int arb_fpwrap_cdouble_erfc(complex_double * res, complex_double x, int flags); + +int arb_fpwrap_double_erfi(double * res, double x, int flags); +int arb_fpwrap_cdouble_erfi(complex_double * res, complex_double x, int flags); + +int arb_fpwrap_double_bessel_j(double * res, double nu, double x, int flags); +int arb_fpwrap_cdouble_bessel_j(complex_double * res, complex_double nu, complex_double x, int flags); + +int arb_fpwrap_double_bessel_y(double * res, double nu, double x, int flags); +int arb_fpwrap_cdouble_bessel_y(complex_double * res, complex_double nu, complex_double x, int flags); + +int arb_fpwrap_double_bessel_i(double * res, double nu, double x, int flags); +int arb_fpwrap_cdouble_bessel_i(complex_double * res, complex_double nu, complex_double x, int flags); + +int arb_fpwrap_double_bessel_k(double * res, double nu, double x, int flags); +int arb_fpwrap_cdouble_bessel_k(complex_double * res, complex_double nu, complex_double x, int flags); + +int arb_fpwrap_double_bessel_k_scaled(double * res, double nu, double x, int flags); +int arb_fpwrap_cdouble_bessel_k_scaled(complex_double * res, complex_double nu, complex_double x, int flags); + +int arb_fpwrap_double_airy_ai(double * res, double x, int flags); +int arb_fpwrap_cdouble_airy_ai(complex_double * res, complex_double x, int flags); + +int arb_fpwrap_double_airy_ai_prime(double * res, double x, int flags); +int arb_fpwrap_cdouble_airy_ai_prime(complex_double * res, complex_double x, int flags); + +int arb_fpwrap_double_airy_bi(double * res, double x, int flags); +int arb_fpwrap_cdouble_airy_bi(complex_double * res, complex_double x, int flags); + +int arb_fpwrap_double_airy_bi_prime(double * res, double x, int flags); +int arb_fpwrap_cdouble_airy_bi_prime(complex_double * res, complex_double x, int flags); + +int arb_fpwrap_double_coulomb_f(double * res, double l, double eta, double x, int flags); +int arb_fpwrap_cdouble_coulomb_f(complex_double * res, complex_double l, complex_double eta, complex_double x, int flags); + +int arb_fpwrap_double_coulomb_g(double * res, double l, double eta, double x, int flags); +int arb_fpwrap_cdouble_coulomb_g(complex_double * res, complex_double l, complex_double eta, complex_double x, int flags); + +int arb_fpwrap_cdouble_coulomb_hpos(complex_double * res, complex_double l, complex_double eta, complex_double x, int flags); +int arb_fpwrap_cdouble_coulomb_hneg(complex_double * res, complex_double l, complex_double eta, complex_double x, int flags); + +int arb_fpwrap_double_chebyshev_t(double * res, double n, double x, int flags); +int arb_fpwrap_cdouble_chebyshev_t(complex_double * res, complex_double n, complex_double x, int flags); + +int arb_fpwrap_double_chebyshev_u(double * res, double n, double x, int flags); +int arb_fpwrap_cdouble_chebyshev_u(complex_double * res, complex_double n, complex_double x, int flags); + +int arb_fpwrap_double_jacobi_p(double * res, double n, double a, double b, double x, int flags); +int arb_fpwrap_cdouble_jacobi_p(complex_double * res, complex_double n, complex_double a, complex_double b, complex_double x, int flags); + +int arb_fpwrap_double_gegenbauer_c(double * res, double n, double m, double x, int flags); +int arb_fpwrap_cdouble_gegenbauer_c(complex_double * res, complex_double n, complex_double m, complex_double x, int flags); + +int arb_fpwrap_double_laguerre_l(double * res, double n, double m, double x, int flags); +int arb_fpwrap_cdouble_laguerre_l(complex_double * res, complex_double n, complex_double m, complex_double x, int flags); + +int arb_fpwrap_double_hermite_h(double * res, double n, double x, int flags); +int arb_fpwrap_cdouble_hermite_h(complex_double * res, complex_double n, complex_double x, int flags); + int arb_fpwrap_double_agm1(double * res, double x, int flags); int arb_fpwrap_cdouble_agm1(complex_double * res, complex_double x, int flags); diff --git a/arb_fpwrap/fpwrap.c b/arb_fpwrap/fpwrap.c index b7cf0a5e..e4c0038f 100644 --- a/arb_fpwrap/fpwrap.c +++ b/arb_fpwrap/fpwrap.c @@ -643,9 +643,6 @@ DEF_CDOUBLE_FUN_1(acosh, acb_acosh) DEF_DOUBLE_FUN_1(atanh, arb_atanh) DEF_CDOUBLE_FUN_1(atanh, acb_atanh) -/* todo: lambertw (with branches) */ - - DEF_DOUBLE_FUN_2(rising, arb_rising) DEF_CDOUBLE_FUN_2(rising, acb_rising) @@ -667,7 +664,7 @@ DEF_CDOUBLE_FUN_1(zeta, acb_zeta) DEF_DOUBLE_FUN_2(hurwitz_zeta, arb_hurwitz_zeta) DEF_CDOUBLE_FUN_2(hurwitz_zeta, acb_hurwitz_zeta) -void +static void _arb_polygamma(arb_t res, const arb_t s, const arb_t z, slong prec) { acb_t t, u, v; @@ -686,7 +683,7 @@ _arb_polygamma(arb_t res, const arb_t s, const arb_t z, slong prec) acb_clear(v); } -void +static void _arb_barnes_g(arb_t res, const arb_t x, slong prec) { acb_t t, u; @@ -702,7 +699,7 @@ _arb_barnes_g(arb_t res, const arb_t x, slong prec) acb_clear(u); } -void +static void _arb_log_barnes_g(arb_t res, const arb_t x, slong prec) { acb_t t, u; @@ -730,7 +727,11 @@ DEF_CDOUBLE_FUN_2(polygamma, acb_polygamma) DEF_DOUBLE_FUN_2(polylog, arb_polylog) DEF_CDOUBLE_FUN_2(polylog, acb_polylog) -void +DEF_DOUBLE_FUN_1(dilog, arb_hypgeom_dilog) +DEF_CDOUBLE_FUN_1(dilog, acb_hypgeom_dilog) + + +static void _arb_agm1(arb_t res, const arb_t x, slong prec) { arb_t t; @@ -746,3 +747,95 @@ DEF_CDOUBLE_FUN_1(agm1, acb_agm1) DEF_DOUBLE_FUN_2(agm, arb_agm) DEF_CDOUBLE_FUN_2(agm, acb_agm) + +DEF_DOUBLE_FUN_1(erf, arb_hypgeom_erf) +DEF_CDOUBLE_FUN_1(erf, acb_hypgeom_erf) + +DEF_DOUBLE_FUN_1(erfc, arb_hypgeom_erfc) +DEF_CDOUBLE_FUN_1(erfc, acb_hypgeom_erfc) + +DEF_DOUBLE_FUN_1(erfi, arb_hypgeom_erfi) +DEF_CDOUBLE_FUN_1(erfi, acb_hypgeom_erfi) + +DEF_DOUBLE_FUN_2(bessel_j, arb_hypgeom_bessel_j) +DEF_CDOUBLE_FUN_2(bessel_j, acb_hypgeom_bessel_j) + +DEF_DOUBLE_FUN_2(bessel_y, arb_hypgeom_bessel_y) +DEF_CDOUBLE_FUN_2(bessel_y, acb_hypgeom_bessel_y) + +DEF_DOUBLE_FUN_2(bessel_i, arb_hypgeom_bessel_i) +DEF_CDOUBLE_FUN_2(bessel_i, acb_hypgeom_bessel_i) + +DEF_DOUBLE_FUN_2(bessel_k, arb_hypgeom_bessel_k) +DEF_CDOUBLE_FUN_2(bessel_k, acb_hypgeom_bessel_k) + +DEF_DOUBLE_FUN_2(bessel_k_scaled, arb_hypgeom_bessel_k_scaled) +DEF_CDOUBLE_FUN_2(bessel_k_scaled, acb_hypgeom_bessel_k_scaled) + +static void _arb_hypgeom_airy_ai(arb_t res, const arb_t x, slong prec) { arb_hypgeom_airy(res, NULL, NULL, NULL, x, prec); } +static void _arb_hypgeom_airy_ai_prime(arb_t res, const arb_t x, slong prec) { arb_hypgeom_airy(NULL, res, NULL, NULL, x, prec); } +static void _arb_hypgeom_airy_bi(arb_t res, const arb_t x, slong prec) { arb_hypgeom_airy(NULL, NULL, res, NULL, x, prec); } +static void _arb_hypgeom_airy_bi_prime(arb_t res, const arb_t x, slong prec) { arb_hypgeom_airy(NULL, NULL, NULL, res, x, prec); } + +static void _acb_hypgeom_airy_ai(acb_t res, const acb_t x, slong prec) { acb_hypgeom_airy(res, NULL, NULL, NULL, x, prec); } +static void _acb_hypgeom_airy_ai_prime(acb_t res, const acb_t x, slong prec) { acb_hypgeom_airy(NULL, res, NULL, NULL, x, prec); } +static void _acb_hypgeom_airy_bi(acb_t res, const acb_t x, slong prec) { acb_hypgeom_airy(NULL, NULL, res, NULL, x, prec); } +static void _acb_hypgeom_airy_bi_prime(acb_t res, const acb_t x, slong prec) { acb_hypgeom_airy(NULL, NULL, NULL, res, x, prec); } + +DEF_DOUBLE_FUN_1(airy_ai, _arb_hypgeom_airy_ai) +DEF_CDOUBLE_FUN_1(airy_ai, _acb_hypgeom_airy_ai) + +DEF_DOUBLE_FUN_1(airy_ai_prime, _arb_hypgeom_airy_ai_prime) +DEF_CDOUBLE_FUN_1(airy_ai_prime, _acb_hypgeom_airy_ai_prime) + +DEF_DOUBLE_FUN_1(airy_bi, _arb_hypgeom_airy_bi) +DEF_CDOUBLE_FUN_1(airy_bi, _acb_hypgeom_airy_bi) + +DEF_DOUBLE_FUN_1(airy_bi_prime, _arb_hypgeom_airy_bi_prime) +DEF_CDOUBLE_FUN_1(airy_bi_prime, _acb_hypgeom_airy_bi_prime) + +static void _arb_hypgeom_coulomb_f(arb_t res, const arb_t l, const arb_t eta, const arb_t z, slong prec) { arb_hypgeom_coulomb(res, NULL, l, eta, z, prec); } +static void _arb_hypgeom_coulomb_g(arb_t res, const arb_t l, const arb_t eta, const arb_t z, slong prec) { arb_hypgeom_coulomb(NULL, res, l, eta, z, prec); } + +static void _acb_hypgeom_coulomb_f(acb_t res, const acb_t l, const acb_t eta, const acb_t z, slong prec) { acb_hypgeom_coulomb(res, NULL, NULL, NULL, l, eta, z, prec); } +static void _acb_hypgeom_coulomb_g(acb_t res, const acb_t l, const acb_t eta, const acb_t z, slong prec) { acb_hypgeom_coulomb(NULL, res, NULL, NULL, l, eta, z, prec); } +static void _acb_hypgeom_coulomb_hpos(acb_t res, const acb_t l, const acb_t eta, const acb_t z, slong prec) { acb_hypgeom_coulomb(NULL, NULL, res, NULL, l, eta, z, prec); } +static void _acb_hypgeom_coulomb_hneg(acb_t res, const acb_t l, const acb_t eta, const acb_t z, slong prec) { acb_hypgeom_coulomb(NULL, NULL, NULL, res, l, eta, z, prec); } + +DEF_DOUBLE_FUN_3(coulomb_f, _arb_hypgeom_coulomb_f) +DEF_CDOUBLE_FUN_3(coulomb_f, _acb_hypgeom_coulomb_f) + +DEF_DOUBLE_FUN_3(coulomb_g, _arb_hypgeom_coulomb_g) +DEF_CDOUBLE_FUN_3(coulomb_g, _acb_hypgeom_coulomb_g) + +DEF_CDOUBLE_FUN_3(coulomb_hpos, _acb_hypgeom_coulomb_hpos) +DEF_CDOUBLE_FUN_3(coulomb_hneg, _acb_hypgeom_coulomb_hneg) + +DEF_DOUBLE_FUN_2(chebyshev_t, arb_hypgeom_chebyshev_t) +DEF_CDOUBLE_FUN_2(chebyshev_t, acb_hypgeom_chebyshev_t) + +DEF_DOUBLE_FUN_2(chebyshev_u, arb_hypgeom_chebyshev_u) +DEF_CDOUBLE_FUN_2(chebyshev_u, acb_hypgeom_chebyshev_u) + +DEF_DOUBLE_FUN_4(jacobi_p, arb_hypgeom_jacobi_p) +DEF_CDOUBLE_FUN_4(jacobi_p, acb_hypgeom_jacobi_p) + +DEF_DOUBLE_FUN_3(gegenbauer_c, arb_hypgeom_gegenbauer_c) +DEF_CDOUBLE_FUN_3(gegenbauer_c, acb_hypgeom_gegenbauer_c) + +DEF_DOUBLE_FUN_3(laguerre_l, arb_hypgeom_laguerre_l) +DEF_CDOUBLE_FUN_3(laguerre_l, acb_hypgeom_laguerre_l) + +DEF_DOUBLE_FUN_2(hermite_h, arb_hypgeom_hermite_h) +DEF_CDOUBLE_FUN_2(hermite_h, acb_hypgeom_hermite_h) + + + +/* todo: lambertw (with branches) */ +/* todo: fresnel (with flags) */ +/* todo: functions with multiple outputs */ +/* todo: incomplete gamma, exp integrals... */ +/* legendre_p, legendre_q, +roots, spherharm */ +/* todo: pfqs */ + + diff --git a/doc/source/arb_fpwrap.rst b/doc/source/arb_fpwrap.rst index feefc5fb..0032ea2e 100644 --- a/doc/source/arb_fpwrap.rst +++ b/doc/source/arb_fpwrap.rst @@ -253,6 +253,78 @@ Gamma, zeta and related functions Polylogarithm. +Error functions and exponential integrals +............................................................................... + +.. function:: int arb_fpwrap_double_erf(double * res, double x, int flags) + int arb_fpwrap_cdouble_erf(complex_double * res, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_erfc(double * res, double x, int flags) + int arb_fpwrap_cdouble_erfc(complex_double * res, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_erfi(double * res, double x, int flags) + int arb_fpwrap_cdouble_erfi(complex_double * res, complex_double x, int flags) + +Bessel, Airy and Coulomb functions +............................................................................... + +.. function:: int arb_fpwrap_double_bessel_j(double * res, double nu, double x, int flags) + int arb_fpwrap_cdouble_bessel_j(complex_double * res, complex_double nu, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_bessel_y(double * res, double nu, double x, int flags) + int arb_fpwrap_cdouble_bessel_y(complex_double * res, complex_double nu, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_bessel_i(double * res, double nu, double x, int flags) + int arb_fpwrap_cdouble_bessel_i(complex_double * res, complex_double nu, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_bessel_k(double * res, double nu, double x, int flags) + int arb_fpwrap_cdouble_bessel_k(complex_double * res, complex_double nu, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_bessel_k_scaled(double * res, double nu, double x, int flags) + int arb_fpwrap_cdouble_bessel_k_scaled(complex_double * res, complex_double nu, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_airy_ai(double * res, double x, int flags) + int arb_fpwrap_cdouble_airy_ai(complex_double * res, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_airy_ai_prime(double * res, double x, int flags) + int arb_fpwrap_cdouble_airy_ai_prime(complex_double * res, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_airy_bi(double * res, double x, int flags) + int arb_fpwrap_cdouble_airy_bi(complex_double * res, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_airy_bi_prime(double * res, double x, int flags) + int arb_fpwrap_cdouble_airy_bi_prime(complex_double * res, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_coulomb_f(double * res, double l, double eta, double x, int flags) + int arb_fpwrap_cdouble_coulomb_f(complex_double * res, complex_double l, complex_double eta, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_coulomb_g(double * res, double l, double eta, double x, int flags) + int arb_fpwrap_cdouble_coulomb_g(complex_double * res, complex_double l, complex_double eta, complex_double x, int flags) + +.. function:: int arb_fpwrap_cdouble_coulomb_hpos(complex_double * res, complex_double l, complex_double eta, complex_double x, int flags) + int arb_fpwrap_cdouble_coulomb_hneg(complex_double * res, complex_double l, complex_double eta, complex_double x, int flags) + +Orthogonal polynomials +............................................................................... + +.. function:: int arb_fpwrap_double_chebyshev_t(double * res, double n, double x, int flags) + int arb_fpwrap_cdouble_chebyshev_t(complex_double * res, complex_double n, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_chebyshev_u(double * res, double n, double x, int flags) + int arb_fpwrap_cdouble_chebyshev_u(complex_double * res, complex_double n, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_jacobi_p(double * res, double n, double a, double b, double x, int flags) + int arb_fpwrap_cdouble_jacobi_p(complex_double * res, complex_double n, complex_double a, complex_double b, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_gegenbauer_c(double * res, double n, double m, double x, int flags) + int arb_fpwrap_cdouble_gegenbauer_c(complex_double * res, complex_double n, complex_double m, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_laguerre_l(double * res, double n, double m, double x, int flags) + int arb_fpwrap_cdouble_laguerre_l(complex_double * res, complex_double n, complex_double m, complex_double x, int flags) + +.. function:: int arb_fpwrap_double_hermite_h(double * res, double n, double x, int flags) + int arb_fpwrap_cdouble_hermite_h(complex_double * res, complex_double n, complex_double x, int flags) + Elliptic integrals and elliptic functions ...............................................................................