.. _gr-special:

**gr_special.h** -- special arithmetic and transcendental functions
===============================================================================

Mathematical constants
--------------------------------------------------------------------------------

.. function:: int gr_pi(gr_ptr res, gr_ctx_t ctx)
              int gr_euler(gr_ptr res, gr_ctx_t ctx)
              int gr_catalan(gr_ptr res, gr_ctx_t ctx)
              int gr_khinchin(gr_ptr res, gr_ctx_t ctx)
              int gr_glaisher(gr_ptr res, gr_ctx_t ctx)

    Standard real constants: `\pi`, Euler's constant `\gamma`,
    Catalan's constant, Khinchin's constant, Glaisher's constant.

Elementary functions
--------------------------------------------------------------------------------

.. function:: int gr_exp(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_expm1(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_exp2(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_exp10(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_exp_pi_i(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_log(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_log1p(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_log2(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_log10(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_log_pi_i(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_sin(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_cos(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sin_cos(gr_ptr res1, gr_ptr res2, gr_srcptr x, gr_ctx_t ctx)
              int gr_tan(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_cot(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sec(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_csc(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_sin_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_cos_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sin_cos_pi(gr_ptr res1, gr_ptr res2, gr_srcptr x, gr_ctx_t ctx)
              int gr_tan_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_cot_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sec_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_csc_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_sinc(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sinc_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_sinh(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_cosh(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sinh_cosh(gr_ptr res1, gr_ptr res2, gr_srcptr x, gr_ctx_t ctx)
              int gr_tanh(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_coth(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sech(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_csch(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_asin(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_acos(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_atan(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_atan2(gr_ptr res, gr_srcptr y, gr_srcptr x, gr_ctx_t ctx)
              int gr_acot(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_asec(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_acsc(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_asin_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_acos_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_atan_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_acot_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_asec_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_acsc_pi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_asinh(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_acosh(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_atanh(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_acoth(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_asech(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_acsch(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_lambertw(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_lambertw_fmpz(gr_ptr res, gr_srcptr x, const fmpz_t k, gr_ctx_t ctx)

Factorials and gamma functions
--------------------------------------------------------------------------------

.. function:: int gr_fac(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_fac_ui(gr_ptr res, ulong x, gr_ctx_t ctx)
              int gr_fac_fmpz(gr_ptr res, const fmpz_t x, gr_ctx_t ctx)
              int gr_fac_vec(gr_ptr res, slong len, gr_ctx_t ctx)

    Factorial `x!`. The *vec* version writes the first *len*
    consecutive values `1, 1, 2, 6, \ldots, (len-1)!`
    to the preallocated vector *res*.

.. function:: int gr_rfac(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_rfac_ui(gr_ptr res, ulong x, gr_ctx_t ctx)
              int gr_rfac_fmpz(gr_ptr res, const fmpz_t x, gr_ctx_t ctx)
              int gr_rfac_vec(gr_ptr res, slong len, gr_ctx_t ctx)

    Reciprocal factorial. The *vec* version writes the first *len*
    consecutive values `1, 1, 1/2, 1/6, \ldots, 1/(len-1)!`
    to the preallocated vector *res*.

.. function:: int gr_bin(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_bin_ui(gr_ptr res, gr_srcptr x, ulong y, gr_ctx_t ctx)
              int gr_bin_uiui(gr_ptr res, ulong x, ulong y, gr_ctx_t ctx)
              int gr_bin_vec(gr_ptr res, gr_srcptr x, slong len, gr_ctx_t ctx)
              int gr_bin_ui_vec(gr_ptr res, ulong x, slong len, gr_ctx_t ctx)

    Binomial coefficient `{x \choose y}`. The *vec* versions write the
    first *len* consecutive values `{x \choose 0}, {x \choose 1}, \ldots, {x \choose len-1}`
    to the preallocated vector *res*.
    For constructing a two-dimensional array of binomial
    coefficients (Pascal's triangle), it is more efficient to
    call :func:`gr_mat_pascal` than to call these functions repeatedly.

.. function:: int gr_rising(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_rising_ui(gr_ptr res, gr_srcptr x, ulong y, gr_ctx_t ctx)
              int gr_falling(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_falling_ui(gr_ptr res, gr_srcptr x, ulong y, gr_ctx_t ctx)

    Rising and falling factorials `x (x+1) \cdots (x+y-1)`
    and `x (x-1) \cdots (x-y+1)`, or their generalizations
    to non-integer `y` via the gamma function.

.. function:: int gr_gamma(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_gamma_fmpz(gr_ptr res, const fmpz_t x, gr_ctx_t ctx)
              int gr_gamma_fmpq(gr_ptr res, const fmpq_t x, gr_ctx_t ctx)
              int gr_rgamma(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_lgamma(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_digamma(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

    Gamma function `\Gamma(x)`, its reciprocal `1 / \Gamma(x)`,
    the log-gamma function `\log \Gamma(x)`, and the digamma function
    `\psi(x)`.

.. function:: int gr_barnes_g(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_log_barnes_g(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

    Barnes G-function.

.. function:: int gr_beta(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)

    Beta function `B(x,y)`.

.. function:: int gr_doublefac(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_doublefac_ui(gr_ptr res, ulong x, gr_ctx_t ctx)

    Double factorial `x!!`.

.. function:: int gr_harmonic(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_harmonic_ui(gr_ptr res, ulong x, gr_ctx_t ctx)

    Harmonic number `H_x`.

Combinatorial numbers
--------------------------------------------------------------------------------

The *vec* version of functions for number sequences `c_n` write the *len*
consecutive values `c_0, c_1, \ldots, c_{len-1}` to the preallocated
vector *res*.

.. function:: int gr_bernoulli_ui(gr_ptr res, ulong n, gr_ctx_t ctx)
              int gr_bernoulli_fmpz(gr_ptr res, const fmpz_t n, gr_ctx_t ctx)
              int gr_bernoulli_vec(gr_ptr res, slong len, gr_ctx_t ctx)

    Bernoulli numbers `B_n`.

.. function:: int gr_eulernum_ui(gr_ptr res, ulong x, gr_ctx_t ctx)
              int gr_eulernum_fmpz(gr_ptr res, const fmpz_t x, gr_ctx_t ctx)
              int gr_eulernum_vec(gr_ptr res, slong len, gr_ctx_t ctx)

    Euler numbers `E_n`.

.. function:: int gr_fib_ui(gr_ptr res, ulong n, gr_ctx_t ctx)
              int gr_fib_fmpz(gr_ptr res, const fmpz_t n, gr_ctx_t ctx)
              int gr_fib_vec(gr_ptr res, slong len, gr_ctx_t ctx)

    Fibonacci numbers `F_n`.

.. function:: int gr_stirling_s1u_uiui(gr_ptr res, ulong x, ulong y, gr_ctx_t ctx)
              int gr_stirling_s1_uiui(gr_ptr res, ulong x, ulong y, gr_ctx_t ctx)
              int gr_stirling_s2_uiui(gr_ptr res, ulong x, ulong y, gr_ctx_t ctx)
              int gr_stirling_s1u_ui_vec(gr_ptr res, ulong x, slong len, gr_ctx_t ctx)
              int gr_stirling_s1_ui_vec(gr_ptr res, ulong x, slong len, gr_ctx_t ctx)
              int gr_stirling_s2_ui_vec(gr_ptr res, ulong x, slong len, gr_ctx_t ctx)

    Stirling numbers `S(x,y)`: unsigned of the first kind,
    signed of the first kind, and second kind. The *vec* versions
    write the *len* consecutive values `S(x,0), S(x,1), \ldots, S(x, len-1)`
    to the preallocated vector *res*.
    For constructing a two-dimensional array of Stirling numbers,
    it is more efficient to
    call :func:`gr_mat_stirling` than to call these functions repeatedly.

.. function:: int gr_bellnum_ui(gr_ptr res, ulong x, gr_ctx_t ctx)
              int gr_bellnum_fmpz(gr_ptr res, const fmpz_t x, gr_ctx_t ctx)
              int gr_bellnum_vec(gr_ptr res, slong len, gr_ctx_t ctx)

    Bell numbers `B_n`.

.. function:: int gr_partitions_ui(gr_ptr res, ulong x, gr_ctx_t ctx)
              int gr_partitions_fmpz(gr_ptr res, const fmpz_t x, gr_ctx_t ctx)
              int gr_partitions_vec(gr_ptr res, slong len, gr_ctx_t ctx)

    Partition numbers `p(n)`.

Error function and exponential integrals
--------------------------------------------------------------------------------

.. function:: int gr_erf(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_erfc(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_erfcx(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_erfi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_erfinv(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_erfcinv(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_fresnel_s(gr_ptr res, gr_srcptr x, int normalized, gr_ctx_t ctx)
              int gr_fresnel_c(gr_ptr res, gr_srcptr x, int normalized, gr_ctx_t ctx)
              int gr_fresnel(gr_ptr res1, gr_ptr res2, gr_srcptr x, int normalized, gr_ctx_t ctx)

.. function:: int gr_gamma_upper(gr_ptr res, gr_srcptr x, gr_srcptr y, int regularized, gr_ctx_t ctx)
              int gr_gamma_lower(gr_ptr res, gr_srcptr x, gr_srcptr y, int regularized, gr_ctx_t ctx)
              int gr_beta_lower(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, int regularized, gr_ctx_t ctx)

.. function:: int gr_exp_integral(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_exp_integral_ei(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sin_integral(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_cos_integral(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_sinh_integral(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_cosh_integral(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_log_integral(gr_ptr res, gr_srcptr x, int offset, gr_ctx_t ctx)
              int gr_dilog(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

Orthogonal polynomials
--------------------------------------------------------------------------------

.. function:: int gr_chebyshev_t_fmpz(gr_ptr res, const fmpz_t n, gr_srcptr x, gr_ctx_t ctx)
              int gr_chebyshev_t(gr_ptr res, gr_srcptr n, gr_srcptr x, gr_ctx_t ctx)
              int gr_chebyshev_u_fmpz(gr_ptr res, const fmpz_t n, gr_srcptr x, gr_ctx_t ctx)
              int gr_chebyshev_u(gr_ptr res, gr_srcptr n, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_jacobi_p(gr_ptr res, gr_srcptr n, gr_srcptr a, gr_srcptr b, gr_srcptr z, gr_ctx_t ctx)
              int gr_gegenbauer_c(gr_ptr res, gr_srcptr n, gr_srcptr m, gr_srcptr z, gr_ctx_t ctx)
              int gr_laguerre_l(gr_ptr res, gr_srcptr n, gr_srcptr m, gr_srcptr z, gr_ctx_t ctx)
              int gr_hermite_h(gr_ptr res, gr_srcptr n, gr_srcptr z, gr_ctx_t ctx)
              int gr_legendre_p(gr_ptr res, gr_srcptr n, gr_srcptr m, gr_srcptr z, int type, gr_ctx_t ctx)
              int gr_legendre_q(gr_ptr res, gr_srcptr n, gr_srcptr m, gr_srcptr z, int type, gr_ctx_t ctx)
              int gr_spherical_y_si(gr_ptr res, slong n, slong m, gr_srcptr theta, gr_srcptr phi, gr_ctx_t ctx)
              int gr_legendre_p_root_ui(gr_ptr root, gr_ptr weight, ulong n, ulong k, gr_ctx_t ctx)

Bessel, Airy and Coulomb functions
--------------------------------------------------------------------------------

.. function:: int gr_bessel_j(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_bessel_y(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_bessel_i(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_bessel_k(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_bessel_j_y(gr_ptr res1, gr_ptr res2, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_bessel_i_scaled(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_bessel_k_scaled(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)

.. function:: int gr_airy(gr_ptr res1, gr_ptr res2, gr_ptr res3, gr_ptr res4, gr_srcptr x, gr_ctx_t ctx)
              int gr_airy_ai(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_airy_bi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_airy_ai_prime(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_airy_bi_prime(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_airy_ai_zero(gr_ptr res, const fmpz_t n, gr_ctx_t ctx)
              int gr_airy_bi_zero(gr_ptr res, const fmpz_t n, gr_ctx_t ctx)
              int gr_airy_ai_prime_zero(gr_ptr res, const fmpz_t n, gr_ctx_t ctx)
              int gr_airy_bi_prime_zero(gr_ptr res, const fmpz_t n, gr_ctx_t ctx)

.. function:: int gr_coulomb(gr_ptr res1, gr_ptr res2, gr_ptr res3, gr_ptr res4, gr_srcptr x, gr_srcptr y, gr_srcptr z, gr_ctx_t ctx)
              int gr_coulomb_f(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, gr_ctx_t ctx)
              int gr_coulomb_g(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, gr_ctx_t ctx)
              int gr_coulomb_hpos(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, gr_ctx_t ctx)
              int gr_coulomb_hneg(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, gr_ctx_t ctx)

Hypergeometric functions
--------------------------------------------------------------------------------

.. function:: int gr_hypgeom_0f1(gr_ptr res, gr_srcptr a, gr_srcptr z, int flags, gr_ctx_t ctx)
              int gr_hypgeom_1f1(gr_ptr res, gr_srcptr a, gr_srcptr b, gr_srcptr z, int flags, gr_ctx_t ctx)
              int gr_hypgeom_u(gr_ptr res, gr_srcptr a, gr_srcptr b, gr_srcptr z, int flags, gr_ctx_t ctx)
              int gr_hypgeom_2f1(gr_ptr res, gr_srcptr a, gr_srcptr b, gr_srcptr c, gr_srcptr z, int flags, gr_ctx_t ctx)
              int gr_hypgeom_pfq(gr_ptr res, const gr_vec_t a, const gr_vec_t b, gr_srcptr z, int flags, gr_ctx_t ctx)

Riemann zeta, polylogarithms and Dirichlet L-functions
--------------------------------------------------------------------------------

.. function:: int gr_zeta(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_zeta_ui(gr_ptr res, ulong x, gr_ctx_t ctx)
              int gr_hurwitz_zeta(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_polygamma(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_polylog(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)
              int gr_lerch_phi(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, gr_ctx_t ctx)
              int gr_stieltjes(gr_ptr res, const fmpz_t x, gr_srcptr y, gr_ctx_t ctx)

.. function:: int gr_dirichlet_eta(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_riemann_xi(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_zeta_zero(gr_ptr res, const fmpz_t n, gr_ctx_t ctx)
              int gr_zeta_zero_vec(gr_ptr res, const fmpz_t n, slong len, gr_ctx_t ctx)
              int gr_zeta_nzeros(gr_ptr res, gr_srcptr t, gr_ctx_t ctx)

.. function:: int gr_dirichlet_chi_fmpz(gr_ptr res, const dirichlet_group_t G, const dirichlet_char_t chi, const fmpz_t n, gr_ctx_t ctx)
              int gr_dirichlet_chi_vec(gr_ptr res, const dirichlet_group_t G, const dirichlet_char_t chi, slong len, gr_ctx_t ctx)
              int gr_dirichlet_l(gr_ptr res, const dirichlet_group_t G, const dirichlet_char_t chi, gr_srcptr s, gr_ctx_t ctx)
              int gr_dirichlet_l_all(gr_vec_t res, const dirichlet_group_t G, gr_srcptr s, gr_ctx_t ctx)
              int gr_dirichlet_hardy_theta(gr_ptr res, const dirichlet_group_t G, const dirichlet_char_t chi, gr_srcptr t, gr_ctx_t ctx)
              int gr_dirichlet_hardy_z(gr_ptr res, const dirichlet_group_t G, const dirichlet_char_t chi, gr_srcptr t, gr_ctx_t ctx)

Elliptic integrals
--------------------------------------------------------------------------------

.. function:: int gr_agm1(gr_ptr res, gr_srcptr x, gr_ctx_t ctx)
              int gr_agm(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_ctx_t ctx)

.. function:: int gr_elliptic_k(gr_ptr res, gr_srcptr m, gr_ctx_t ctx)
              int gr_elliptic_e(gr_ptr res, gr_srcptr m, gr_ctx_t ctx)
              int gr_elliptic_pi(gr_ptr res, gr_srcptr n, gr_srcptr m, gr_ctx_t ctx)
              int gr_elliptic_f(gr_ptr res, gr_srcptr phi, gr_srcptr m, int pi, gr_ctx_t ctx)
              int gr_elliptic_e_inc(gr_ptr res, gr_srcptr phi, gr_srcptr m, int pi, gr_ctx_t ctx)
              int gr_elliptic_pi_inc(gr_ptr res, gr_srcptr n, gr_srcptr phi, gr_srcptr m, int pi, gr_ctx_t ctx)

.. function:: int gr_carlson_rc(gr_ptr res, gr_srcptr x, gr_srcptr y, int flags, gr_ctx_t ctx)
              int gr_carlson_rf(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, int flags, gr_ctx_t ctx)
              int gr_carlson_rd(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, int flags, gr_ctx_t ctx)
              int gr_carlson_rg(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, int flags, gr_ctx_t ctx)
              int gr_carlson_rj(gr_ptr res, gr_srcptr x, gr_srcptr y, gr_srcptr z, gr_srcptr w, int flags, gr_ctx_t ctx)

Elliptic, modular and theta functions
--------------------------------------------------------------------------------

.. function:: int gr_jacobi_theta(gr_ptr res1, gr_ptr res2, gr_ptr res3, gr_ptr res4, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)
              int gr_jacobi_theta_1(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)
              int gr_jacobi_theta_2(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)
              int gr_jacobi_theta_3(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)
              int gr_jacobi_theta_4(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)

.. function:: int gr_dedekind_eta(gr_ptr res, gr_srcptr tau, gr_ctx_t ctx)
              int gr_dedekind_eta_q(gr_ptr res, gr_srcptr tau, gr_ctx_t ctx)

.. function:: int gr_modular_j(gr_ptr res, gr_srcptr tau, gr_ctx_t ctx)
              int gr_modular_lambda(gr_ptr res, gr_srcptr tau, gr_ctx_t ctx)
              int gr_modular_delta(gr_ptr res, gr_srcptr tau, gr_ctx_t ctx)

.. function:: int gr_hilbert_class_poly(gr_ptr res, slong D, gr_srcptr x, gr_ctx_t ctx)

.. function:: int gr_eisenstein_e(gr_ptr res, ulong n, gr_srcptr tau, gr_ctx_t ctx)
              int gr_eisenstein_g(gr_ptr res, ulong n, gr_srcptr tau, gr_ctx_t ctx)
              int gr_eisenstein_g_vec(gr_ptr res, gr_srcptr tau, slong len, gr_ctx_t ctx)

.. function:: int gr_elliptic_invariants(gr_ptr res1, gr_ptr res2, gr_srcptr tau, gr_ctx_t ctx)
              int gr_elliptic_roots(gr_ptr res1, gr_ptr res2, gr_ptr res3, gr_srcptr tau, gr_ctx_t ctx)

.. function:: int gr_weierstrass_p(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)
              int gr_weierstrass_p_prime(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)
              int gr_weierstrass_p_inv(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)
              int gr_weierstrass_zeta(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)
              int gr_weierstrass_sigma(gr_ptr res, gr_srcptr z, gr_srcptr tau, gr_ctx_t ctx)

.. raw:: latex

    \newpage

