code: def dup_half_gcdex(f, g, K):
      """
      Half extended Euclidean algorithm in `F[x]`.
  
      Returns ``(s, h)`` such that ``h = gcd(f, g)`` and ``s*f = h (mod g)``.
  
      Examples
      ========
  
      >>> from sympy.polys import ring, QQ
      >>> R, x = ring("x", QQ)
  
      >>> f = x**4 - 2*x**3 - 6*x**2 + 12*x + 15
      >>> g = x**3 + x**2 - 4*x - 4
  
      >>> R.dup_half_gcdex(f, g)
      (-1/5*x + 3/5, x + 1)
  
      """
      if not K.is_Field:
          raise DomainError(
              "Cannot compute half extended GCD over %s" % K
          )
  
      a, b = [K.one], []
  
      while g:
          q, r = dup_div(f, g, K)
          f, g = g, r
          a, b = b, dup_sub_mul(a, q, b, K)
  
      a = dup_quo_ground(a, dup_LC(f, K), K)
      f = dup_monic(f, K)
  
      return a, f
  
imports: from sympy.polys.densearith import dup_sub_mul, dup_neg, dmp_neg, dmp_add, dmp_sub, dup_mul, dmp_mul, dmp_pow, dup_div, dmp_div, dup_rem, dup_quo, dmp_quo, dup_prem, dmp_prem, dup_mul_ground, dmp_mul_ground, dmp_mul_term, dup_quo_ground, dmp_quo_ground, dup_max_norm, dmp_max_norm
  from sympy.polys.densebasic import dup_strip, dmp_raise, dmp_zero, dmp_one, dmp_ground, dmp_one_p, dmp_zero_p, dmp_zeros, dup_degree, dmp_degree, dmp_degree_in, dup_LC, dmp_LC, dmp_ground_LC, dmp_multi_deflate, dmp_inflate, dup_convert, dmp_convert, dmp_apply_pairs
  from sympy.polys.densetools import dup_clear_denoms, dmp_clear_denoms, dup_diff, dmp_diff, dup_eval, dmp_eval, dmp_eval_in, dup_trunc, dmp_ground_trunc, dup_monic, dmp_ground_monic, dup_primitive, dmp_ground_primitive, dup_extract, dmp_ground_extract
  from sympy.polys.galoistools import gf_int, gf_crt
  from sympy.polys.polyconfig import query
  from sympy.polys.polyerrors import MultivariatePolynomialError, HeuristicGCDFailed, HomomorphismFailed, NotInvertible, DomainError
label_desc: Use image node_id 1 for calling a global function with example usage: dup_half_gcdex(f, g, K) and returns: a,  f