code: def bsp_acot(q, a, b, hyperbolic):
      if b - a == 1:
          a1 = MPZ(2 * a + 3)
          if hyperbolic or a & 1:
              return MPZ_ONE, a1 * q**2, a1
          else:
              return -MPZ_ONE, a1 * q**2, a1
      m = (a + b) // 2
      p1, q1, r1 = bsp_acot(q, a, m, hyperbolic)
      p2, q2, r2 = bsp_acot(q, m, b, hyperbolic)
      return q2 * p1 + r1 * p2, q1 * q2, r1 * r2
  
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 3 for calling a global function with example usage: bsp_acot(q, a, b, hyperbolic) and returns: unknown,  unknown,  unknown, MPZ_ONE,  unknown,  a1, unknown,  unknown,  a1