001    /*
002     * $Id: MultiplicativeSetSquarefree.java 3423 2010-12-24 10:56:50Z kredel $
003     */
004    
005    package edu.jas.gbufd;
006    
007    
008    import java.util.List;
009    
010    import org.apache.log4j.Logger;
011    
012    import edu.jas.poly.GenPolynomial;
013    import edu.jas.poly.GenPolynomialRing;
014    import edu.jas.poly.PolyUtil;
015    import edu.jas.structure.GcdRingElem;
016    import edu.jas.ufd.SquarefreeAbstract;
017    import edu.jas.ufd.SquarefreeFactory;
018    
019    
020    /**
021     * Multiplicative set of squarefree and co-prime polynomials. a, b in M implies
022     * a*b in M, 1 in M.
023     * @param <C> coefficient type
024     * @author Heinz Kredel.
025     */
026    public class MultiplicativeSetSquarefree<C extends GcdRingElem<C>> extends MultiplicativeSet<C> {
027    
028    
029        private static final Logger logger = Logger.getLogger(MultiplicativeSetSquarefree.class);
030    
031    
032        private final boolean debug = logger.isDebugEnabled();
033    
034    
035        /**
036         * Squarefree decomposition engine.
037         */
038        protected final SquarefreeAbstract<C> engine;
039    
040    
041        /**
042         * MultiplicativeSet constructor. Constructs an empty multiplicative set.
043         * @param ring polynomial ring factory for coefficients.
044         */
045        public MultiplicativeSetSquarefree(GenPolynomialRing<C> ring) {
046            super(ring);
047            engine = SquarefreeFactory.getImplementation(ring.coFac);
048        }
049    
050    
051        /**
052         * MultiplicativeSet constructor.
053         * @param ring polynomial ring factory for coefficients.
054         * @param ms a list of non-zero polynomials.
055         * @param eng squarefree factorization engine.
056         */
057        protected MultiplicativeSetSquarefree(GenPolynomialRing<C> ring, List<GenPolynomial<C>> ms,
058                SquarefreeAbstract<C> eng) {
059            super(ring, ms);
060            engine = eng;
061        }
062    
063    
064        /**
065         * toString.
066         * @see java.lang.Object#toString()
067         */
068        @Override
069        public String toString() {
070            return "MultiplicativeSetSquarefree" + mset;
071        }
072    
073    
074        /**
075         * Add polynomial to mset.
076         * @param cc polynomial to be added to mset.
077         * @return new multiplicative set.
078         */
079        @Override
080        public MultiplicativeSetSquarefree<C> add(GenPolynomial<C> cc) {
081            if (cc == null || cc.isZERO() || cc.isConstant()) {
082                return this;
083            }
084            if (ring.coFac.isField()) {
085                cc = cc.monic();
086            }
087            List<GenPolynomial<C>> list;
088            if (mset.size() == 0) {
089                list = engine.coPrimeSquarefree(cc, mset);
090                if (ring.coFac.isField()) {
091                    list = PolyUtil.<C> monic(list);
092                }
093                return new MultiplicativeSetSquarefree<C>(ring, list, engine);
094            }
095            GenPolynomial<C> c = removeFactors(cc);
096            if (c.isConstant()) {
097                logger.info("skipped unit or constant = " + c);
098                return this;
099            }
100            logger.info("added to squarefree mset = " + c);
101            list = engine.coPrimeSquarefree(c, mset);
102            if (ring.coFac.isField()) {
103                list = PolyUtil.<C> monic(list);
104            }
105            return new MultiplicativeSetSquarefree<C>(ring, list, engine);
106        }
107    
108    
109        /**
110         * Replace polynomial list of mset.
111         * @param L polynomial list to replace mset.
112         * @return new multiplicative set.
113         */
114        @Override
115        public MultiplicativeSetSquarefree<C> replace(List<GenPolynomial<C>> L) {
116            MultiplicativeSetSquarefree<C> ms = new MultiplicativeSetSquarefree<C>(ring);
117            if (L == null || L.size() == 0) {
118                return ms;
119            }
120            for (GenPolynomial<C> p : L) {
121                ms = ms.add(p);
122            }
123            return ms;
124        }
125    
126    }