001/*
002 * $Id$
003 */
004
005package edu.jas.poly;
006
007
008import java.util.Map;
009import java.util.Iterator;
010
011
012import edu.jas.structure.RingElem;
013import edu.jas.structure.RingFactory;
014
015
016/**
017 * Polynomial interface.
018 * Adds methods specific to polynomials.
019 * @param <C> ring element type
020 * @author Heinz Kredel
021 */
022
023public interface Polynomial<C extends RingElem<C>> 
024                 extends RingElem< Polynomial<C> > {
025
026    /**
027     * Leading monomial.
028     * @return first map entry.
029     */
030    public Map.Entry<ExpVector,C> leadingMonomial();
031
032
033    /**
034     * Leading exponent vector.
035     * @return first exponent.
036     */
037    public ExpVector leadingExpVector();
038
039
040    /**
041     * Leading base coefficient.
042     * @return first coefficient.
043     */
044    public C leadingBaseCoefficient();
045
046
047    /**
048     * Trailing base coefficient.
049     * @return coefficient of constant term.
050     */
051    public C trailingBaseCoefficient();
052
053
054    /**
055     * Reductum.
056     * @return this - leading monomial.
057     */
058    public Polynomial<C> reductum();
059
060
061    /**
062     * Extend variables. Used e.g. in module embedding.
063     * Extend all ExpVectors by i elements and multiply by x_j^k.
064     * @param pfac extended polynomial ring factory (by i variables).
065     * @param j index of variable to be used for multiplication.
066     * @param k exponent for x_j.
067     * @return extended polynomial.
068     */
069    public Polynomial<C> extend(PolynomialRing<C> pfac, int j, long k);
070
071
072    /**
073     * Contract variables. Used e.g. in module embedding.
074     * remove i elements of each ExpVector.
075     * @param pfac contracted polynomial ring factory (by i variables).
076     * @return Map of exponents and contracted polynomials.
077     * <b>Note:</b> could return SortedMap
078     */
079    public Map<ExpVector,Polynomial<C>> contract(PolynomialRing<C> pfac);
080
081
082    /**
083     * Reverse variables. Used e.g. in opposite rings.
084     * @return polynomial with reversed variables.
085     */
086    public Polynomial<C> reverse(PolynomialRing<C> oring);
087
088
089    /**
090     * Iterator over coefficients. 
091     * @return val.values().iterator().
092     */
093    public Iterator<C> coefficientIterator();
094
095
096    /**
097     * Iterator over exponents. 
098     * @return val.keySet().iterator().
099     */
100    public Iterator<ExpVector> exponentIterator();
101
102
103    /**
104     * Iterator over monomials. 
105     * @return a PolyIterator.
106     */
107    public Iterator<Monomial<C>> monomialIterator();
108
109
110}