def hensel_lift_zp(g0, f0, char, height, where)
      # self in MPolynomial/int
      # g0 in Polyomial/Zp, candidate of factor of f0
      # f0 in Polyomial/Zp, one variable reduction of self

      #    fk = _hensel_lift(g0, f0, char, height) {|ha, ary, cofacts|
      fk = _hensel_lift(g0, f0, char, height, where) do |ha, ary, cofacts|
        decompose_on_cofactors_modp(ha, ary, cofacts)
      end

      r = self - fk[0] * fk[1]
      return fk if r.zero?

      nil
    end
def hensel_lift_zp(g0, f0, char, height, where)
      # self in MPolynomial/int
      # g0 in Polyomial/Zp, candidate of factor of f0
      # f0 in Polyomial/Zp, one variable reduction of self

      #    fk = _hensel_lift(g0, f0, char, height) {|ha, ary, cofacts|
      fk = _hensel_lift(g0, f0, char, height, where) do |ha, ary, cofacts|
        decompose_on_cofactors_modp(ha, ary, cofacts)
      end

      r = self - fk[0] * fk[1]
      return fk if r.zero?

      nil
    end
def hensel_lift_zp(g0, f0, char, height)