code: def bs_chudnovsky(a, b, level, verbose):
      """
      Computes the sum from a to b of the series in the Chudnovsky
      formula. Returns g, p, q where p/q is the sum as an exact
      fraction and g is a temporary value used to save work
      for recursive calls.
      """
      if b - a == 1:
          g = MPZ((6 * b - 5) * (2 * b - 1) * (6 * b - 1))
          p = b**3 * CHUD_C**3 // 24
          q = (-1) ** b * g * (CHUD_A + CHUD_B * b)
      else:
          if verbose and level < 4:
              print("  binary splitting", a, b)
          mid = (a + b) // 2
          g1, p1, q1 = bs_chudnovsky(a, mid, level + 1, verbose)
          g2, p2, q2 = bs_chudnovsky(mid, b, level + 1, verbose)
          p = p1 * p2
          g = g1 * g2
          q = q1 * p2 + q2 * g1
      return g, p, q
  
imports: import math
  from bisect import bisect
  from .backend import xrange
  from .backend import MPZ, MPZ_ZERO, MPZ_ONE, MPZ_TWO, MPZ_FIVE, BACKEND
  from .libmpf import round_floor, round_ceiling, round_down, round_up, round_nearest, round_fast, ComplexResult, bitcount, bctable, lshift, rshift, giant_steps, sqrt_fixed, from_int, to_int, from_man_exp, to_fixed, to_float, from_float, from_rational, normalize, fzero, fone, fnone, fhalf, finf, fninf, fnan, mpf_cmp, mpf_sign, mpf_abs, mpf_pos, mpf_neg, mpf_add, mpf_sub, mpf_mul, mpf_div, mpf_shift, mpf_rdiv_int, mpf_pow_int, mpf_sqrt, reciprocal_rnd, negative_rnd, mpf_perturb, isqrt_fast
  from .libintmath import ifib
label_desc: Use image node_id 8 for calling a global function with example usage: bs_chudnovsky(a, b, level, verbose) and returns: g,  p,  q