001    /*
002     * $Id: Polynomial.java 1801 2008-05-19 20:50:39Z kredel $
003     */
004    
005    package edu.jas.poly;
006    
007    
008    import java.util.Map;
009    import java.util.Iterator;
010    
011    
012    import edu.jas.structure.RingElem;
013    import 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    
023    public 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    }