001/*
002 * $Id$
003 */
004
005package edu.jas.gbufd;
006
007
008import java.util.List;
009
010import org.apache.logging.log4j.Logger;
011import org.apache.logging.log4j.LogManager; 
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.GCDFactory;
018import edu.jas.ufd.GreatestCommonDivisorAbstract;
019
020
021/**
022 * Multiplicative set of co-prime polynomials. a, b in M implies a*b in M, 1 in
023 * M.
024 * @param <C> coefficient type
025 * @author Heinz Kredel
026 */
027public class MultiplicativeSetCoPrime<C extends GcdRingElem<C>> extends MultiplicativeSet<C> {
028
029
030    private static final Logger logger = LogManager.getLogger(MultiplicativeSetCoPrime.class);
031
032
033    //private static final boolean debug = logger.isDebugEnabled();
034
035
036    /**
037     * Gcd computation engine.
038     */
039    protected final GreatestCommonDivisorAbstract<C> engine;
040
041
042    /**
043     * MultiplicativeSet constructor. Constructs an empty multiplicative set.
044     * @param ring polynomial ring factory for coefficients.
045     */
046    public MultiplicativeSetCoPrime(GenPolynomialRing<C> ring) {
047        super(ring);
048        engine = GCDFactory.getProxy(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 gcd computation engine.
057     */
058    protected MultiplicativeSetCoPrime(GenPolynomialRing<C> ring, List<GenPolynomial<C>> ms,
059                    GreatestCommonDivisorAbstract<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 "MultiplicativeSetCoPrime" + 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 MultiplicativeSetCoPrime)) {
082            return false;
083        }
084        return super.equals(B);
085    }
086
087
088    /**
089     * Hash code for this multiplicative set.
090     * @see java.lang.Object#hashCode()
091     */
092    @Override
093    public int hashCode() {
094        return super.hashCode();
095    }
096
097
098    /**
099     * Add polynomial to mset.
100     * @param cc polynomial to be added to mset.
101     * @return new multiplicative set.
102     */
103    @Override
104    public MultiplicativeSetCoPrime<C> add(GenPolynomial<C> cc) {
105        if (cc == null || cc.isZERO() || cc.isConstant()) {
106            return this;
107        }
108        if (ring.coFac.isField()) {
109            cc = cc.monic();
110        }
111        List<GenPolynomial<C>> list;
112        if (mset.size() == 0) {
113            list = engine.coPrime(cc, mset);
114            if (ring.coFac.isField()) {
115                list = PolyUtil.<C> monic(list);
116            }
117            return new MultiplicativeSetCoPrime<C>(ring, list, engine);
118        }
119        GenPolynomial<C> c = removeFactors(cc);
120        if (c.isConstant()) {
121            logger.info("skipped unit or constant = {}", c);
122            return this;
123        }
124        logger.info("added to co-prime mset = {}", c);
125        list = engine.coPrime(c, mset);
126        if (ring.coFac.isField()) {
127            list = PolyUtil.<C> monic(list);
128        }
129        return new MultiplicativeSetCoPrime<C>(ring, list, engine);
130    }
131
132
133    /**
134     * Replace polynomial list of mset.
135     * @param L polynomial list to replace mset.
136     * @return new multiplicative set.
137     */
138    @Override
139    public MultiplicativeSetCoPrime<C> replace(List<GenPolynomial<C>> L) {
140        MultiplicativeSetCoPrime<C> ms = new MultiplicativeSetCoPrime<C>(ring);
141        if (L == null || L.size() == 0) {
142            return ms;
143        }
144        for (GenPolynomial<C> p : L) {
145            ms = ms.add(p);
146        }
147        return ms;
148    }
149
150
151}