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 }