code: def test_dup_count_complex_roots_4():
      R, x = ring("x", ZZ)
  
      # (z-I)*(z+I)
      f = x**2 + 1
      assert R.dup_count_complex_roots(f, a, b) == 2
      assert R.dup_count_complex_roots(f, c, d) == 1
  
      # (z-I)*(z+I)*(z)
      f = x**3 + x
      assert R.dup_count_complex_roots(f, a, b) == 3
      assert R.dup_count_complex_roots(f, c, d) == 2
  
      # (z-I)*(z+I)*(-z)
      f = -(x**3) - x
      assert R.dup_count_complex_roots(f, a, b) == 3
      assert R.dup_count_complex_roots(f, c, d) == 2
  
      # (z-I)*(z+I)*(z-1)
      f = x**3 - x**2 + x - 1
      assert R.dup_count_complex_roots(f, a, b) == 3
      assert R.dup_count_complex_roots(f, c, d) == 2
  
      # (z-I)*(z+I)*(z-1)*(z)
      f = x**4 - x**3 + x**2 - x
      assert R.dup_count_complex_roots(f, a, b) == 4
      assert R.dup_count_complex_roots(f, c, d) == 3
  
      # (z-I)*(z+I)*(z-1)*(-z)
      f = -(x**4) + x**3 - x**2 + x
      assert R.dup_count_complex_roots(f, a, b) == 4
      assert R.dup_count_complex_roots(f, c, d) == 3
  
      # (z-I)*(z+I)*(z-1)*(z+1)
      f = x**4 - 1
      assert R.dup_count_complex_roots(f, a, b) == 4
      assert R.dup_count_complex_roots(f, c, d) == 2
  
      # (z-I)*(z+I)*(z-1)*(z+1)*(z)
      f = x**5 - x
      assert R.dup_count_complex_roots(f, a, b) == 5
      assert R.dup_count_complex_roots(f, c, d) == 3
  
      # (z-I)*(z+I)*(z-1)*(z+1)*(-z)
      f = -(x**5) + x
      assert R.dup_count_complex_roots(f, a, b) == 5
      assert R.dup_count_complex_roots(f, c, d) == 3
  
imports: from sympy.polys.rings import ring
  from sympy.polys.domains import ZZ, QQ, ZZ_I, EX
  from sympy.polys.polyerrors import DomainError, RefinementFailed, PolynomialError
  from sympy.polys.rootisolation import dup_cauchy_upper_bound, dup_cauchy_lower_bound, dup_mignotte_sep_bound_squared
  from sympy.testing.pytest import raises
label_desc: Use image node_id 14 for calling a global function with example usage: test_dup_count_complex_roots_4() without return types