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