001    /*
002     * $Id: ExpVector.java 3497 2011-01-20 21:30:04Z kredel $
003     */
004    
005    package edu.jas.poly;
006    
007    import java.util.Random;
008    import java.util.List;
009    //import java.io.Serializable;
010    import java.util.Collection;
011    
012    import edu.jas.structure.RingElem;
013    import edu.jas.structure.RingFactory;
014    import edu.jas.structure.AbelianGroupElem;
015    import edu.jas.structure.AbelianGroupFactory;
016    import edu.jas.structure.Power;
017    
018    
019    /**
020     * ExpVector implements exponent vectors for polynomials.
021     * Exponent vectors are implemented as arrays of Java elementary types, 
022     * like long, int, short and byte.
023     * ExpVector provides also the familiar MAS static method names.
024     * The implementation is only tested for nonnegative exponents
025     * but should work also for negative exponents.
026     * Objects of this class are intended to be immutable, but 
027     * exponents can be set (during construction);
028     * also the hash code is only computed once, when needed. 
029     * The different storage unit implementations are <code>ExpVectorLong</code>
030     * <code>ExpVectorInteger</code>, <code>ExpVectorShort</code>
031     * and <code>ExpVectorByte</code>.
032     * The static factory methods <code>create()</code> of <code>ExpVector</code>
033     * select the respective storage unit.
034     * The selection of the desired storage unit is internally done via the static variable 
035     * <code>storunit</code>. This varaible should not be changed dynamically.
036     * @author Heinz Kredel
037     */
038    
039    public abstract class ExpVector implements AbelianGroupElem<ExpVector>
040                                               /*Cloneable, Serializable*/ {
041    
042    
043        /**
044         * Stored hash code.
045         */
046        protected int hash = 0;
047    
048    
049        /**
050         * Random number generator.
051         */
052        private final static Random random = new Random();
053    
054    
055        /**
056         * Storage representation of exponent arrays.
057         */
058        public static enum StorUnit { LONG, INT, SHORT, BYTE };
059    
060    
061        /**
062         * Used storage representation of exponent arrays.
063         * <b>Note:</b> Set this only statically and not dynamically. 
064         */
065        public final static StorUnit storunit = StorUnit.LONG;
066    
067    
068        /**
069         * Constructor for ExpVector.
070         */
071        public ExpVector() {
072           hash = 0;
073        }
074    
075    
076        /**
077         * Factory constructor for ExpVector.
078         * @param n length of exponent vector.
079         */
080        public static ExpVector create(int n) {
081            switch ( storunit ) {
082            case INT:   return new ExpVectorInteger(n);
083            case LONG:  return new ExpVectorLong(n);
084            case SHORT: return new ExpVectorShort(n);
085            case BYTE:  return new ExpVectorByte(n);
086            default:    return new ExpVectorInteger(n);
087            }
088        }
089    
090    
091        /**
092         * Factory constructor for ExpVector.
093         * Sets exponent i to e.
094         * @param n length of exponent vector.
095         * @param i index of exponent to be set.
096         * @param e exponent to be set.
097         */
098        public static ExpVector create(int n, int i, long e) {
099            switch ( storunit ) {
100            case INT:   return new ExpVectorInteger(n, i, e);
101            case LONG:  return new ExpVectorLong(n, i, e);
102            case SHORT: return new ExpVectorShort(n, i, e);
103            case BYTE:  return new ExpVectorByte(n, i, e);
104            default:    return new ExpVectorInteger(n, i, e);
105            }
106        }
107    
108    
109        /**
110         * Internal factory constructor for ExpVector.
111         * Sets val.
112         * @param v internal representation array.
113         */
114        public static ExpVector create(long[] v) {
115            switch ( storunit ) {
116            case INT:   return new ExpVectorInteger(v);
117            case LONG:  return new ExpVectorLong(v);
118            case SHORT: return new ExpVectorShort(v);
119            case BYTE:  return new ExpVectorByte(v);
120            default:    return new ExpVectorInteger(v);
121            }
122        }
123    
124    
125        /**
126         * Factory constructor for ExpVector.
127         * Converts a String representation to an ExpVector.
128         * Accepted format = (1,2,3,4,5,6,7).
129         * @param s String representation.
130         */
131        public static ExpVector create(String s) {
132            switch ( storunit ) {
133            case INT:   return new ExpVectorInteger(s);
134            case LONG:  return new ExpVectorLong(s);
135            case SHORT: return new ExpVectorShort(s);
136            case BYTE:  return new ExpVectorByte(s);
137            default:    return new ExpVectorInteger(s);
138            }
139        }
140    
141    
142        /**
143         * Factory constructor for ExpVector.
144         * Sets val.
145         * @param v collection of exponents.
146         */
147        public static ExpVector create(Collection<Long> v) {
148            long[] w = new long[ v.size() ];
149            int i = 0;
150            for ( Long k : v ) {
151                w[i++] = k;
152            }
153            return create(w);
154        }
155    
156    
157        /**
158         * Get the corresponding element factory.
159         * @return factory for this Element.
160         * @see edu.jas.structure.Element#factory()
161         */
162        public AbelianGroupFactory<ExpVector> factory() {
163            throw new UnsupportedOperationException("no factory implemented for ExpVector");
164        }
165    
166    
167        /**
168         * Is this structure finite or infinite.
169         * @return true if this structure is finite, else false.
170         * @see edu.jas.structure.ElemFactory#isFinite()
171         * <b>Note: </b> returns true because of finite set of values in each index.
172         */
173        public boolean isFinite() {
174            return true;
175        }
176    
177    
178        /** Clone this.
179         * @see java.lang.Object#clone()
180         */
181        @Override
182        public abstract ExpVector clone();
183    
184    
185        /**
186         * Get the exponent vector. 
187         * @return val.
188         */
189        /*package*/ abstract long[] getVal();
190    
191    
192        /**
193         * Get the exponent at position i. 
194         * @param i position.
195         * @return val[i].
196         */
197        public abstract long getVal(int i);
198    
199    
200        /**
201         * Set the exponent at position i to e. 
202         * @param i
203         * @param e
204         * @return old val[i].
205         */
206        protected abstract long setVal(int i, long e);
207    
208    
209        /**
210         * Get the length of this exponent vector. 
211         * @return val.length.
212         */
213        public abstract int length();
214    
215    
216        /**
217         * Extend variables. Used e.g. in module embedding.
218         * Extend this by i elements and set val[j] to e.
219         * @param i number of elements to extend.
220         * @param j index of element to be set.
221         * @param e new exponent for val[j].
222         * @return extended exponent vector.
223         */
224        public abstract ExpVector extend(int i, int j, long e);
225    
226    
227        /**
228         * Extend lower variables. 
229         * Extend this by i lower elements and set val[j] to e.
230         * @param i number of elements to extend.
231         * @param j index of element to be set.
232         * @param e new exponent for val[j].
233         * @return extended exponent vector.
234         */
235        public abstract ExpVector extendLower(int i, int j, long e);
236    
237    
238        /**
239         * Contract variables. Used e.g. in module embedding.
240         * Contract this to len elements.
241         * @param i position of first element to be copied.
242         * @param len new length.
243         * @return contracted exponent vector.
244         */
245        public abstract ExpVector contract(int i, int len);
246    
247    
248        /**
249         * Reverse variables. Used e.g. in opposite rings.
250         * @return reversed exponent vector.
251         */
252        public abstract ExpVector reverse();
253    
254    
255        /**
256         * Reverse j variables. Used e.g. in opposite rings.
257         * Reverses the first j-1 variables, the rest is unchanged.
258         * @param j index of first variable not reversed.
259         * @return reversed exponent vector.
260         */
261        public abstract ExpVector reverse(int j);
262    
263    
264        /**
265         * Combine with ExpVector. 
266         * Combine this with the other ExpVector V.
267         * @param V the other exponent vector.
268         * @return combined exponent vector.
269         */
270        public abstract ExpVector combine( ExpVector V );
271    
272    
273        /** Get the string representation.
274         * @see java.lang.Object#toString()
275         */
276        @Override
277        public String toString() {
278            StringBuffer s = new StringBuffer("(");
279            for (int i = 0; i < length(); i++ ) {
280                s.append( getVal(i) );
281                if ( i < length()-1 ) {
282                   s.append(",");
283                }
284            }
285            s.append(")");
286            return s.toString();
287        }
288    
289    
290        /** Get the string representation with variable names.
291         * @param vars names of variables.
292         * @see java.lang.Object#toString()
293         */
294        public String toString(String[] vars) {
295            String s = "";
296            boolean pit;
297            int r = length();
298            if ( r != vars.length ) {
299                //logger.warn("length mismatch " + r + " <> " + vars.length);
300                return toString();
301            }
302            if ( r == 0 ) {
303                return s;
304            }
305            long vi;
306            for (int i = r-1; i > 0; i-- ) {
307                vi = getVal( i );
308                if ( vi != 0 ) { 
309                    s += vars[ r-1-i ];
310                    if ( vi != 1 ) {
311                        s += "^" + vi;
312                    }
313                    pit = false;
314                    for ( int j = i-1; j >= 0; j-- ) {
315                        if ( getVal(j) != 0 ) {
316                           pit = true;
317                        }
318                    }
319                    if ( pit ) s += " * ";
320                }
321            }
322            vi = getVal( 0 );
323            if ( vi != 0 ) { 
324                s += vars[ r-1 ];
325                if ( vi != 1 ) {
326                    s += "^" + vi + "";
327                }
328            }
329            return s; 
330        }
331    
332    
333        /** Get a scripting compatible string representation.
334         * @return script compatible representation for this Element.
335         * @see edu.jas.structure.Element#toScript()
336         */
337        //JAVA6only: @Override
338        public String toScript() {
339            return toScript( stdVars()  );
340        }
341    
342    
343        /** Get a scripting compatible string representation.
344         * @return script compatible representation for this Element.
345         * @see edu.jas.structure.Element#toScript()
346         */
347        // @Override
348        public String toScript(String[] vars) {
349            // Python case
350            int r = length();
351            if ( r != vars.length ) {
352                return toString();
353            }
354            StringBuffer s = new StringBuffer();
355            boolean pit;
356            long vi;
357            for ( int i = r-1; i > 0; i-- ) {
358                vi = getVal( i );
359                if ( vi != 0 ) { 
360                    s.append( vars[ r-1-i ] );
361                    if ( vi != 1 ) {
362                        s.append("**" + vi);
363                    }
364                    pit = false;
365                    for ( int j = i-1; j >= 0; j-- ) {
366                        if ( getVal(j) != 0 ) {
367                           pit = true;
368                        }
369                    }
370                    if ( pit ) { 
371                        s.append(" * ");
372                    }
373                }
374            }
375            vi = getVal( 0 );
376            if ( vi != 0 ) { 
377                s.append( vars[ r-1 ] );
378                if ( vi != 1 ) {
379                    s.append("**" + vi);
380                }
381            }
382            return s.toString();
383        }
384    
385    
386        /** Get a scripting compatible string representation of the factory.
387         * @return script compatible representation for this ElemFactory.
388         * @see edu.jas.structure.Element#toScriptFactory()
389         */
390        //JAVA6only: @Override
391        public String toScriptFactory() {
392            // Python case
393            return "ExpVector()";
394        }
395    
396    
397        /** Get the variable name at index.
398         * @param idx index of the variable
399         * @param vars array of names of variables
400         * @return name of variable at the given index.
401         */
402        public String indexVarName(int idx, String...vars) {
403            return vars[length()-idx-1];
404        }
405    
406    
407        /** Get the array index of a variable at index.
408         * @param idx index of the variable
409         * @return array index of the variable.
410         */
411        public int varIndex(int idx) {
412            return length()-idx-1;
413        }
414    
415    
416        /** Get the index of a variable.
417         * @param x variable name to be searched.
418         * @param vars array of names of variables
419         * @return index of x in vars.
420         */
421        public int indexVar(String x, String...vars) {
422            for ( int i = 0; i < length(); i++ ) { 
423                if ( x.equals( vars[i] ) ) { 
424                    return length()-i-1;
425                }
426            }
427            return -1; // not found
428        }
429    
430    
431        /** Evaluate.
432         * @param cf ring factory for elements of a.
433         * @param a list of values.
434         * @return a_1^{e_1} * ... * a_n^{e_n}.
435         */
436        public <C extends RingElem<C>> C evaluate(RingFactory<C> cf, List<C> a) {
437            C c = cf.getONE();
438            for ( int i = 0; i < length(); i++ ) { 
439                 long ei = getVal(i);
440                 if (ei == 0L) {
441                     continue;
442                 }
443                 C ai = a.get(length()-1-i);
444                 if (ai.isZERO()) {
445                     return ai;
446                 }
447                 C pi = Power.<C>positivePower(ai,ei);
448                 c = c.multiply(pi);
449            }
450            return c;
451        }
452    
453    
454        /** Comparison with any other object.
455         * @see java.lang.Object#equals(java.lang.Object)
456         */
457        @Override
458        public boolean equals( Object B ) { 
459            if ( ! (B instanceof ExpVector) ) {
460                return false;
461            }
462            ExpVector b = (ExpVector)B;
463            int t = this.invLexCompareTo( b );
464            //System.out.println("equals: this = " + this + " B = " + B + " t = " + t);
465            return (0 == t);
466        }
467    
468    
469        /** hashCode.
470         * Optimized for small exponents, i.e. &le; 2<sup>4</sup>
471         * and small number of variables, i.e. &le; 8.
472         * @see java.lang.Object#hashCode()
473         */
474        @Override
475        public int hashCode() { 
476            if ( hash == 0 ) {
477               for (int i = 0; i < length(); i++ ) {
478                   hash = hash<<4 + getVal(i);
479               }
480               if ( hash == 0 ) {
481                  hash = 1;
482               }
483            }
484            return hash;
485        }
486    
487    
488        /** Is ExpVector zero. 
489         * @return If this has all elements 0 then true is returned, else false.
490         */
491        public boolean isZERO() { 
492            return ( 0 == this.signum() );
493        }
494    
495    
496        /**
497         * Standard variable names.
498         * Generate standard names for variables, 
499         * i.e. x0 to x(n-1). 
500         * @return standard names.
501         */
502        public String[] stdVars() {
503            return STDVARS("x",length());
504        }
505    
506    
507        /**
508         * Generate variable names.
509         * Generate names for variables, 
510         * i.e. prefix0 to prefix(n-1). 
511         * @param prefix name prefix.
512         * @return standard names.
513         */
514        public String[] stdVars(String prefix) {
515            return STDVARS(prefix,length());
516        }
517    
518    
519        /**
520         * Standard variable names.
521         * Generate standard names for variables, 
522         * i.e. x0 to x(n-1). 
523         * @param n size of names array
524         * @return standard names.
525         */
526        public static String[] STDVARS(int n) {
527            return STDVARS("x",n);
528        }
529    
530    
531        /**
532         * Generate variable names.
533         * Generate names for variables from given prefix.
534         * i.e. prefix0 to prefix(n-1). 
535         * @param n size of names array.
536         * @param prefix name prefix.
537         * @return vatiable names.
538         */
539        public static String[] STDVARS(String prefix, int n) {
540            String[] vars = new String[ n ];
541            if ( prefix == null || prefix.length() == 0 ) {
542                prefix = "x";
543            }
544            for ( int i = 0; i < n; i++) {
545                vars[i] = prefix + i; //(n-1-i);
546            }
547            return vars;
548        }
549    
550    
551        /**
552         * ExpVector absolute value.
553         * @param U
554         * @return abs(U).
555         */
556        public static ExpVector EVABS( ExpVector U ) {
557            return U.abs();
558        }
559    
560    
561        /**
562         * ExpVector absolute value.
563         * @return abs(this).
564         */
565        public abstract ExpVector abs();
566    
567    
568        /**
569         * ExpVector negate.
570         * @param U
571         * @return -U.
572         */
573        public static ExpVector EVNEG( ExpVector U ) {
574            return U.negate();
575        }
576    
577    
578        /**
579         * ExpVector negate.
580         * @return -this.
581         */
582        public abstract ExpVector negate( );
583    
584    
585        /**
586         * ExpVector summation.
587         * @param U
588         * @param V
589         * @return U+V.
590         */
591        public static ExpVector EVSUM( ExpVector U, ExpVector V ) {
592            return U.sum(V);
593        }
594    
595    
596        /**
597         * ExpVector summation.
598         * @param V
599         * @return this+V.
600         */
601        public abstract ExpVector sum( ExpVector V );
602    
603    
604        /**
605         * ExpVector difference.
606         * Result may have negative entries.
607         * @param U
608         * @param V
609         * @return U-V.
610         */
611        public static ExpVector EVDIF( ExpVector U, ExpVector V ) {
612            return U.subtract(V);
613        }
614    
615    
616        /**
617         * ExpVector subtract.
618         * Result may have negative entries.
619         * @param V
620         * @return this-V.
621         */
622        public abstract ExpVector subtract( ExpVector V );
623    
624    
625        /**
626         * ExpVector substitution.
627         * Clone and set exponent to d at position i.
628         * @param U
629         * @param i position.
630         * @param d new exponent.
631         * @return substituted ExpVector.
632         */
633        public static ExpVector EVSU( ExpVector U, int i, long d ) {
634            return U.subst(i,d);
635        }
636    
637    
638        /**
639         * ExpVector substitution.
640         * Clone and set exponent to d at position i.
641         * @param i position.
642         * @param d new exponent.
643         * @return substituted ExpVector.
644         */
645        public ExpVector subst( int i, long d ) {
646            ExpVector V = (ExpVector)this.clone();
647            long e = V.setVal( i, d );
648            return V;
649            //return EVSU(this, i, d);
650        }
651    
652    
653        /**
654         * Generate a random ExpVector.
655         * @param r length of new ExpVector. 
656         * @param k maximal degree in each exponent.
657         * @param q density of nozero exponents.
658         * @return random ExpVector.
659         */
660        public static ExpVector EVRAND( int r, long k, float q ) {
661            return EVRAND(r,k,q,random);
662        }
663    
664    
665        /**
666         * Generate a random ExpVector.
667         * @param r length of new ExpVector. 
668         * @param k maximal degree in each exponent.
669         * @param q density of nozero exponents.
670         * @param rnd is a source for random bits.
671         * @return random ExpVector.
672         */
673        public static ExpVector EVRAND( int r, long k, float q, Random rnd ) {
674            long[] w = new long[r];
675            long e;
676            float f;
677            for (int i = 0; i < w.length; i++ ) {
678                f = rnd.nextFloat(); 
679                if ( f > q ) { 
680                    e = 0; 
681                } else { 
682                    e = rnd.nextLong() % k; 
683                    if ( e < 0 ) {
684                        e = -e;
685                    } 
686                }
687                w[i] = e;
688            }
689            return create( w );
690            //return new ExpVector( w );
691        }
692    
693    
694        /**
695         * Generate a random ExpVector.
696         * @param r length of new ExpVector. 
697         * @param k maximal degree in each exponent.
698         * @param q density of nozero exponents.
699         * @return random ExpVector.
700         */
701        public static ExpVector random( int r, long k, float q ) {
702            return EVRAND(r,k,q,random);
703        }
704    
705    
706        /**
707         * Generate a random ExpVector.
708         * @param r length of new ExpVector. 
709         * @param k maximal degree in each exponent.
710         * @param q density of nozero exponents.
711         * @param rnd is a source for random bits.
712         * @return random ExpVector.
713         */
714        public static ExpVector random( int r, long k, float q, Random rnd ) {
715            return EVRAND(r,k,q,rnd);
716        }
717    
718    
719        /**
720         * ExpVector sign.
721         * @param U
722         * @return 0 if U is zero, -1 if some entry is negative, 
723         1 if no entry is negativ and at least one entry is positive.
724        */
725        public static int EVSIGN( ExpVector U ) {
726            return U.signum();
727        }
728    
729    
730        /**
731         * ExpVector signum.
732         * @return 0 if this is zero, -1 if some entry is negative, 
733         *  1 if no entry is negative and at least one entry is positive.
734         */
735        public abstract int signum();
736    
737    
738        /**
739         * ExpVector total degree.
740         * @param U
741         * @return sum of all exponents.
742         */
743        public static long EVTDEG( ExpVector U ) {
744            return U.totalDeg();
745        }
746    
747    
748        /**
749         * ExpVector total degree.
750         * @return sum of all exponents.
751         */
752        public abstract long totalDeg();
753    
754    
755        /**
756         * ExpVector maximal degree.
757         * @param U
758         * @return maximal exponent.
759         */
760        public static long EVMDEG( ExpVector U ) {
761            return U.maxDeg();
762        }
763    
764    
765        /**
766         * ExpVector maximal degree.
767         * @return maximal exponent.
768         */
769        public abstract long maxDeg();
770    
771    
772        /**
773         * ExpVector weighted degree.
774         * @param w weights.
775         * @param U
776         * @return weighted sum of all exponents.
777         */
778        public static long EVWDEG( long[][] w, ExpVector U ) {
779            return U.weightDeg( w );
780        }
781    
782    
783        /**
784         * ExpVector weighted degree.
785         * @param w weights.
786         * @return weighted sum of all exponents.
787         */
788        public abstract long weightDeg( long[][] w );
789    
790    
791        /**
792         * ExpVector least common multiple.
793         * @param U
794         * @param V
795         * @return component wise maximum of U and V.
796         */
797        public static ExpVector EVLCM( ExpVector U, ExpVector V ) {
798            return U.lcm(V);
799        }
800    
801    
802        /**
803         * ExpVector least common multiple.
804         * @param V
805         * @return component wise maximum of this and V.
806         */
807        public abstract ExpVector lcm( ExpVector V );
808    
809    
810        /**
811         * ExpVector greatest common divisor.
812         * @param U
813         * @param V
814         * @return component wise minimum of U and V.
815         */
816        public static ExpVector EVGCD( ExpVector U, ExpVector V ) {
817            return U.gcd(V);
818        }
819    
820    
821        /**
822         * ExpVector greatest common divisor.
823         * @param V
824         * @return component wise minimum of this and V.
825         */
826        public abstract ExpVector gcd( ExpVector V );
827    
828    
829        /**
830         * ExpVector dependency on variables.
831         * @param U
832         * @return array of indices where U has positive exponents.
833         */
834        public static int[] EVDOV( ExpVector U ) {
835            return U.dependencyOnVariables();
836        }
837    
838    
839        /**
840         * ExpVector dependency on variables.
841         * @return array of indices where val has positive exponents.
842         */
843        public abstract int[] dependencyOnVariables();
844    
845    
846        /**
847         * ExpVector multiple test.
848         * Test if U is component wise greater or equal to V.
849         * @param U
850         * @param V
851         * @return true if U is a multiple of V, else false.
852         */
853        public static boolean EVMT( ExpVector U, ExpVector V ) {
854            return U.multipleOf(V);
855        }
856    
857    
858        /**
859         * ExpVector multiple test.
860         * Test if this is component wise greater or equal to V.
861         * @param V
862         * @return true if this is a multiple of V, else false.
863         */
864        public abstract boolean multipleOf( ExpVector V );
865    
866    
867        /**
868         * ExpVector divides test.
869         * Test if V is component wise greater or equal to this.
870         * @param V
871         * @return true if this divides V, else false.
872         */
873        public boolean divides( ExpVector V ) {
874            return V.multipleOf(this);
875            //return EVMT(V, this);
876        }
877    
878    
879        /**
880         * ExpVector compareTo.
881         * @param V
882         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
883         */
884        //JAVA6only: @Override
885        public int compareTo( ExpVector V ) {
886            return this.invLexCompareTo(V);
887        }
888    
889    
890        /**
891         * Inverse lexicographical compare.
892         * @param U
893         * @param V
894         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
895         */
896        public static int EVILCP( ExpVector U, ExpVector V ) {
897            return U.invLexCompareTo(V);
898        }
899    
900    
901        /**
902         * ExpVector inverse lexicographical compareTo.
903         * @param V
904         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
905         */
906        public abstract int invLexCompareTo( ExpVector V );
907    
908    
909        /**
910         * Inverse lexicographical compare part.
911         * Compare entries between begin and end (-1).
912         * @param U
913         * @param V
914         * @param begin
915         * @param end
916         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
917         */
918        public static int EVILCP( ExpVector U, ExpVector V, int begin, int end ) {
919            return U.invLexCompareTo(V,begin,end);
920        }
921    
922    
923        /**
924         * ExpVector inverse lexicographical compareTo.
925         * @param V
926         * @param begin
927         * @param end
928         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
929         */
930        public abstract int invLexCompareTo( ExpVector V, int begin, int end );
931    
932    
933        /**
934         * Inverse graded lexicographical compare.
935         * @param U
936         * @param V
937         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
938         */
939        public static int EVIGLC( ExpVector U, ExpVector V ) {
940            return U.invGradCompareTo(V);
941        }
942    
943    
944        /**
945         * ExpVector inverse graded lexicographical compareTo.
946         * @param V
947         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
948         */
949        public abstract int invGradCompareTo( ExpVector V );
950    
951    
952        /**
953         * Inverse graded lexicographical compare part.
954         * Compare entries between begin and end (-1).
955         * @param U
956         * @param V
957         * @param begin
958         * @param end
959         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
960         */
961        public static int EVIGLC( ExpVector U, ExpVector V, int begin, int end ) {
962            return U.invGradCompareTo(V,begin,end);
963        }
964    
965    
966        /**
967         * ExpVector inverse graded lexicographical compareTo.
968         * @param V
969         * @param begin
970         * @param end
971         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
972         */
973        public abstract int invGradCompareTo( ExpVector V, int begin, int end );
974    
975    
976        /**
977         * Reverse inverse lexicographical compare.
978         * @param U
979         * @param V
980         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
981         */
982        public static int EVRILCP( ExpVector U, ExpVector V ) {
983            return U.revInvLexCompareTo(V);
984        }
985    
986    
987        /**
988         * ExpVector reverse inverse lexicographical compareTo.
989         * @param V
990         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
991         */
992        public abstract int revInvLexCompareTo( ExpVector V );
993    
994    
995        /**
996         * Reverse inverse lexicographical compare part.
997         * Compare entries between begin and end (-1).
998         * @param U
999         * @param V
1000         * @param begin
1001         * @param end
1002         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1003         */
1004        public static int EVRILCP( ExpVector U, ExpVector V, int begin, int end ) {
1005            return U.revInvLexCompareTo(V,begin,end);
1006        }
1007    
1008    
1009        /**
1010         * ExpVector reverse inverse lexicographical compareTo.
1011         * @param V
1012         * @param begin
1013         * @param end
1014         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1015         */
1016        public abstract int revInvLexCompareTo( ExpVector V, int begin, int end );
1017    
1018    
1019        /**
1020         * Reverse inverse graded lexicographical compare.
1021         * @param U
1022         * @param V
1023         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1024         */
1025        public static int EVRIGLC( ExpVector U, ExpVector V ) {
1026            return U.revInvGradCompareTo(V);
1027        }
1028    
1029    
1030        /**
1031         * ExpVector reverse inverse graded compareTo.
1032         * @param V
1033         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1034         */
1035        public abstract int revInvGradCompareTo( ExpVector V );
1036    
1037    
1038        /**
1039         * Reverse inverse graded lexicographical compare part.
1040         * Compare entries between begin and end (-1).
1041         * @param U
1042         * @param V
1043         * @param begin
1044         * @param end
1045         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1046         */
1047        public static int EVRIGLC( ExpVector U, ExpVector V, int begin, int end ) {
1048            return U.revInvGradCompareTo(V,begin,end);
1049        }
1050    
1051    
1052        /**
1053         * ExpVector reverse inverse graded compareTo.
1054         * @param V
1055         * @param begin
1056         * @param end
1057         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1058         */
1059        public abstract int revInvGradCompareTo( ExpVector V, int begin, int end );
1060    
1061    
1062        /**
1063         * Inverse weighted lexicographical compare.
1064         * @param w weight array.
1065         * @param U
1066         * @param V
1067         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1068         */
1069        public static int EVIWLC( long[][] w, ExpVector U, ExpVector V ) {
1070            return U.invWeightCompareTo(w,V);
1071        }
1072    
1073    
1074        /**
1075         * ExpVector inverse weighted lexicographical compareTo.
1076         * @param w weight array.
1077         * @param V
1078         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1079         */
1080        public abstract int invWeightCompareTo( long[][] w, ExpVector V );
1081    
1082    
1083        /**
1084         * Inverse weighted lexicographical compare part.
1085         * Compare entries between begin and end (-1).
1086         * @param w weight array.
1087         * @param U
1088         * @param V
1089         * @param begin
1090         * @param end
1091         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1092         */
1093        public static int EVIWLC( long[][] w, ExpVector U, ExpVector V, int begin, int end ) {
1094            return U.invWeightCompareTo(w,V,begin,end);
1095        }
1096    
1097    
1098        /**
1099         * ExpVector inverse weighted lexicographical compareTo.
1100         * @param w weight array.
1101         * @param V
1102         * @param begin
1103         * @param end
1104         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
1105         */
1106        public abstract int invWeightCompareTo( long[][] w, ExpVector V, int begin, int end );
1107    
1108    }