code: def dup_zz_hensel_lift(p, f, f_list, l, K):
      r"""
      Multifactor Hensel lifting in `Z[x]`.
  
      Given a prime `p`, polynomial `f` over `Z[x]` such that `lc(f)`
      is a unit modulo `p`, monic pair-wise coprime polynomials `f_i`
      over `Z[x]` satisfying::
  
          f = lc(f) f_1 ... f_r (mod p)
  
      and a positive integer `l`, returns a list of monic polynomials
      `F_1,\ F_2,\ \dots,\ F_r` satisfying::
  
         f = lc(f) F_1 ... F_r (mod p**l)
  
         F_i = f_i (mod p), i = 1..r
  
      References
      ==========
  
      .. [1] [Gathen99]_
  
      """
      r = len(f_list)
      lc = dup_LC(f, K)
  
      if r == 1:
          F = dup_mul_ground(f, K.gcdex(lc, p**l)[0], K)
          return [dup_trunc(F, p**l, K)]
  
      m = p
      k = r // 2
      d = int(_ceil(_log(l, 2)))
  
      g = gf_from_int_poly([lc], p)
  
      for f_i in f_list[:k]:
          g = gf_mul(g, gf_from_int_poly(f_i, p), p, K)
  
      h = gf_from_int_poly(f_list[k], p)
  
      for f_i in f_list[k + 1 :]:
          h = gf_mul(h, gf_from_int_poly(f_i, p), p, K)
  
      s, t, _ = gf_gcdex(g, h, p, K)
  
      g = gf_to_int_poly(g, p)
      h = gf_to_int_poly(h, p)
      s = gf_to_int_poly(s, p)
      t = gf_to_int_poly(t, p)
  
      for _ in range(1, d + 1):
          (g, h, s, t), m = (
              dup_zz_hensel_step(m, f, g, h, s, t, K),
              m**2,
          )
  
      return dup_zz_hensel_lift(
          p, g, f_list[:k], l, K
      ) + dup_zz_hensel_lift(p, h, f_list[k:], l, K)
  
imports: from sympy.external.gmpy import GROUND_TYPES
  from sympy.core.random import _randint
  from sympy.polys.galoistools import gf_from_int_poly, gf_to_int_poly, gf_lshift, gf_add_mul, gf_mul, gf_div, gf_rem, gf_gcdex, gf_sqf_p, gf_factor_sqf, gf_factor
  from sympy.polys.densebasic import dup_LC, dmp_LC, dmp_ground_LC, dup_TC, dup_convert, dmp_convert, dup_degree, dmp_degree, dmp_degree_in, dmp_degree_list, dmp_from_dict, dmp_zero_p, dmp_one, dmp_nest, dmp_raise, dup_strip, dmp_ground, dup_inflate, dmp_exclude, dmp_include, dmp_inject, dmp_eject, dup_terms_gcd, dmp_terms_gcd
  from sympy.polys.densearith import dup_neg, dmp_neg, dup_add, dmp_add, dup_sub, dmp_sub, dup_mul, dmp_mul, dup_sqr, dmp_pow, dup_div, dmp_div, dup_quo, dmp_quo, dmp_expand, dmp_add_mul, dup_sub_mul, dmp_sub_mul, dup_lshift, dup_max_norm, dmp_max_norm, dup_l1_norm, dup_mul_ground, dmp_mul_ground, dup_quo_ground, dmp_quo_ground
  from sympy.polys.densetools import dup_clear_denoms, dmp_clear_denoms, dup_trunc, dmp_ground_trunc, dup_content, dup_monic, dmp_ground_monic, dup_primitive, dmp_ground_primitive, dmp_eval_tail, dmp_eval_in, dmp_diff_eval_in, dmp_compose, dup_shift, dup_mirror
  from sympy.polys.euclidtools import dmp_primitive, dup_inner_gcd, dmp_inner_gcd
  from sympy.polys.sqfreetools import dup_sqf_p, dup_sqf_norm, dmp_sqf_norm, dup_sqf_part, dmp_sqf_part
  from sympy.polys.polyutils import _sort_factors
  from sympy.polys.polyconfig import query
  from sympy.polys.polyerrors import ExtraneousFactors, DomainError, CoercionFailed, EvaluationFailed
  from sympy.utilities import subsets
  from math import ceil, log
label_desc: Use image node_id 6 for calling a global function with example usage: dup_zz_hensel_lift(p, f, f_list, l, K) and returns: unknown, list