/*
* $Id$
*/
package edu.jas.ufd;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import edu.jas.poly.GenPolynomial;
import edu.jas.poly.GenPolynomialRing;
import edu.jas.structure.GcdRingElem;
/**
* Rational function coefficients factorization algorithms. This class
* implements factorization methods for polynomials over rational functions,
* that is, with coefficients from class application.Quotient.
* @author Heinz Kredel
*/
public class FactorQuotient> extends FactorAbstract> {
private static final Logger logger = Logger.getLogger(FactorQuotient.class);
//private final boolean debug = logger.isInfoEnabled();
/**
* Factorization engine for normal coefficients.
*/
protected final FactorAbstract nengine;
/**
* No argument constructor.
*/
protected FactorQuotient() {
throw new IllegalArgumentException("don't use this constructor");
}
/**
* Constructor.
* @param fac coefficient quotient ring factory.
*/
public FactorQuotient(QuotientRing fac) {
this(fac, FactorFactory. getImplementation(fac.ring.coFac));
}
/**
* Constructor.
* @param fac coefficient quotient ring factory.
* @param nengine factorization engine for polynomials over base
* coefficients.
*/
public FactorQuotient(QuotientRing fac, FactorAbstract nengine) {
super(fac);
this.nengine = nengine;
}
/**
* GenPolynomial base factorization of a squarefree polynomial.
* @param P squarefree GenPolynomial.
* @return [p_1,...,p_k] with P = prod_{i=1, ..., k} p_i.
*/
@Override
public List>> baseFactorsSquarefree(GenPolynomial> P) {
return factorsSquarefree(P);
}
/**
* GenPolynomial factorization of a squarefree polynomial.
* @param P squarefree GenPolynomial.
* @return [p_1,...,p_k] with P = prod_{i=1, ..., k} p_i.
*/
@Override
public List>> factorsSquarefree(GenPolynomial> P) {
if (P == null) {
throw new IllegalArgumentException(this.getClass().getName() + " P == null");
}
//System.out.println("factorsSquarefree, P = " + P);
List>> factors = new ArrayList>>();
if (P.isZERO()) {
return factors;
}
if (P.isONE()) {
factors.add(P);
return factors;
}
GenPolynomialRing> pfac = P.ring;
GenPolynomial> Pr = P;
Quotient ldcf = P.leadingBaseCoefficient();
if (!ldcf.isONE()) {
//System.out.println("ldcf = " + ldcf);
Pr = Pr.monic();
}
QuotientRing qi = (QuotientRing) pfac.coFac;
GenPolynomialRing ci = qi.ring;
GenPolynomialRing> ifac = new GenPolynomialRing>(ci, pfac);
GenPolynomial> Pi = PolyUfdUtil. integralFromQuotientCoefficients(ifac, Pr);
//System.out.println("Pi = " + Pi);
// factor in C[x_1,...,x_n][y_1,...,y_m]
List>> irfacts = nengine.recursiveFactorsSquarefree(Pi);
if (logger.isInfoEnabled()) {
logger.info("irfacts = " + irfacts);
}
if (irfacts.size() <= 1) {
factors.add(P);
return factors;
}
List>> qfacts = PolyUfdUtil. quotientFromIntegralCoefficients(pfac,
irfacts);
//System.out.println("qfacts = " + qfacts);
//qfacts = PolyUtil.monic(qfacts);
//System.out.println("qfacts = " + qfacts);
if (!ldcf.isONE()) {
GenPolynomial> r = qfacts.get(0);
qfacts.remove(r);
r = r.multiply(ldcf);
qfacts.add(0, r);
}
if (logger.isInfoEnabled()) {
logger.info("qfacts = " + qfacts);
}
factors.addAll(qfacts);
return factors;
}
}
Ads help maintain this website.