code: def dmp_zz_factor(f, u, K):
      r"""
      Factor (non square-free) polynomials in `Z[X]`.
  
      Given a multivariate polynomial `f` in `Z[x]` computes its complete
      factorization `f_1, \dots, f_n` into irreducibles over integers::
  
                   f = content(f) f_1**k_1 ... f_n**k_n
  
      The factorization is computed by reducing the input polynomial
      into a primitive square-free polynomial and factoring it using
      Enhanced Extended Zassenhaus (EEZ) algorithm. Trial division
      is used to recover the multiplicities of factors.
  
      The result is returned as a tuple consisting of::
  
               (content(f), [(f_1, k_1), ..., (f_n, k_n))
  
      Consider polynomial `f = 2*(x**2 - y**2)`::
  
          >>> from sympy.polys import ring, ZZ
          >>> R, x,y = ring("x,y", ZZ)
  
          >>> R.dmp_zz_factor(2*x**2 - 2*y**2)
          (2, [(x - y, 1), (x + y, 1)])
  
      In result we got the following factorization::
  
                      f = 2 (x - y) (x + y)
  
      References
      ==========
  
      .. [1] [Gathen99]_
  
      """
      if not u:
          return dup_zz_factor(f, K)
  
      if dmp_zero_p(f, u):
          return K.zero, []
  
      cont, g = dmp_ground_primitive(f, u, K)
  
      if dmp_ground_LC(g, u, K) < 0:
          cont, g = -cont, dmp_neg(g, u, K)
  
      if all(d <= 0 for d in dmp_degree_list(g, u)):
          return cont, []
  
      G, g = dmp_primitive(g, u, K)
  
      factors = []
  
      if dmp_degree(g, u) > 0:
          g = dmp_sqf_part(g, u, K)
          H = dmp_zz_wang(g, u, K)
          factors = dmp_trial_division(f, H, u, K)
  
      for g, k in dmp_zz_factor(G, u - 1, K)[1]:
          factors.insert(0, ([g], k))
  
      return cont, _sort_factors(factors)
  
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 23 for calling a global function with example usage: dmp_zz_factor(f, u, K) and returns: cont,  _sort_factors, dup_zz_factor, K,  list, cont,  list