001/* 002 * $Id: MultiplicativeSetFactors.java 4061 2012-07-27 12:03:20Z kredel $ 003 */ 004 005package edu.jas.gbufd; 006 007 008import java.util.ArrayList; 009import java.util.List; 010 011import org.apache.log4j.Logger; 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.FactorAbstract; 018import 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 */ 027public 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 * 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 MultiplicativeSetFactors)) { 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 MultiplicativeSetFactors<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 GenPolynomial<C> c = removeFactors(cc); 102 if (c.isConstant()) { 103 logger.info("skipped unit or constant = " + c); 104 return this; 105 } 106 List<GenPolynomial<C>> list = engine.factorsRadical(c); 107 logger.info("factorsRadical = " + list); 108 if (ring.coFac.isField()) { 109 list = PolyUtil.<C> monic(list); 110 } 111 List<GenPolynomial<C>> ms = new ArrayList<GenPolynomial<C>>(mset); 112 for (GenPolynomial<C> p : list) { 113 if (!p.isConstant() && !p.isZERO()) { 114 if (!mset.contains(p)) { 115 logger.info("added to irreducible mset = " + p); 116 ms.add(p); 117 } 118 } 119 } 120 return new MultiplicativeSetFactors<C>(ring, ms, engine); 121 } 122 123 124 /** 125 * Replace polynomial list of mset. 126 * @param L polynomial list to replace mset. 127 * @return new multiplicative set. 128 */ 129 @Override 130 public MultiplicativeSetFactors<C> replace(List<GenPolynomial<C>> L) { 131 MultiplicativeSetFactors<C> ms = new MultiplicativeSetFactors<C>(ring); 132 if (L == null || L.size() == 0) { 133 return ms; 134 } 135 for (GenPolynomial<C> p : L) { 136 ms = ms.add(p); 137 } 138 return ms; 139 } 140 141}