bs_return_type bs()

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};
}