001/* 002 * $Id: MultiplicativeSetCoPrime.java 5870 2018-07-20 15:56:23Z kredel $ 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 * Add polynomial to mset. 090 * @param cc polynomial to be added to mset. 091 * @return new multiplicative set. 092 */ 093 @Override 094 public MultiplicativeSetCoPrime<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 List<GenPolynomial<C>> list; 102 if (mset.size() == 0) { 103 list = engine.coPrime(cc, mset); 104 if (ring.coFac.isField()) { 105 list = PolyUtil.<C> monic(list); 106 } 107 return new MultiplicativeSetCoPrime<C>(ring, list, engine); 108 } 109 GenPolynomial<C> c = removeFactors(cc); 110 if (c.isConstant()) { 111 logger.info("skipped unit or constant = " + c); 112 return this; 113 } 114 logger.info("added to co-prime mset = " + c); 115 list = engine.coPrime(c, mset); 116 if (ring.coFac.isField()) { 117 list = PolyUtil.<C> monic(list); 118 } 119 return new MultiplicativeSetCoPrime<C>(ring, list, engine); 120 } 121 122 123 /** 124 * Replace polynomial list of mset. 125 * @param L polynomial list to replace mset. 126 * @return new multiplicative set. 127 */ 128 @Override 129 public MultiplicativeSetCoPrime<C> replace(List<GenPolynomial<C>> L) { 130 MultiplicativeSetCoPrime<C> ms = new MultiplicativeSetCoPrime<C>(ring); 131 if (L == null || L.size() == 0) { 132 return ms; 133 } 134 for (GenPolynomial<C> p : L) { 135 ms = ms.add(p); 136 } 137 return ms; 138 } 139 140 141}