001 /* 002 * $Id: FactorFactory.java 3676 2011-07-02 10:51:16Z kredel $ 003 */ 004 005 package edu.jas.application; 006 007 008 import org.apache.log4j.Logger; 009 010 import edu.jas.arith.Rational; 011 import edu.jas.structure.GcdRingElem; 012 import edu.jas.structure.RingFactory; 013 import edu.jas.ufd.FactorAbstract; 014 015 016 /** 017 * Factorization algorithms factory. Select appropriate factorization engine 018 * based on the coefficient types. 019 * @author Heinz Kredel 020 * @usage To create objects that implement the <code>Factorization</code> 021 * interface use the <code>FactorFactory</code>. It will select an 022 * appropriate implementation based on the types of polynomial 023 * coefficients C. To obtain an implementation use 024 * <code>getImplementation()</code>, it returns an object of a class 025 * which extends the <code>FactorAbstract</code> class which implements 026 * the <code>Factorization</code> interface. 027 * 028 * <pre> 029 * Factorization<CT> engine; 030 * engine = FactorFactory.<CT> getImplementation(cofac); 031 * c = engine.factors(a); 032 * </pre> 033 * 034 * For example, if the coefficient type is BigInteger, the usage looks 035 * like 036 * 037 * <pre> 038 * BigInteger cofac = new BigInteger(); 039 * Factorization<BigInteger> engine; 040 * engine = FactorFactory.getImplementation(cofac); 041 * Sm = engine.factors(poly); 042 * </pre> 043 * 044 * @see edu.jas.ufd.Factorization#factors(edu.jas.poly.GenPolynomial P) 045 * @see edu.jas.ufd.FactorFactory#getImplementation(edu.jas.structure.RingFactory 046 * P) 047 */ 048 049 public class FactorFactory extends edu.jas.ufd.FactorFactory { 050 051 052 private static final Logger logger = Logger.getLogger(FactorFactory.class); 053 054 055 /** 056 * Protected factory constructor. 057 */ 058 protected FactorFactory() { 059 } 060 061 062 /** 063 * Determine suitable implementation of factorization algorithms, case 064 * RealAlgebraicNumber<C>. 065 * @param fac RealAlgebraicRing<C>. 066 * @param <C> coefficient type, e.g. BigRational. 067 * @return factorization algorithm implementation. 068 */ 069 public static <C extends GcdRingElem<C> & Rational> FactorAbstract<edu.jas.application.RealAlgebraicNumber<C>> getImplementation( 070 edu.jas.application.RealAlgebraicRing<C> fac) { 071 return new FactorRealReal<C>(fac); 072 } 073 074 075 /** 076 * Determine suitable implementation of factorization algorithms, other 077 * cases. 078 * @param <C> coefficient type 079 * @param fac RingFactory<C>. 080 * @return factorization algorithm implementation. 081 */ 082 @SuppressWarnings("unchecked") 083 public static <C extends GcdRingElem<C>> FactorAbstract<C> getImplementation(RingFactory<C> fac) { 084 //logger.info("fac = " + fac.getClass().getName()); 085 //System.out.println("fac_o = " + fac.getClass().getName()); 086 FactorAbstract/*raw type<C>*/ufd = null; 087 edu.jas.application.RealAlgebraicRing rrfac = null; 088 Object ofac = fac; 089 if (ofac instanceof edu.jas.application.RealAlgebraicRing) { 090 //System.out.println("rrfac_o = " + ofac); 091 rrfac = (edu.jas.application.RealAlgebraicRing) ofac; 092 ofac = rrfac.realRing; 093 ufd = new FactorRealReal/*raw <C>*/(rrfac); 094 } else { 095 ufd = edu.jas.ufd.FactorFactory.getImplementation(fac); 096 return (FactorAbstract<C>) ufd; 097 } 098 logger.info("ufd = " + ufd); 099 return (FactorAbstract<C>) ufd; 100 } 101 102 }