RCP<const Number> bernoulli(unsigned long n) { #ifdef HAVE_SYMENGINE_ARB fmpq_t res; fmpq_init(res); bernoulli_fmpq_ui(res, n); mpq_t a; mpq_init(a); fmpq_get_mpq(a, res); rational_class b(a); fmpq_clear(res); mpq_clear(a); return Rational::from_mpq(std::move(b)); #else // TODO: implement a faster algorithm std::vector<rational_class> v(n + 1); for (unsigned m = 0; m <= n; ++m) { v[m] = rational_class(1, m + 1); for (unsigned j = m; j >= 1; --j) { v[j - 1] = j * (v[j - 1] - v[j]); } } return Rational::from_mpq(v[0]); #endif }
RCP<const Number> bernoulli(ulong n) { #ifdef HAVE_CSYMPY_ARB fmpq_t res; fmpq_init(res); bernoulli_fmpq_ui(res, n); mpq_t a; mpq_init(a); fmpq_get_mpq(a, res); mpq_class b (a); fmpq_clear(res); mpq_clear(a); return Rational::from_mpq(b); #else throw std::runtime_error("Currently supported only if ARB is installed"); #endif }