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 }