diff --git a/arb/bin.c b/arb/bin.c index dc5d0cdb3..000b21e85 100644 --- a/arb/bin.c +++ b/arb/bin.c @@ -1,5 +1,6 @@ /* Copyright (C) 2013 Fredrik Johansson + Copyright (C) 2021 Albin Ahlbäck This file is part of Arb. @@ -10,6 +11,7 @@ */ #include "arb.h" +#include "flint/fmpz.h" void arb_bin_ui(arb_t x, const arb_t n, ulong k, slong prec) @@ -39,13 +41,30 @@ arb_bin_ui(arb_t x, const arb_t n, ulong k, slong prec) } } +static +void +_arb_bin_uiui_small(arb_t x, ulong n, ulong k, slong prec) +{ + fmpz_t b; + fmpz_init(b); + fmpz_bin_uiui(b, n, k); + arb_set_round_fmpz(x, b, prec); + fmpz_clear(b); +} + void arb_bin_uiui(arb_t x, ulong n, ulong k, slong prec) { arb_t t; - arb_init(t); - arb_set_ui(t, n); - arb_bin_ui(x, t, k, prec); - arb_clear(t); + + if (n < 3000) + _arb_bin_uiui_small(x, n, k, prec); + else + { + arb_init(t); + arb_set_ui(t, n); + arb_bin_ui(x, t, k, prec); + arb_clear(t); + } } diff --git a/doc/source/arb.rst b/doc/source/arb.rst index 039882bf9..9a4e09a34 100644 --- a/doc/source/arb.rst +++ b/doc/source/arb.rst @@ -1348,11 +1348,15 @@ Gamma function and factorials .. function:: void arb_bin_ui(arb_t z, const arb_t n, ulong k, slong prec) -.. function:: void arb_bin_uiui(arb_t z, ulong n, ulong k, slong prec) - Computes the binomial coefficient `z = {n \choose k}`, via the rising factorial as `{n \choose k} = (n-k+1)_k / k!`. +.. function:: void arb_bin_uiui(arb_t z, ulong n, ulong k, slong prec) + + Computes the binomial coefficient `z = {n \choose k}`. If `n` is small, + it is computed via Flint's implementation `fmpz_bin_uiui`. If `n` is big, + it is computed via rising factorial as `{n \choose k} = (n-k+1)_k / k!`. + .. function:: void arb_gamma(arb_t z, const arb_t x, slong prec) void arb_gamma_fmpq(arb_t z, const fmpq_t x, slong prec) void arb_gamma_fmpz(arb_t z, const fmpz_t x, slong prec)