001/* 002 * $Id$ 003 */ 004 005package edu.jas.gbufd; 006 007 008import java.util.List; 009 010import org.apache.logging.log4j.Logger; 011import org.apache.logging.log4j.LogManager; 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.GCDFactory; 018import edu.jas.ufd.GreatestCommonDivisorAbstract; 019 020 021/** 022 * Multiplicative set of co-prime polynomials. a, b in M implies a*b in M, 1 in 023 * M. 024 * @param <C> coefficient type 025 * @author Heinz Kredel 026 */ 027public class MultiplicativeSetCoPrime<C extends GcdRingElem<C>> extends MultiplicativeSet<C> { 028 029 030 private static final Logger logger = LogManager.getLogger(MultiplicativeSetCoPrime.class); 031 032 033 //private static final boolean debug = logger.isDebugEnabled(); 034 035 036 /** 037 * Gcd computation engine. 038 */ 039 protected final GreatestCommonDivisorAbstract<C> engine; 040 041 042 /** 043 * MultiplicativeSet constructor. Constructs an empty multiplicative set. 044 * @param ring polynomial ring factory for coefficients. 045 */ 046 public MultiplicativeSetCoPrime(GenPolynomialRing<C> ring) { 047 super(ring); 048 engine = GCDFactory.getProxy(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 gcd computation engine. 057 */ 058 protected MultiplicativeSetCoPrime(GenPolynomialRing<C> ring, List<GenPolynomial<C>> ms, 059 GreatestCommonDivisorAbstract<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 "MultiplicativeSetCoPrime" + 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 MultiplicativeSetCoPrime)) { 082 return false; 083 } 084 return super.equals(B); 085 } 086 087 088 /** 089 * Hash code for this multiplicative set. 090 * @see java.lang.Object#hashCode() 091 */ 092 @Override 093 public int hashCode() { 094 return super.hashCode(); 095 } 096 097 098 /** 099 * Add polynomial to mset. 100 * @param cc polynomial to be added to mset. 101 * @return new multiplicative set. 102 */ 103 @Override 104 public MultiplicativeSetCoPrime<C> add(GenPolynomial<C> cc) { 105 if (cc == null || cc.isZERO() || cc.isConstant()) { 106 return this; 107 } 108 if (ring.coFac.isField()) { 109 cc = cc.monic(); 110 } 111 List<GenPolynomial<C>> list; 112 if (mset.size() == 0) { 113 list = engine.coPrime(cc, mset); 114 if (ring.coFac.isField()) { 115 list = PolyUtil.<C> monic(list); 116 } 117 return new MultiplicativeSetCoPrime<C>(ring, list, engine); 118 } 119 GenPolynomial<C> c = removeFactors(cc); 120 if (c.isConstant()) { 121 logger.info("skipped unit or constant = {}", c); 122 return this; 123 } 124 logger.info("added to co-prime mset = {}", c); 125 list = engine.coPrime(c, mset); 126 if (ring.coFac.isField()) { 127 list = PolyUtil.<C> monic(list); 128 } 129 return new MultiplicativeSetCoPrime<C>(ring, list, engine); 130 } 131 132 133 /** 134 * Replace polynomial list of mset. 135 * @param L polynomial list to replace mset. 136 * @return new multiplicative set. 137 */ 138 @Override 139 public MultiplicativeSetCoPrime<C> replace(List<GenPolynomial<C>> L) { 140 MultiplicativeSetCoPrime<C> ms = new MultiplicativeSetCoPrime<C>(ring); 141 if (L == null || L.size() == 0) { 142 return ms; 143 } 144 for (GenPolynomial<C> p : L) { 145 ms = ms.add(p); 146 } 147 return ms; 148 } 149 150 151}