import numberdb.sage as numberdb
from sage.rings.real_arb import RealBallField
from sage.rings.rational_field import QQ
from sage.arith.misc import moebius

R = RealBallField(numberdb.bits(100, losing=128))
C = (2*R.pi()).log() - R.euler_constant()
def V(p, q):
    return sum((R(QQ((m*p) % q)/q) *
                (R.pi()*R(QQ(m)/q)).cot()
                for m in range(1, q)), R(0))
def A(r):
    p, q = int(r.numerator()), int(r.denominator())
    x = R(r)
    return ((1-x)*x.log()+(1+x)*C)/2 - R.pi()*(V(p,q)+V(q,p))/(2*q)
def E(N):
    assert N >= 2
    w = [R(0) if n == N else R(moebius(n))*(1-R(n).log()/R(N).log())
         for n in range(1, N+1)]
    b = [(R(n).log()+1-R.euler_constant())/n for n in range(1, N+1)]
    return 1 + 2*sum((w[i]*b[i] for i in range(N)), R(0)) + sum(
        (w[j-1]*w[k-1]*A(QQ(j)/k)/j
         for j in range(1,N+1) for k in range(1,N+1)), R(0))

print(E(10))
