/*
* $Id$
*/
package edu.jas.application;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import edu.jas.arith.Rational;
import edu.jas.poly.GenPolynomial;
import edu.jas.poly.GenPolynomialRing;
import edu.jas.structure.GcdRingElem;
import edu.jas.ufd.FactorAbstract;
/**
* Real algebraic number coefficients factorization algorithms. This class
* implements factorization methods for polynomials over bi-variate real
* algebraic numbers from package
*
*
* edu.jas.application
*
*
* .
* @param coefficient type
* @author Heinz Kredel
*/
public class FactorRealReal & Rational> extends
FactorAbstract> {
// TODO: is absolute possible? and what does it mean?
//FactorAbsolute>
//FactorAbstract>
private static final Logger logger = Logger.getLogger(FactorRealReal.class);
private final boolean debug = logger.isInfoEnabled();
/**
* Factorization engine for base coefficients.
*/
public final FactorAbstract> factorAlgebraic;
/**
* No argument constructor. Note: can't use this constructor.
*/
protected FactorRealReal() {
throw new IllegalArgumentException("don't use this constructor");
}
/**
* Constructor.
* @param fac algebraic number factory.
*/
@SuppressWarnings("unchecked")
public FactorRealReal(RealAlgebraicRing fac) {
// ignore recursion, as it is handled in FactorRealAlgebraic:
this(fac,
FactorFactory.> getImplementation((edu.jas.root.RealAlgebraicRing) (Object) fac.realRing)
);
}
/**
* Constructor.
* @param fac algebraic number factory.
* @param factorAlgebraic factorization engine for polynomials over base
* coefficients.
*/
public FactorRealReal(RealAlgebraicRing fac,
FactorAbstract> factorAlgebraic) {
super(fac);
this.factorAlgebraic = factorAlgebraic;
}
/**
* GenPolynomial base factorization of a squarefree polynomial.
* @param P squarefree GenPolynomial<RealAlgebraicNumber<C>>.
* @return [p_1,...,p_k] with P = prod_{i=1, ..., k} p_i.
*/
@Override
@SuppressWarnings("unchecked")
public List>> baseFactorsSquarefree(
GenPolynomial> P) {
if (P == null) {
throw new IllegalArgumentException(this.getClass().getName() + " P == null");
}
List>> factors = new ArrayList>>();
if (P.isZERO()) {
return factors;
}
if (P.isONE()) {
factors.add(P);
return factors;
}
GenPolynomialRing> pfac = P.ring; // Q(alpha)[x]
if (pfac.nvar > 1) {
throw new IllegalArgumentException("only for univariate polynomials");
}
RealAlgebraicRing rere = (RealAlgebraicRing) pfac.coFac;
edu.jas.root.RealAlgebraicRing rfac = (edu.jas.root.RealAlgebraicRing) (Object) rere.realRing;
RealAlgebraicNumber ldcf = P.leadingBaseCoefficient();
if (!ldcf.isONE()) {
P = P.monic();
factors.add(pfac.getONE().multiply(ldcf));
}
//System.out.println("\nP = " + P);
GenPolynomialRing> arfac = new GenPolynomialRing>(
rfac, pfac);
GenPolynomial> A = PolyUtilApp. realAlgFromRealCoefficients(
arfac, P);
// factor A:
List>> afactors = factorAlgebraic
.baseFactorsSquarefree(A);
for (GenPolynomial> a : afactors) {
GenPolynomial> p = PolyUtilApp. realFromRealAlgCoefficients(pfac, a);
factors.add(p);
}
if (debug) {
logger.info("rafactors = " + factors);
}
return factors;
}
}
Ads help maintain this website.