001/* 002 * $Id: MultiplicativeSetFactors.java 5870 2018-07-20 15:56:23Z kredel $ 003 */ 004 005package edu.jas.gbufd; 006 007 008import java.util.ArrayList; 009import java.util.List; 010 011import org.apache.logging.log4j.Logger; 012import org.apache.logging.log4j.LogManager; 013 014import edu.jas.poly.GenPolynomial; 015import edu.jas.poly.GenPolynomialRing; 016import edu.jas.poly.PolyUtil; 017import edu.jas.structure.GcdRingElem; 018import edu.jas.ufd.FactorAbstract; 019import edu.jas.ufd.FactorFactory; 020 021 022/** 023 * Multiplicative set of irreducible polynomials. a, b in M implies a*b in M, 1 024 * in M. 025 * @param <C> coefficient type 026 * @author Heinz Kredel 027 */ 028public class MultiplicativeSetFactors<C extends GcdRingElem<C>> extends MultiplicativeSet<C> { 029 030 031 private static final Logger logger = LogManager.getLogger(MultiplicativeSetFactors.class); 032 033 034 //private static final boolean debug = logger.isDebugEnabled(); 035 036 037 /** 038 * Factors decomposition engine. 039 */ 040 protected final FactorAbstract<C> engine; 041 042 043 /** 044 * MultiplicativeSet constructor. Constructs an empty multiplicative set. 045 * @param ring polynomial ring factory for coefficients. 046 */ 047 public MultiplicativeSetFactors(GenPolynomialRing<C> ring) { 048 super(ring); 049 engine = FactorFactory.getImplementation(ring.coFac); 050 } 051 052 053 /** 054 * MultiplicativeSet constructor. 055 * @param ring polynomial ring factory for coefficients. 056 * @param ms a list of non-zero polynomials. 057 * @param eng factorization engine. 058 */ 059 protected MultiplicativeSetFactors(GenPolynomialRing<C> ring, List<GenPolynomial<C>> ms, 060 FactorAbstract<C> eng) { 061 super(ring, ms); 062 engine = eng; 063 } 064 065 066 /** 067 * toString. 068 * @see java.lang.Object#toString() 069 */ 070 @Override 071 public String toString() { 072 return "MultiplicativeSetFactors" + mset; 073 } 074 075 076 /** 077 * Comparison with any other object. 078 * @see java.lang.Object#equals(java.lang.Object) 079 */ 080 @Override 081 public boolean equals(Object B) { 082 if (!(B instanceof MultiplicativeSetFactors)) { 083 return false; 084 } 085 return super.equals(B); 086 } 087 088 089 /** 090 * Add polynomial to mset. 091 * @param cc polynomial to be added to mset. 092 * @return new multiplicative set. 093 */ 094 @Override 095 public MultiplicativeSetFactors<C> add(GenPolynomial<C> cc) { 096 if (cc == null || cc.isZERO() || cc.isConstant()) { 097 return this; 098 } 099 if (ring.coFac.isField()) { 100 cc = cc.monic(); 101 } 102 GenPolynomial<C> c = removeFactors(cc); 103 if (c.isConstant()) { 104 logger.info("skipped unit or constant = " + c); 105 return this; 106 } 107 List<GenPolynomial<C>> list = engine.factorsRadical(c); 108 logger.info("factorsRadical = " + list); 109 if (ring.coFac.isField()) { 110 list = PolyUtil.<C> monic(list); 111 } 112 List<GenPolynomial<C>> ms = new ArrayList<GenPolynomial<C>>(mset); 113 for (GenPolynomial<C> p : list) { 114 if (!p.isConstant() && !p.isZERO()) { 115 if (!mset.contains(p)) { 116 logger.info("added to irreducible mset = " + p); 117 ms.add(p); 118 } 119 } 120 } 121 return new MultiplicativeSetFactors<C>(ring, ms, engine); 122 } 123 124 125 /** 126 * Replace polynomial list of mset. 127 * @param L polynomial list to replace mset. 128 * @return new multiplicative set. 129 */ 130 @Override 131 public MultiplicativeSetFactors<C> replace(List<GenPolynomial<C>> L) { 132 MultiplicativeSetFactors<C> ms = new MultiplicativeSetFactors<C>(ring); 133 if (L == null || L.size() == 0) { 134 return ms; 135 } 136 for (GenPolynomial<C> p : L) { 137 ms = ms.add(p); 138 } 139 return ms; 140 } 141 142}