def factorize_modp(an = 0)
      f = self
      f = f.sqfree_zp if an == 0
      an += 1 while f.deg_at(an) <= 0
      f = f.pp(an)
      lc_of_f = f.lc_at(an)
      f = f.monic_int(an)
      facts = f._factorize(an)
      facts = facts.map! do |f2|
        f3 = f2.project(self.class) { |c, j| c * lc_of_f**j[an] }
        f3.pp(an)
      end
      facts = facts.fact_all_u(self)
      facts.mcorrect_lc!(self, an) do |fac|
        fac.factorize_modp(an + 1)
      end
      facts
    end
def factorize_modp(an = 0)
      f = self
      f = f.sqfree_zp if an == 0
      an += 1 while f.deg_at(an) <= 0
      f = f.pp(an)
      lc_of_f = f.lc_at(an)
      f = f.monic_int(an)
      facts = f._factorize(an)
      facts = facts.map! do |f2|
        f3 = f2.project(self.class) { |c, j| c * lc_of_f**j[an] }
        f3.pp(an)
      end
      facts = facts.fact_all_u(self)
      facts.mcorrect_lc!(self, an) do |fac|
        fac.factorize_modp(an + 1)
      end
      facts
    end
include PolynomialFactorization::Z