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