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