001/*
002 * $Id: MultiplicativeSetCoPrime.java 5870 2018-07-20 15:56:23Z kredel $
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     * Add polynomial to mset.
090     * @param cc polynomial to be added to mset.
091     * @return new multiplicative set.
092     */
093    @Override
094    public MultiplicativeSetCoPrime<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        List<GenPolynomial<C>> list;
102        if (mset.size() == 0) {
103            list = engine.coPrime(cc, mset);
104            if (ring.coFac.isField()) {
105                list = PolyUtil.<C> monic(list);
106            }
107            return new MultiplicativeSetCoPrime<C>(ring, list, engine);
108        }
109        GenPolynomial<C> c = removeFactors(cc);
110        if (c.isConstant()) {
111            logger.info("skipped unit or constant = " + c);
112            return this;
113        }
114        logger.info("added to co-prime mset = " + c);
115        list = engine.coPrime(c, mset);
116        if (ring.coFac.isField()) {
117            list = PolyUtil.<C> monic(list);
118        }
119        return new MultiplicativeSetCoPrime<C>(ring, list, engine);
120    }
121
122
123    /**
124     * Replace polynomial list of mset.
125     * @param L polynomial list to replace mset.
126     * @return new multiplicative set.
127     */
128    @Override
129    public MultiplicativeSetCoPrime<C> replace(List<GenPolynomial<C>> L) {
130        MultiplicativeSetCoPrime<C> ms = new MultiplicativeSetCoPrime<C>(ring);
131        if (L == null || L.size() == 0) {
132            return ms;
133        }
134        for (GenPolynomial<C> p : L) {
135            ms = ms.add(p);
136        }
137        return ms;
138    }
139
140
141}