def _hensel_lift(g0, f0, _char, height, where)
      # self in MPolynomial/ZorZp
      # g0 in Polyomial/ZorZp, candidate of factor of f0
      # f0 in Polyomial/ZoZzp, one variable reduction of self

      ring = self.class
      ring_one = g0.class

      h0, r0 = f0.divmod g0
      raise 'each_product does not work well' unless r0.zero?

      #    where = 0
      ary = [g0, h0]
      cofacts = mk_cofacts(ary)
      fk = ary.collect { |fx| fx.value_on_one(ring, where) } # MPolynomial

      height.times do |k|
        c = self - fk[0] * fk[1]
        h = c.annihilate_away_from(where, k + 1)
        h_alpha0 = h.collect_away_from(where, ring_one) # Hash: ind0=>Polynomial
        h_alpha = {}

        h_alpha0.each do |ind, ha|
          h_alpha[ind] = yield(ha, ary, cofacts)
        end

        hias = ary.collect { {} }
        h_alpha.each do |ind, ha_i|
          ha_i.each_with_index do |fx, i|
            next if fx.zero?
            hias[i][ind] = fx
          end
        end

        hi = hias.collect do |hia|
          e = ring.zero
          hia.each do |ind, fx|
            e += ring.monomial(ind) * fx.value_on_one(ring, where)
          end
          e
        end
        fk_new = []
        hi.each_with_index do |fx, i|
          fk_new.push fk[i] + fx
        end
        fk = fk_new
      end
      fk
    end
def _hensel_lift(g0, f0, _char, height, where)
      # self in MPolynomial/ZorZp
      # g0 in Polyomial/ZorZp, candidate of factor of f0
      # f0 in Polyomial/ZoZzp, one variable reduction of self

      ring = self.class
      ring_one = g0.class

      h0, r0 = f0.divmod g0
      raise 'each_product does not work well' unless r0.zero?

      #    where = 0
      ary = [g0, h0]
      cofacts = mk_cofacts(ary)
      fk = ary.collect { |fx| fx.value_on_one(ring, where) } # MPolynomial

      height.times do |k|
        c = self - fk[0] * fk[1]
        h = c.annihilate_away_from(where, k + 1)
        h_alpha0 = h.collect_away_from(where, ring_one) # Hash: ind0=>Polynomial
        h_alpha = {}

        h_alpha0.each do |ind, ha|
          h_alpha[ind] = yield(ha, ary, cofacts)
        end

        hias = ary.collect { {} }
        h_alpha.each do |ind, ha_i|
          ha_i.each_with_index do |fx, i|
            next if fx.zero?
            hias[i][ind] = fx
          end
        end

        hi = hias.collect do |hia|
          e = ring.zero
          hia.each do |ind, fx|
            e += ring.monomial(ind) * fx.value_on_one(ring, where)
          end
          e
        end
        fk_new = []
        hi.each_with_index do |fx, i|
          fk_new.push fk[i] + fx
        end
        fk = fk_new
      end
      fk
    end
def _hensel_lift(g0, f0, char, height)