code: def mpc_agm(a, b, prec, rnd=round_fast):
      """
      Complex AGM.
  
      TODO:
      * check that convergence works as intended
      * optimize
      * select a nonarbitrary branch
      """
      if mpc_is_infnan(a) or mpc_is_infnan(b):
          return fnan, fnan
      if mpc_zero in (a, b):
          return fzero, fzero
      if mpc_neg(a) == b:
          return fzero, fzero
      wp = prec + 20
      eps = mpf_shift(fone, -wp + 10)
      while 1:
          a1 = mpc_shift(mpc_add(a, b, wp), -1)
          b1 = mpc_sqrt(mpc_mul(a, b, wp), wp)
          a, b = a1, b1
          size = mpf_min_max([mpc_abs(a, 10), mpc_abs(b, 10)])[1]
          err = mpc_abs(mpc_sub(a, b, 10), 10)
          if size == fzero or mpf_lt(err, mpf_mul(eps, size)):
              return a
  
imports: import operator
  import math
  from .backend import MPZ_ZERO, MPZ_ONE, BACKEND, xrange, exec_
  from .libintmath import gcd
  from .libmpf import ComplexResult, round_fast, round_nearest, negative_rnd, bitcount, to_fixed, from_man_exp, from_int, to_int, from_rational, fzero, fone, fnone, ftwo, finf, fninf, fnan, mpf_sign, mpf_add, mpf_abs, mpf_pos, mpf_cmp, mpf_lt, mpf_le, mpf_gt, mpf_min_max, mpf_perturb, mpf_neg, mpf_shift, mpf_sub, mpf_mul, mpf_div, sqrt_fixed, mpf_sqrt, mpf_rdiv_int, mpf_pow_int, to_rational
  from .libelefun import mpf_pi, mpf_exp, mpf_log, pi_fixed, mpf_cos_sin, mpf_cos, mpf_sin, mpf_sqrt, agm_fixed
  from .libmpc import mpc_one, mpc_sub, mpc_mul_mpf, mpc_mul, mpc_neg, complex_int_pow, mpc_div, mpc_add_mpf, mpc_sub_mpf, mpc_log, mpc_add, mpc_pos, mpc_shift, mpc_is_infnan, mpc_zero, mpc_sqrt, mpc_abs, mpc_mpf_div, mpc_square, mpc_exp
  from .libintmath import ifac
  from .gammazeta import mpf_gamma_int, mpf_euler, euler_fixed
label_desc: Use image node_id 25 for calling a global function with example usage: mpc_agm(a, b, prec, rnd) and returns: fnan,  fnan, fzero,  fzero, fzero,  fzero, a