/*
 * $Id$
 */

package edu.jas.application;


import org.apache.log4j.Logger;

import edu.jas.arith.Rational;
import edu.jas.poly.AlgebraicNumber;
import edu.jas.poly.AlgebraicNumberRing;
import edu.jas.poly.Complex;
import edu.jas.poly.ComplexRing;
import edu.jas.poly.GenPolynomialRing;
import edu.jas.root.RealAlgebraicNumber;
import edu.jas.root.RealAlgebraicRing;
import edu.jas.structure.GcdRingElem;
import edu.jas.structure.RingFactory;
import edu.jas.ufd.FactorAbstract;
import edu.jas.ufd.FactorAlgebraic;
import edu.jas.ufd.FactorComplex;
import edu.jas.ufd.FactorQuotient;
import edu.jas.ufd.Quotient;
import edu.jas.ufd.QuotientRing;
import edu.jas.ufdroot.FactorRealAlgebraic;


/**
 * Factorization algorithms factory. Select appropriate factorization engine
 * based on the coefficient types.
 * @author Heinz Kredel
 * @usage To create objects that implement the Factorization
 *        interface use the FactorFactory. It will select an
 *        appropriate implementation based on the types of polynomial
 *        coefficients C. To obtain an implementation use
 *        getImplementation(), it returns an object of a class
 *        which extends the FactorAbstract class which implements
 *        the Factorization interface.
 * 
 *        
 * Factorization<CT> engine;
 * engine = FactorFactory.<CT> getImplementation(cofac);
 * c = engine.factors(a);
 * 
* * For example, if the coefficient type is BigInteger, the usage looks * like * *
 * BigInteger cofac = new BigInteger();
 * Factorization<BigInteger> engine;
 * engine = FactorFactory.getImplementation(cofac);
 * Sm = engine.factors(poly);
 * 
* * @see edu.jas.ufd.Factorization#factors(edu.jas.poly.GenPolynomial P) * @see edu.jas.ufd.FactorFactory#getImplementation(edu.jas.structure.RingFactory * P) */ public class FactorFactory extends edu.jas.ufd.FactorFactory { private static final Logger logger = Logger.getLogger(FactorFactory.class); /** * Protected factory constructor. */ protected FactorFactory() { } /** * Determine suitable implementation of factorization algorithms, case * AlgebraicNumber<C>. * @param fac AlgebraicNumberRing<C>. * @param coefficient type, e.g. BigRational, ModInteger. * @return factorization algorithm implementation. */ public static > FactorAbstract> getImplementation( AlgebraicNumberRing fac) { return new FactorAlgebraic(fac, FactorFactory. getImplementation(fac.ring.coFac)); } /** * Determine suitable implementation of factorization algorithms, case * Complex<C>. * @param fac ComplexRing<C>. * @param coefficient type, e.g. BigRational, ModInteger. * @return factorization algorithm implementation. */ public static > FactorAbstract> getImplementation(ComplexRing fac) { return new FactorComplex(fac); } /** * Determine suitable implementation of factorization algorithms, case * Quotient<C>. * @param fac QuotientRing<C>. * @param coefficient type, e.g. BigRational, ModInteger. * @return factorization algorithm implementation. */ public static > FactorAbstract> getImplementation(QuotientRing fac) { return new FactorQuotient(fac, FactorFactory. getImplementation(fac.ring.coFac)); } /** * Determine suitable implementation of factorization algorithms, case * recursive GenPolynomial<C>. Use recursiveFactors(). * @param fac GenPolynomialRing<C>. * @param coefficient type, e.g. BigRational, ModInteger. * @return factorization algorithm implementation. */ public static > FactorAbstract getImplementation(GenPolynomialRing fac) { return getImplementation(fac.coFac); } /** * Determine suitable implementation of factorization algorithms, case * RealAlgebraicNumber<C>. * @param fac RealAlgebraicRing<C>. * @param coefficient type, e.g. BigRational. * @return factorization algorithm implementation. */ public static & Rational> FactorAbstract> getImplementation( RealAlgebraicRing fac) { return new FactorRealAlgebraic(fac, FactorFactory.> getImplementation(fac.algebraic)); } /** * Determine suitable implementation of factorization algorithms, case * RealAlgebraicNumber<C>. * @param fac RealAlgebraicRing<C>. * @param coefficient type, e.g. BigRational. * @return factorization algorithm implementation. */ @SuppressWarnings("unchecked") public static & Rational> FactorAbstract> getImplementation( edu.jas.application.RealAlgebraicRing fac) { edu.jas.root.RealAlgebraicRing rar = (edu.jas.root.RealAlgebraicRing) (Object) fac.realRing; return new FactorRealReal(fac, FactorFactory.> getImplementation(rar)); } /** * Determine suitable implementation of factorization algorithms, other * cases. * @param coefficient type * @param fac RingFactory<C>. * @return factorization algorithm implementation. */ @SuppressWarnings("unchecked") public static > FactorAbstract getImplementation(RingFactory fac) { logger.info("app factor factory = " + fac.getClass().getName()); //System.out.println("fac_o = " + fac.getClass().getName()); FactorAbstract/*raw type*/ufd = null; edu.jas.application.RealAlgebraicRing rrfac = null; RealAlgebraicRing rfac = null; AlgebraicNumberRing afac = null; ComplexRing cfac = null; QuotientRing qfac = null; GenPolynomialRing pfac = null; Object ofac = fac; if (ofac instanceof edu.jas.application.RealAlgebraicRing) { //System.out.println("rrfac_o = " + ofac); rrfac = (edu.jas.application.RealAlgebraicRing) ofac; //ofac = rrfac.realRing; ufd = new FactorRealReal/*raw */( rrfac, FactorFactory. getImplementation(rrfac.realRing)); } else if (ofac instanceof edu.jas.root.RealAlgebraicRing) { //System.out.println("rfac_o = " + ofac); rfac = (edu.jas.root.RealAlgebraicRing) ofac; //ofac = rfac.algebraic; ufd = new FactorRealAlgebraic/*raw */(rfac, FactorFactory.> getImplementation(rfac.algebraic)); } else if (ofac instanceof ComplexRing) { cfac = (ComplexRing) ofac; afac = cfac.algebraicRing(); ufd = new FactorComplex(cfac, FactorFactory. getImplementation(afac)); } else if (ofac instanceof AlgebraicNumberRing) { //System.out.println("afac_o = " + ofac); afac = (AlgebraicNumberRing) ofac; //ofac = afac.ring.coFac; ufd = new FactorAlgebraic/*raw */(afac, FactorFactory. getImplementation(afac.ring.coFac)); } else if (ofac instanceof QuotientRing) { //System.out.println("qfac_o = " + ofac); qfac = (QuotientRing) ofac; ufd = new FactorQuotient/*raw */(qfac, FactorFactory. getImplementation(qfac.ring.coFac)); } else if (ofac instanceof GenPolynomialRing) { //System.out.println("qfac_o = " + ofac); pfac = (GenPolynomialRing) ofac; ufd = getImplementation(pfac.coFac); } else { //System.out.println("no fac = " + fac.getClass().getName()); ufd = edu.jas.ufd.FactorFactory.getImplementation(fac); //return (FactorAbstract) ufd; } //logger.info("implementation = " + ufd); return (FactorAbstract) ufd; } }

Ads help maintain this website.