in codelab/pi.cc [74:103]
bs_return_type bs(const long a, const long b, const int depth) {
mpz_class p, q, t;
static bs_invoker invoker;
if (b - a == 1) {
if (a == 0) {
p = 1;
q = 1;
} else {
p = (6 * a - 5);
p *= (2 * a - 1);
p *= (6 * a - 1);
q = a;
q = q * a * a * C3_OVER_24;
}
t = p * (A + mpz_class(B) * a);
if (a % 2)
t = -t;
} else {
auto m = (a + b) / 2;
auto f1 = invoker(a, m, depth + 1);
auto f2 = invoker(m, b, depth + 1);
auto [p1, q1, t1] = f1.get();
auto [p2, q2, t2] = f2.get();
p = p1 * p2;
q = q1 * q2;
t = t1 * q2 + p1 * t2;
}
return {p, q, t};
}