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