001/* 002 * $Id: ExpVectorLong.java 5379 2015-12-31 17:59:07Z 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)) { 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 substitution. Clone and set exponent to d at position i. 453 * @param i position. 454 * @param d new exponent. 455 * @return substituted ExpVector. 456 */ 457 @Override 458 public ExpVectorLong subst(int i, long d) { 459 ExpVectorLong V = this.copy(); 460 //long e = 461 V.setVal(i, d); 462 return V; 463 } 464 465 466 /** 467 * ExpVector signum. 468 * @return 0 if this is zero, -1 if some entry is negative, 1 if no entry is 469 * negative and at least one entry is positive. 470 */ 471 @Override 472 public int signum() { 473 int t = 0; 474 long[] u = val; 475 for (int i = 0; i < u.length; i++) { 476 if (u[i] < 0) { 477 return -1; 478 } 479 if (u[i] > 0) { 480 t = 1; 481 } 482 } 483 return t; 484 } 485 486 487 /** 488 * ExpVector total degree. 489 * @return sum of all exponents. 490 */ 491 @Override 492 public long totalDeg() { 493 long t = 0; 494 long[] u = val; // U.val; 495 for (int i = 0; i < u.length; i++) { 496 t += u[i]; 497 } 498 return t; 499 } 500 501 502 /** 503 * ExpVector maximal degree. 504 * @return maximal exponent. 505 */ 506 @Override 507 public long maxDeg() { 508 long t = 0; 509 long[] u = val; 510 for (int i = 0; i < u.length; i++) { 511 if (u[i] > t) { 512 t = u[i]; 513 } 514 } 515 return t; 516 } 517 518 519 /** 520 * ExpVector weighted degree. 521 * @param w weights. 522 * @return weighted sum of all exponents. 523 */ 524 @Override 525 public long weightDeg(long[][] w) { 526 if (w == null || w.length == 0) { 527 return totalDeg(); // assume weight 1 528 } 529 long t = 0; 530 long[] u = val; 531 for (int j = 0; j < w.length; j++) { 532 long[] wj = w[j]; 533 for (int i = 0; i < u.length; i++) { 534 t += wj[i] * u[i]; 535 } 536 } 537 return t; 538 } 539 540 541 /** 542 * ExpVector least common multiple. 543 * @param V 544 * @return component wise maximum of this and V. 545 */ 546 @Override 547 public ExpVectorLong lcm(ExpVector V) { 548 long[] u = val; 549 long[] v = ((ExpVectorLong) V).val; 550 long[] w = new long[u.length]; 551 for (int i = 0; i < u.length; i++) { 552 w[i] = (u[i] >= v[i] ? u[i] : v[i]); 553 } 554 return new ExpVectorLong(w, true); 555 } 556 557 558 /** 559 * ExpVector greatest common divisor. 560 * @param V 561 * @return component wise minimum of this and V. 562 */ 563 @Override 564 public ExpVectorLong gcd(ExpVector V) { 565 long[] u = val; 566 long[] v = ((ExpVectorLong) V).val; 567 long[] w = new long[u.length]; 568 for (int i = 0; i < u.length; i++) { 569 w[i] = (u[i] <= v[i] ? u[i] : v[i]); 570 } 571 return new ExpVectorLong(w, true); 572 } 573 574 575 /** 576 * ExpVector dependent variables. 577 * @return number of indices where val has positive exponents. 578 */ 579 public int dependentVariables() { 580 int l = 0; 581 for (int i = 0; i < val.length; i++) { 582 if (val[i] > 0) { 583 l++; 584 } 585 } 586 return l; 587 } 588 589 590 /** 591 * ExpVector dependency on variables. 592 * @return array of indices where val has positive exponents. 593 */ 594 @Override 595 public int[] dependencyOnVariables() { 596 long[] u = val; 597 int l = dependentVariables(); 598 int[] dep = new int[l]; 599 if (l == 0) { 600 return dep; 601 } 602 int j = 0; 603 for (int i = 0; i < u.length; i++) { 604 if (u[i] > 0) { 605 dep[j] = i; 606 j++; 607 } 608 } 609 return dep; 610 } 611 612 613 /** 614 * ExpVector multiple test. Test if this is component wise greater or equal 615 * to V. 616 * @param V 617 * @return true if this is a multiple of V, else false. 618 */ 619 @Override 620 public boolean multipleOf(ExpVector V) { 621 long[] u = val; 622 long[] v = ((ExpVectorLong) V).val; 623 for (int i = 0; i < u.length; i++) { 624 if (u[i] < v[i]) { 625 return false; 626 } 627 } 628 return true; 629 } 630 631 632 /** 633 * ExpVector compareTo. 634 * @param V 635 * @return 0 if U == V, -1 if U < V, 1 if U > V. 636 */ 637 @Override 638 public int compareTo(ExpVector V) { 639 return this.invLexCompareTo(V); 640 } 641 642 643 /** 644 * ExpVector inverse lexicographical compareTo. 645 * @param V 646 * @return 0 if U == V, -1 if U < V, 1 if U > V. 647 */ 648 @Override 649 public int invLexCompareTo(ExpVector V) { 650 long[] u = val; 651 long[] v = ((ExpVectorLong) V).val; 652 int t = 0; 653 for (int i = 0; i < u.length; i++) { 654 if (u[i] > v[i]) 655 return 1; 656 if (u[i] < v[i]) 657 return -1; 658 } 659 return t; 660 } 661 662 663 /** 664 * ExpVector inverse lexicographical compareTo. 665 * @param V 666 * @param begin 667 * @param end 668 * @return 0 if U == V, -1 if U < V, 1 if U > V. 669 */ 670 @Override 671 public int invLexCompareTo(ExpVector V, int begin, int end) { 672 long[] u = val; 673 long[] v = ((ExpVectorLong) V).val; 674 if (begin < 0) { 675 begin = 0;; 676 } 677 if (end >= val.length) { 678 end = val.length; 679 } 680 int t = 0; 681 for (int i = begin; i < end; i++) { 682 if (u[i] > v[i]) 683 return 1; 684 if (u[i] < v[i]) 685 return -1; 686 } 687 return t; 688 } 689 690 691 /** 692 * ExpVector inverse graded lexicographical compareTo. 693 * @param V 694 * @return 0 if U == V, -1 if U < V, 1 if U > V. 695 */ 696 @Override 697 public int invGradCompareTo(ExpVector V) { 698 long[] u = val; 699 long[] v = ((ExpVectorLong) V).val; 700 int t = 0; 701 int i; 702 for (i = 0; i < u.length; i++) { 703 if (u[i] > v[i]) { 704 t = 1; 705 break; 706 } 707 if (u[i] < v[i]) { 708 t = -1; 709 break; 710 } 711 } 712 if (t == 0) { 713 return t; 714 } 715 long up = 0; 716 long vp = 0; 717 for (int j = i; j < u.length; j++) { 718 up += u[j]; 719 vp += v[j]; 720 } 721 if (up > vp) { 722 t = 1; 723 } else { 724 if (up < vp) { 725 t = -1; 726 } 727 } 728 return t; 729 } 730 731 732 /** 733 * ExpVector inverse graded lexicographical compareTo. 734 * @param V 735 * @param begin 736 * @param end 737 * @return 0 if U == V, -1 if U < V, 1 if U > V. 738 */ 739 @Override 740 public int invGradCompareTo(ExpVector V, int begin, int end) { 741 long[] u = val; 742 long[] v = ((ExpVectorLong) V).val; 743 if (begin < 0) { 744 begin = 0;; 745 } 746 if (end >= val.length) { 747 end = val.length; 748 } 749 int t = 0; 750 int i; 751 for (i = begin; i < end; i++) { 752 if (u[i] > v[i]) { 753 t = 1; 754 break; 755 } 756 if (u[i] < v[i]) { 757 t = -1; 758 break; 759 } 760 } 761 if (t == 0) { 762 return t; 763 } 764 long up = 0; 765 long vp = 0; 766 for (int j = i; j < end; j++) { 767 up += u[j]; 768 vp += v[j]; 769 } 770 if (up > vp) { 771 t = 1; 772 } else { 773 if (up < vp) { 774 t = -1; 775 } 776 } 777 return t; 778 } 779 780 781 /** 782 * ExpVector reverse inverse lexicographical compareTo. 783 * @param V 784 * @return 0 if U == V, -1 if U < V, 1 if U > V. 785 */ 786 @Override 787 public int revInvLexCompareTo(ExpVector V) { 788 long[] u = val; 789 long[] v = ((ExpVectorLong) V).val; 790 int t = 0; 791 for (int i = u.length - 1; i >= 0; i--) { 792 if (u[i] > v[i]) 793 return 1; 794 if (u[i] < v[i]) 795 return -1; 796 } 797 return t; 798 } 799 800 801 /** 802 * ExpVector reverse inverse lexicographical compareTo. 803 * @param V 804 * @param begin 805 * @param end 806 * @return 0 if U == V, -1 if U < V, 1 if U > V. 807 */ 808 @Override 809 public int revInvLexCompareTo(ExpVector V, int begin, int end) { 810 long[] u = val; 811 long[] v = ((ExpVectorLong) V).val; 812 if (begin < 0) { 813 begin = 0;; 814 } 815 if (end >= val.length) { 816 end = val.length; 817 } 818 int t = 0; 819 for (int i = end - 1; i >= begin; i--) { 820 if (u[i] > v[i]) 821 return 1; 822 if (u[i] < v[i]) 823 return -1; 824 } 825 return t; 826 } 827 828 829 /** 830 * ExpVector reverse inverse graded compareTo. 831 * @param V 832 * @return 0 if U == V, -1 if U < V, 1 if U > V. 833 */ 834 @Override 835 public int revInvGradCompareTo(ExpVector V) { 836 long[] u = val; 837 long[] v = ((ExpVectorLong) V).val; 838 int t = 0; 839 int i; 840 for (i = u.length - 1; i >= 0; i--) { 841 if (u[i] > v[i]) { 842 t = 1; 843 break; 844 } 845 if (u[i] < v[i]) { 846 t = -1; 847 break; 848 } 849 } 850 if (t == 0) { 851 return t; 852 } 853 long up = 0; 854 long vp = 0; 855 for (int j = i; j >= 0; j--) { 856 up += u[j]; 857 vp += v[j]; 858 } 859 if (up > vp) { 860 t = 1; 861 } else { 862 if (up < vp) { 863 t = -1; 864 } 865 } 866 return t; 867 } 868 869 870 /** 871 * ExpVector reverse inverse graded compareTo. 872 * @param V 873 * @param begin 874 * @param end 875 * @return 0 if U == V, -1 if U < V, 1 if U > V. 876 */ 877 @Override 878 public int revInvGradCompareTo(ExpVector V, int begin, int end) { 879 long[] u = val; 880 long[] v = ((ExpVectorLong) V).val; 881 if (begin < 0) { 882 begin = 0;; 883 } 884 if (end >= val.length) { 885 end = val.length; 886 } 887 int t = 0; 888 int i; 889 for (i = end - 1; i >= begin; i--) { 890 if (u[i] > v[i]) { 891 t = 1; 892 break; 893 } 894 if (u[i] < v[i]) { 895 t = -1; 896 break; 897 } 898 } 899 if (t == 0) { 900 return t; 901 } 902 long up = 0; 903 long vp = 0; 904 for (int j = i; j >= begin; j--) { 905 up += u[j]; 906 vp += v[j]; 907 } 908 if (up > vp) { 909 t = 1; 910 } else { 911 if (up < vp) { 912 t = -1; 913 } 914 } 915 return t; 916 } 917 918 919 /** 920 * ExpVector inverse weighted lexicographical compareTo. 921 * @param w weight array. 922 * @param V 923 * @return 0 if U == V, -1 if U < V, 1 if U > V. 924 */ 925 @Override 926 public int invWeightCompareTo(long[][] w, ExpVector V) { 927 long[] u = val; 928 long[] v = ((ExpVectorLong) V).val; 929 int t = 0; 930 int i; 931 for (i = 0; i < u.length; i++) { 932 if (u[i] > v[i]) { 933 t = 1; 934 break; 935 } 936 if (u[i] < v[i]) { 937 t = -1; 938 break; 939 } 940 } 941 if (t == 0) { 942 return t; 943 } 944 for (int k = 0; k < w.length; k++) { 945 long[] wk = w[k]; 946 long up = 0; 947 long vp = 0; 948 for (int j = i; j < u.length; j++) { 949 up += wk[j] * u[j]; 950 vp += wk[j] * v[j]; 951 } 952 if (up > vp) { 953 return 1; 954 } else if (up < vp) { 955 return -1; 956 } 957 } 958 return t; 959 } 960 961 962 /** 963 * ExpVector inverse weighted lexicographical compareTo. 964 * @param w weight array. 965 * @param V 966 * @param begin 967 * @param end 968 * @return 0 if U == V, -1 if U < V, 1 if U > V. 969 */ 970 @Override 971 public int invWeightCompareTo(long[][] w, ExpVector V, int begin, int end) { 972 long[] u = val; 973 long[] v = ((ExpVectorLong) V).val; 974 if (begin < 0) { 975 begin = 0;; 976 } 977 if (end >= val.length) { 978 end = val.length; 979 } 980 int t = 0; 981 int i; 982 for (i = begin; i < end; 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 for (int k = 0; k < w.length; k++) { 996 long[] wk = w[k]; 997 long up = 0; 998 long vp = 0; 999 for (int j = i; j < end; j++) { 1000 up += wk[j] * u[j]; 1001 vp += wk[j] * v[j]; 1002 } 1003 if (up > vp) { 1004 return 1; 1005 } else if (up < vp) { 1006 return -1; 1007 } 1008 } 1009 return t; 1010 } 1011 1012}