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}