/* Copyright (C) 2012, 2016 Fredrik Johansson This file is part of Arb. Arb is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include "flint/arith.h" #include "arb.h" /* The constant factor is nearly optimal up to at least 300000 bits. */ static double euler_product_cutoff(double prec) { if (prec > 200 && prec < 15000) /* This range has a slight "bulge". */ return 0.39 * pow(prec, 0.8); else return 7 + 0.535 * prec / log(prec); } void arb_zeta_ui(arb_t x, ulong n, slong prec) { if (n == 0) { arb_set_si(x, -1); arb_mul_2exp_si(x, x, -1); } else if (n == 1) { arb_indeterminate(x); } /* fast detection of asymptotic case */ else if (n > 0.7 * prec) { arb_zeta_ui_asymp(x, n, prec); } else { /* even */ if (n % 2 == 0) { if (((prec < 10000) && (n < 40 + 0.11*prec)) || ((prec >= 10000) && (arith_bernoulli_number_size(n) * 0.9 < prec))) { arb_zeta_ui_bernoulli(x, n, prec); } else { arb_zeta_ui_euler_product(x, n, prec); } } else { if (n == 3) { arb_const_apery(x, prec); } else if (n < prec * 0.0006) { /* small odd n, extremely high precision */ arb_zeta_ui_borwein_bsplit(x, n, prec); } else if (n > euler_product_cutoff(prec)) { /* large n */ arb_zeta_ui_euler_product(x, n, prec); } else { /* fallback */ arb_zeta_ui_vec_borwein(x, n, 1, 0, prec); } } } }