001/*
002 * $Id$
003 */
004
005package edu.jas.gb;
006
007
008import java.util.ArrayList;
009import java.util.List;
010
011import org.apache.logging.log4j.LogManager;
012import org.apache.logging.log4j.Logger;
013
014import edu.jas.poly.ExpVector;
015import edu.jas.poly.GenPolynomial;
016import edu.jas.structure.RingElem;
017
018
019/**
020 * Groebner Base GGV signature based sequential iterative algorithm. Implements
021 * Groebner bases.
022 * @param <C> coefficient type
023 * @author Heinz Kredel
024 * 
025 * @see edu.jas.application.GBAlgorithmBuilder
026 * @see edu.jas.gbufd.GBFactory
027 */
028
029public class GroebnerBaseGGVSigSeqIter<C extends RingElem<C>> extends GroebnerBaseSigSeqIter<C> {
030
031
032    private static final Logger logger = LogManager.getLogger(GroebnerBaseGGVSigSeqIter.class);
033
034
035    //private static final boolean debug = logger.isDebugEnabled();
036
037
038    /**
039     * Constructor.
040     */
041    public GroebnerBaseGGVSigSeqIter() {
042        this(new SigReductionSeq<C>());
043    }
044
045
046    /**
047     * Constructor.
048     * @param red Reduction engine
049     */
050    public GroebnerBaseGGVSigSeqIter(SigReductionSeq<C> red) {
051        super(red);
052    }
053
054
055    /**
056     * S-Polynomial.
057     * @param A polynomial.
058     * @param B polynomial.
059     * @return spol(A,B) the S-polynomial of A and B.
060     */
061    @Override
062    GenPolynomial<C> SPolynomial(SigPoly<C> A, SigPoly<C> B) {
063        return sred.SPolynomialHalf(A, B);
064    }
065
066
067    /**
068     * Prune total pair list P.
069     * @param P pair list.
070     * @param syz list of exponent vectors representing syzygies.
071     * @return updated pair list.
072     */
073    @Override
074    List<SigPair<C>> pruneP(List<SigPair<C>> P, List<ExpVector> syz) {
075        List<SigPair<C>> res = new ArrayList<SigPair<C>>(P.size());
076        for (SigPair<C> p : P) {
077            ExpVector f = p.sigma.leadingExpVector();
078            if (f == null) {
079                continue;
080            }
081            boolean div = false;
082            for (ExpVector e : syz) {
083                if (f.multipleOf(e)) {
084                    div = true;
085                    break;
086                }
087            }
088            if (div) {
089                continue;
090            }
091            res.add(p);
092        }
093        return res;
094    }
095
096
097    /**
098     * Prune pair list of degree d.
099     * @param S pair list.
100     * @param syz list of exponent vectors representing syzygies.
101     * @param done list of treated polynomials.
102     * @param G polynomial with signature list.
103     * @return updated pair list.
104     */
105    @Override
106    List<SigPair<C>> pruneS(List<SigPair<C>> S, List<ExpVector> syz, List<SigPoly<C>> done,
107                    List<SigPoly<C>> G) {
108        List<SigPair<C>> res = new ArrayList<SigPair<C>>(S.size());
109        for (SigPair<C> p : S) {
110            ExpVector f = p.sigma.leadingExpVector();
111            if (f == null) {
112                continue;
113            }
114            boolean div = false;
115            for (ExpVector e : syz) {
116                if (f.multipleOf(e)) {
117                    div = true;
118                    break;
119                }
120            }
121            if (div) {
122                continue;
123            }
124            div = false;
125            for (SigPair<C> q : S) {
126                if (f.equals(q.sigma.leadingExpVector())) {
127                    if (p.pi.poly.compareTo(q.pi.poly) < 0) {
128                        div = true;
129                        break;
130                    }
131                }
132            }
133            if (div) {
134                continue;
135            }
136            div = false;
137            for (SigPair<C> q : res) {
138                if (f.equals(q.sigma.leadingExpVector())) {
139                    div = true;
140                    break;
141                }
142            }
143            if (div) {
144                continue;
145            }
146            res.add(p);
147            logger.debug("added p = {}", p.sigma);
148        }
149        return res;
150    }
151
152
153    /**
154     * Initializes syzygy list.
155     * @param F polynomial list.
156     * @param G polynomial with signature list.
157     * @return list of exponent vectors representing syzygies.
158     */
159    @Override
160    List<ExpVector> initializeSyz(List<GenPolynomial<C>> F, List<SigPoly<C>> G) {
161        List<ExpVector> P = new ArrayList<ExpVector>();
162        for (GenPolynomial<C> p : F) {
163            if (p.isZERO()) {
164                continue;
165            }
166            P.add(p.leadingExpVector());
167        }
168        return P;
169    }
170
171
172    /**
173     * Update syzygy list.
174     * @param syz list of exponent vectors representing syzygies.
175     * @param r polynomial. <b>Note:</b> szy is modified to represent updated
176     *            list of exponent vectors.
177     */
178    @Override
179    void updateSyz(List<ExpVector> syz, SigPoly<C> r) {
180        if (r.poly.isZERO() && !r.sigma.isZERO()) {
181            syz.add(r.sigma.leadingExpVector());
182        }
183        return;
184    }
185
186}