/*
Copyright (C) 2012 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 "arb.h"
void
arb_const_khinchin_eval_param(arb_t s, ulong N, ulong M, slong prec)
{
arb_t t, u, h;
arb_ptr pows;
slong k, n;
arb_init(t);
arb_init(u);
arb_init(h);
if (N < 2) flint_abort();
/* if (M < 0) flint_abort(); */
pows = _arb_vec_init(N - 2);
/* sum of logarithms */
arb_zero(s);
for (k = 2; k < N; k++)
{
arb_set_ui(t, k - 1);
arb_div_ui(t, t, k, prec);
arb_log(t, t, prec);
arb_set_ui(u, k + 1);
arb_div_ui(u, u, k, prec);
arb_log(u, u, prec);
arb_mul(t, t, u, prec);
arb_sub(s, s, t, prec);
}
/* alternating harmonic numbers */
arb_one(h);
/* powers */
for (k = 0; k < N - 2; k++)
arb_one(pows + k);
/* sum of zetas */
for (n = 1; n <= M; n++)
{
/* zeta(2n,N) / n */
arb_zeta_ui(t, 2 * n, prec);
arb_sub_ui(t, t, 1, prec);
for (k = 0; k < N - 2; k++)
{
arb_div_ui(pows + k, pows + k, (k + 2) * (k + 2), prec);
arb_sub(t, t, pows + k, prec);
}
arb_div_ui(t, t, n, prec);
arb_mul(t, t, h, prec);
arb_add(s, s, t, prec);
/* forward h by two */
arb_set_ui(u, 2 * n);
arb_mul_ui(u, u, 2 * n + 1, prec);
arb_inv(u, u, prec);
arb_sub(h, h, u, prec);
}
/* error bound 1/N^(2M) */
arb_set_ui(t, N);
arb_pow_ui(t, t, 2 * M, MAG_BITS);
arb_inv(t, t, MAG_BITS);
arb_add_error(s, t);
arb_log_ui(t, 2, prec);
arb_div(s, s, t, prec);
arb_exp(s, s, prec);
_arb_vec_clear(pows, N - 2);
arb_clear(t);
arb_clear(u);
arb_clear(h);
}
void
arb_const_khinchin_eval(arb_t K, slong prec)
{
ulong N, M;
prec += 10 + 2 * FLINT_BIT_COUNT(prec);
/* heuristic */
N = pow(prec, 0.35);
M = (prec * 0.69314718055994530942) / (2 * log(N));
arb_const_khinchin_eval_param(K, N, M, prec);
}
ARB_DEF_CACHED_CONSTANT(arb_const_khinchin, arb_const_khinchin_eval)