001 /*
002 * $Id: MultiplicativeSetFactors.java 3423 2010-12-24 10:56:50Z kredel $
003 */
004
005 package edu.jas.gbufd;
006
007
008 import java.util.ArrayList;
009 import java.util.List;
010
011 import org.apache.log4j.Logger;
012
013 import edu.jas.poly.GenPolynomial;
014 import edu.jas.poly.GenPolynomialRing;
015 import edu.jas.poly.PolyUtil;
016 import edu.jas.structure.GcdRingElem;
017 import edu.jas.ufd.FactorAbstract;
018 import 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 */
027 public 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 * Add polynomial to mset.
077 * @param cc polynomial to be added to mset.
078 * @return new multiplicative set.
079 */
080 @Override
081 public MultiplicativeSetFactors<C> add(GenPolynomial<C> cc) {
082 if (cc == null || cc.isZERO() || cc.isConstant()) {
083 return this;
084 }
085 if (ring.coFac.isField()) {
086 cc = cc.monic();
087 }
088 GenPolynomial<C> c = removeFactors(cc);
089 if (c.isConstant()) {
090 logger.info("skipped unit or constant = " + c);
091 return this;
092 }
093 List<GenPolynomial<C>> list = engine.factorsRadical(c);
094 logger.info("factorsRadical = " + list);
095 if (ring.coFac.isField()) {
096 list = PolyUtil.<C> monic(list);
097 }
098 List<GenPolynomial<C>> ms = new ArrayList<GenPolynomial<C>>(mset);
099 for (GenPolynomial<C> p : list) {
100 if (!p.isConstant() && !p.isZERO()) {
101 if (!mset.contains(p)) {
102 logger.info("added to irreducible mset = " + p);
103 ms.add(p);
104 }
105 }
106 }
107 return new MultiplicativeSetFactors<C>(ring, ms, engine);
108 }
109
110
111 /**
112 * Replace polynomial list of mset.
113 * @param L polynomial list to replace mset.
114 * @return new multiplicative set.
115 */
116 @Override
117 public MultiplicativeSetFactors<C> replace(List<GenPolynomial<C>> L) {
118 MultiplicativeSetFactors<C> ms = new MultiplicativeSetFactors<C>(ring);
119 if (L == null || L.size() == 0) {
120 return ms;
121 }
122 for (GenPolynomial<C> p : L) {
123 ms = ms.add(p);
124 }
125 return ms;
126 }
127
128 }