/*
 * $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.