From 2e8b7f7b57293cf4b5a9da4ec6d2f4235bbd680b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Ahlb=C3=A4ck?= Date: Mon, 18 Oct 2021 17:39:41 +0200 Subject: [PATCH] Compute bin_uiui via Flint for small n --- arb/bin.c | 26 ++++++++++++++++++++++---- doc/source/arb.rst | 8 ++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/arb/bin.c b/arb/bin.c index dc5d0cdb3..f21e7f9f3 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. @@ -39,13 +40,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)