/*
* $Id$
*/
package edu.jas.ufdroot;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import edu.jas.arith.Rational;
import edu.jas.poly.AlgebraicNumber;
import edu.jas.poly.GenPolynomial;
import edu.jas.poly.GenPolynomialRing;
import edu.jas.root.PolyUtilRoot;
import edu.jas.root.RealAlgebraicNumber;
import edu.jas.root.RealAlgebraicRing;
import edu.jas.structure.GcdRingElem;
import edu.jas.ufd.FactorAbstract;
import edu.jas.ufd.FactorFactory;
/**
* Real algebraic number coefficients factorization algorithms. This class
* implements factorization methods for polynomials over real algebraic numbers
* from package
*
*
* edu.jas.root
*
*
* .
* @param coefficient type
* @author Heinz Kredel
*/
public class FactorRealAlgebraic & Rational> extends
FactorAbstract> {
// TODO: is absolute possible? and what does it mean?
//FactorAbsolute>
//FactorAbstract>
private static final Logger logger = Logger.getLogger(FactorRealAlgebraic.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 FactorRealAlgebraic() {
throw new IllegalArgumentException("don't use this constructor");
}
/**
* Constructor.
* @param fac algebraic number factory.
*/
public FactorRealAlgebraic(RealAlgebraicRing fac) {
this(fac, FactorFactory.> getImplementation(fac.algebraic));
}
/**
* Constructor.
* @param fac algebraic number factory.
* @param factorAlgebraic factorization engine for polynomials over base
* coefficients.
*/
public FactorRealAlgebraic(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
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 rfac = (RealAlgebraicRing) pfac.coFac;
RealAlgebraicNumber ldcf = P.leadingBaseCoefficient();
if (!ldcf.isONE()) {
P = P.monic();
factors.add(pfac.getONE().multiply(ldcf));
}
//System.out.println("\nP = " + P);
GenPolynomialRing> afac = new GenPolynomialRing>(
rfac.algebraic, pfac);
GenPolynomial> A = PolyUtilRoot. algebraicFromRealCoefficients(afac, P);
// factor A:
List>> afactors = factorAlgebraic.baseFactorsSquarefree(A);
for (GenPolynomial> a : afactors) {
GenPolynomial> p = PolyUtilRoot. realFromAlgebraicCoefficients(pfac, a);
factors.add(p);
}
logger.info("real algebraic factors = " + factors);
return factors;
}
}
Ads help maintain this website.