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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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 < V, 1 if U > 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}