Mercurial > lasercutter
view src/clojure/lang/Numbers.java @ 10:ef7dbbd6452c
added clojure source goodness
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 21 Aug 2010 06:25:44 -0400 |
parents | |
children |
line wrap: on
line source
1 /**2 * Copyright (c) Rich Hickey. All rights reserved.3 * The use and distribution terms for this software are covered by the4 * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)5 * which can be found in the file epl-v10.html at the root of this distribution.6 * By using this software in any fashion, you are agreeing to be bound by7 * the terms of this license.8 * You must not remove this notice, or any other, from this software.9 **/11 /* rich Mar 31, 2008 */13 package clojure.lang;15 import java.math.BigInteger;16 import java.math.BigDecimal;17 import java.math.MathContext;19 public class Numbers{21 static interface Ops{22 Ops combine(Ops y);24 Ops opsWith(IntegerOps x);26 Ops opsWith(LongOps x);28 Ops opsWith(FloatOps x);30 Ops opsWith(DoubleOps x);32 Ops opsWith(RatioOps x);34 Ops opsWith(BigIntegerOps x);36 Ops opsWith(BigDecimalOps x);38 public boolean isZero(Number x);40 public boolean isPos(Number x);42 public boolean isNeg(Number x);44 public Number add(Number x, Number y);46 public Number multiply(Number x, Number y);48 public Number divide(Number x, Number y);50 public Number quotient(Number x, Number y);52 public Number remainder(Number x, Number y);54 public boolean equiv(Number x, Number y);56 public boolean lt(Number x, Number y);58 public Number negate(Number x);60 public Number inc(Number x);62 public Number dec(Number x);63 }65 static interface BitOps{66 BitOps combine(BitOps y);68 BitOps bitOpsWith(IntegerBitOps x);70 BitOps bitOpsWith(LongBitOps x);72 BitOps bitOpsWith(BigIntegerBitOps x);74 public Number not(Number x);76 public Number and(Number x, Number y);78 public Number or(Number x, Number y);80 public Number xor(Number x, Number y);82 public Number andNot(Number x, Number y);84 public Number clearBit(Number x, int n);86 public Number setBit(Number x, int n);88 public Number flipBit(Number x, int n);90 public boolean testBit(Number x, int n);92 public Number shiftLeft(Number x, int n);94 public Number shiftRight(Number x, int n);95 }98 static public boolean isZero(Object x){99 return ops(x).isZero((Number)x);100 }102 static public boolean isPos(Object x){103 return ops(x).isPos((Number)x);104 }106 static public boolean isNeg(Object x){107 return ops(x).isNeg((Number)x);108 }110 static public Number minus(Object x){111 return ops(x).negate((Number)x);112 }114 static public Number inc(Object x){115 return ops(x).inc((Number)x);116 }118 static public Number dec(Object x){119 return ops(x).dec((Number)x);120 }122 static public Number add(Object x, Object y){123 return ops(x).combine(ops(y)).add((Number)x, (Number)y);124 }126 static public Number minus(Object x, Object y){127 Ops yops = ops(y);128 return ops(x).combine(yops).add((Number)x, yops.negate((Number)y));129 }131 static public Number multiply(Object x, Object y){132 return ops(x).combine(ops(y)).multiply((Number)x, (Number)y);133 }135 static public Number divide(Object x, Object y){136 Ops yops = ops(y);137 if(yops.isZero((Number)y))138 throw new ArithmeticException("Divide by zero");139 return ops(x).combine(yops).divide((Number)x, (Number)y);140 }142 static public Number quotient(Number x, Number y){143 Ops yops = ops(y);144 if(yops.isZero(y))145 throw new ArithmeticException("Divide by zero");146 return reduce(ops(x).combine(yops).quotient(x, y));147 }149 static public Number remainder(Number x, Number y){150 Ops yops = ops(y);151 if(yops.isZero(y))152 throw new ArithmeticException("Divide by zero");153 return reduce(ops(x).combine(yops).remainder(x, y));154 }156 static Number quotient(double n, double d){157 double q = n / d;158 if(q <= Integer.MAX_VALUE && q >= Integer.MIN_VALUE)159 {160 return (int) q;161 }162 else163 { //bigint quotient164 return reduce(new BigDecimal(q).toBigInteger());165 }166 }168 static Number remainder(double n, double d){169 double q = n / d;170 if(q <= Integer.MAX_VALUE && q >= Integer.MIN_VALUE)171 {172 return (n - ((int) q) * d);173 }174 else175 { //bigint quotient176 Number bq = reduce(new BigDecimal(q).toBigInteger());177 return (n - bq.doubleValue() * d);178 }179 }181 static public boolean equiv(Object x, Object y){182 return equiv((Number) x, (Number) y);183 }185 static public boolean equiv(Number x, Number y){186 return ops(x).combine(ops(y)).equiv(x, y);187 }189 static public boolean lt(Object x, Object y){190 return ops(x).combine(ops(y)).lt((Number)x, (Number)y);191 }193 static public boolean lte(Object x, Object y){194 return !ops(x).combine(ops(y)).lt((Number)y, (Number)x);195 }197 static public boolean gt(Object x, Object y){198 return ops(x).combine(ops(y)).lt((Number)y, (Number)x);199 }201 static public boolean gte(Object x, Object y){202 return !ops(x).combine(ops(y)).lt((Number)x, (Number)y);203 }205 static public int compare(Number x, Number y){206 Ops ops = ops(x).combine(ops(y));207 if(ops.lt(x, y))208 return -1;209 else if(ops.lt(y, x))210 return 1;211 return 0;212 }214 static BigInteger toBigInteger(Object x){215 if(x instanceof BigInteger)216 return (BigInteger) x;217 else218 return BigInteger.valueOf(((Number) x).longValue());219 }221 static BigDecimal toBigDecimal(Object x){222 if(x instanceof BigDecimal)223 return (BigDecimal) x;224 else if(x instanceof BigInteger)225 return new BigDecimal((BigInteger) x);226 else227 return BigDecimal.valueOf(((Number) x).longValue());228 }230 static Ratio toRatio(Object x){231 if(x instanceof Ratio)232 return (Ratio) x;233 else if(x instanceof BigDecimal)234 {235 BigDecimal bx = (BigDecimal) x;236 BigInteger bv = bx.unscaledValue();237 int scale = bx.scale();238 if(scale < 0)239 return new Ratio(bv.multiply(BigInteger.TEN.pow(-scale)), BigInteger.ONE);240 else241 return new Ratio(bv, BigInteger.TEN.pow(scale));242 }243 return new Ratio(toBigInteger(x), BigInteger.ONE);244 }246 static public Number rationalize(Number x){247 if(x instanceof Float || x instanceof Double)248 return rationalize(BigDecimal.valueOf(x.doubleValue()));249 else if(x instanceof BigDecimal)250 {251 BigDecimal bx = (BigDecimal) x;252 BigInteger bv = bx.unscaledValue();253 int scale = bx.scale();254 if(scale < 0)255 return bv.multiply(BigInteger.TEN.pow(-scale));256 else257 return divide(bv, BigInteger.TEN.pow(scale));258 }259 return x;260 }262 static public Number reduce(Number val){263 if(val instanceof Long)264 return reduce(val.longValue());265 else if (val instanceof BigInteger)266 return reduce((BigInteger) val);267 return val;268 }270 static public Number reduce(BigInteger val){271 int bitLength = val.bitLength();272 if(bitLength < 32)273 return val.intValue();274 else if(bitLength < 64)275 return val.longValue();276 else277 return val;278 }280 static public Number reduce(long val){281 if(val >= Integer.MIN_VALUE && val <= Integer.MAX_VALUE)282 return (int) val;283 else284 return val;285 }287 static public Number divide(BigInteger n, BigInteger d){288 if(d.equals(BigInteger.ZERO))289 throw new ArithmeticException("Divide by zero");290 BigInteger gcd = n.gcd(d);291 if(gcd.equals(BigInteger.ZERO))292 return 0;293 n = n.divide(gcd);294 d = d.divide(gcd);295 if(d.equals(BigInteger.ONE))296 return reduce(n);297 else if(d.equals(BigInteger.ONE.negate()))298 return reduce(n.negate());299 return new Ratio((d.signum() < 0 ? n.negate() : n),300 (d.signum() < 0 ? d.negate() : d));301 }303 static public Number not(Object x){304 return bitOps(x).not((Number)x);305 }308 static public Number and(Object x, Object y){309 return bitOps(x).combine(bitOps(y)).and((Number)x, (Number)y);310 }312 static public Number or(Object x, Object y){313 return bitOps(x).combine(bitOps(y)).or((Number)x, (Number)y);314 }316 static public Number xor(Object x, Object y){317 return bitOps(x).combine(bitOps(y)).xor((Number)x, (Number)y);318 }320 static public Number andNot(Number x, Number y){321 return bitOps(x).combine(bitOps(y)).andNot(x, y);322 }324 static public Number clearBit(Number x, int n){325 if(n < 0)326 throw new ArithmeticException("Negative bit index");327 return bitOps(x).clearBit(x, n);328 }330 static public Number setBit(Number x, int n){331 if(n < 0)332 throw new ArithmeticException("Negative bit index");333 return bitOps(x).setBit(x, n);334 }336 static public Number flipBit(Number x, int n){337 if(n < 0)338 throw new ArithmeticException("Negative bit index");339 return bitOps(x).flipBit(x, n);340 }342 static public boolean testBit(Number x, int n){343 if(n < 0)344 throw new ArithmeticException("Negative bit index");345 return bitOps(x).testBit(x, n);346 }348 static public Number shiftLeft(Object x, Object n){349 return bitOps(x).shiftLeft((Number)x, ((Number)n).intValue());350 }352 static public int shiftLeft(int x, int n){353 return x << n;354 }356 static public Number shiftRight(Object x, Object n){357 return bitOps(x).shiftRight((Number)x, ((Number)n).intValue());358 }360 static public int shiftRight(int x, int n){361 return x >> n;362 }364 final static class IntegerOps implements Ops{365 public Ops combine(Ops y){366 return y.opsWith(this);367 }369 final public Ops opsWith(IntegerOps x){370 return this;371 }373 final public Ops opsWith(LongOps x){374 return LONG_OPS;375 }377 final public Ops opsWith(FloatOps x){378 return FLOAT_OPS;379 }381 final public Ops opsWith(DoubleOps x){382 return DOUBLE_OPS;383 }385 final public Ops opsWith(RatioOps x){386 return RATIO_OPS;387 }389 final public Ops opsWith(BigIntegerOps x){390 return BIGINTEGER_OPS;391 }393 final public Ops opsWith(BigDecimalOps x){394 return BIGDECIMAL_OPS;395 }397 public boolean isZero(Number x){398 return x.intValue() == 0;399 }401 public boolean isPos(Number x){402 return x.intValue() > 0;403 }405 public boolean isNeg(Number x){406 return x.intValue() < 0;407 }409 final public Number add(Number x, Number y){410 long ret = x.longValue() + y.longValue();411 if(ret <= Integer.MAX_VALUE && ret >= Integer.MIN_VALUE)412 return (int) ret;413 return ret;414 }416 final public Number multiply(Number x, Number y){417 long ret = x.longValue() * y.longValue();418 if(ret <= Integer.MAX_VALUE && ret >= Integer.MIN_VALUE)419 return (int) ret;420 return ret;421 }423 static int gcd(int u, int v){424 while(v != 0)425 {426 int r = u % v;427 u = v;428 v = r;429 }430 return u;431 }433 public Number divide(Number x, Number y){434 int n = x.intValue();435 int val = y.intValue();436 int gcd = gcd(n, val);437 if(gcd == 0)438 return 0;440 n = n / gcd;441 int d = val / gcd;442 if(d == 1)443 return n;444 if(d < 0)445 {446 n = -n;447 d = -d;448 }449 return new Ratio(BigInteger.valueOf(n), BigInteger.valueOf(d));450 }452 public Number quotient(Number x, Number y){453 return x.intValue() / y.intValue();454 }456 public Number remainder(Number x, Number y){457 return x.intValue() % y.intValue();458 }460 public boolean equiv(Number x, Number y){461 return x.intValue() == y.intValue();462 }464 public boolean lt(Number x, Number y){465 return x.intValue() < y.intValue();466 }468 //public Number subtract(Number x, Number y);469 final public Number negate(Number x){470 int val = x.intValue();471 if(val > Integer.MIN_VALUE)472 return -val;473 return -((long) val);474 }476 public Number inc(Number x){477 int val = x.intValue();478 if(val < Integer.MAX_VALUE)479 return val + 1;480 return (long) val + 1;481 }483 public Number dec(Number x){484 int val = x.intValue();485 if(val > Integer.MIN_VALUE)486 return val - 1;487 return (long) val - 1;488 }489 }491 final static class LongOps implements Ops{492 public Ops combine(Ops y){493 return y.opsWith(this);494 }496 final public Ops opsWith(IntegerOps x){497 return this;498 }500 final public Ops opsWith(LongOps x){501 return this;502 }504 final public Ops opsWith(FloatOps x){505 return FLOAT_OPS;506 }508 final public Ops opsWith(DoubleOps x){509 return DOUBLE_OPS;510 }512 final public Ops opsWith(RatioOps x){513 return RATIO_OPS;514 }516 final public Ops opsWith(BigIntegerOps x){517 return BIGINTEGER_OPS;518 }520 final public Ops opsWith(BigDecimalOps x){521 return BIGDECIMAL_OPS;522 }524 public boolean isZero(Number x){525 return x.longValue() == 0;526 }528 public boolean isPos(Number x){529 return x.longValue() > 0;530 }532 public boolean isNeg(Number x){533 return x.longValue() < 0;534 }536 final public Number add(Number x, Number y){537 long lx = x.longValue(), ly = y.longValue();538 long ret = lx + ly;539 if ((ret ^ lx) < 0 && (ret ^ ly) < 0)540 return BIGINTEGER_OPS.add(x, y);541 return ret;542 }544 final public Number multiply(Number x, Number y){545 long lx = x.longValue(), ly = y.longValue();546 long ret = lx * ly;547 if (ly != 0 && ret/ly != lx)548 return BIGINTEGER_OPS.multiply(x, y);549 return ret;550 }552 static long gcd(long u, long v){553 while(v != 0)554 {555 long r = u % v;556 u = v;557 v = r;558 }559 return u;560 }562 public Number divide(Number x, Number y){563 long n = x.longValue();564 long val = y.longValue();565 long gcd = gcd(n, val);566 if(gcd == 0)567 return 0;569 n = n / gcd;570 long d = val / gcd;571 if(d == 1)572 return n;573 if(d < 0)574 {575 n = -n;576 d = -d;577 }578 return new Ratio(BigInteger.valueOf(n), BigInteger.valueOf(d));579 }581 public Number quotient(Number x, Number y){582 return x.longValue() / y.longValue();583 }585 public Number remainder(Number x, Number y){586 return x.longValue() % y.longValue();587 }589 public boolean equiv(Number x, Number y){590 return x.longValue() == y.longValue();591 }593 public boolean lt(Number x, Number y){594 return x.longValue() < y.longValue();595 }597 //public Number subtract(Number x, Number y);598 final public Number negate(Number x){599 long val = x.longValue();600 if(val > Long.MIN_VALUE)601 return -val;602 return BigInteger.valueOf(val).negate();603 }605 public Number inc(Number x){606 long val = x.longValue();607 if(val < Long.MAX_VALUE)608 return val + 1;609 return BIGINTEGER_OPS.inc(x);610 }612 public Number dec(Number x){613 long val = x.longValue();614 if(val > Long.MIN_VALUE)615 return val - 1;616 return BIGINTEGER_OPS.dec(x);617 }618 }620 final static class FloatOps implements Ops{621 public Ops combine(Ops y){622 return y.opsWith(this);623 }625 final public Ops opsWith(IntegerOps x){626 return this;627 }629 final public Ops opsWith(LongOps x){630 return this;631 }633 final public Ops opsWith(FloatOps x){634 return this;635 }637 final public Ops opsWith(DoubleOps x){638 return DOUBLE_OPS;639 }641 final public Ops opsWith(RatioOps x){642 return this;643 }645 final public Ops opsWith(BigIntegerOps x){646 return this;647 }649 final public Ops opsWith(BigDecimalOps x){650 return this;651 }653 public boolean isZero(Number x){654 return x.floatValue() == 0;655 }657 public boolean isPos(Number x){658 return x.floatValue() > 0;659 }661 public boolean isNeg(Number x){662 return x.floatValue() < 0;663 }665 final public Number add(Number x, Number y){666 return x.floatValue() + y.floatValue();667 }669 final public Number multiply(Number x, Number y){670 return x.floatValue() * y.floatValue();671 }673 public Number divide(Number x, Number y){674 return x.floatValue() / y.floatValue();675 }677 public Number quotient(Number x, Number y){678 return Numbers.quotient(x.doubleValue(), y.doubleValue());679 }681 public Number remainder(Number x, Number y){682 return Numbers.remainder(x.doubleValue(), y.doubleValue());683 }685 public boolean equiv(Number x, Number y){686 return x.floatValue() == y.floatValue();687 }689 public boolean lt(Number x, Number y){690 return x.floatValue() < y.floatValue();691 }693 //public Number subtract(Number x, Number y);694 final public Number negate(Number x){695 return -x.floatValue();696 }698 public Number inc(Number x){699 return x.floatValue() + 1;700 }702 public Number dec(Number x){703 return x.floatValue() - 1;704 }705 }707 final static class DoubleOps implements Ops{708 public Ops combine(Ops y){709 return y.opsWith(this);710 }712 final public Ops opsWith(IntegerOps x){713 return this;714 }716 final public Ops opsWith(LongOps x){717 return this;718 }720 final public Ops opsWith(FloatOps x){721 return this;722 }724 final public Ops opsWith(DoubleOps x){725 return this;726 }728 final public Ops opsWith(RatioOps x){729 return this;730 }732 final public Ops opsWith(BigIntegerOps x){733 return this;734 }736 final public Ops opsWith(BigDecimalOps x){737 return this;738 }740 public boolean isZero(Number x){741 return x.doubleValue() == 0;742 }744 public boolean isPos(Number x){745 return x.doubleValue() > 0;746 }748 public boolean isNeg(Number x){749 return x.doubleValue() < 0;750 }752 final public Number add(Number x, Number y){753 return x.doubleValue() + y.doubleValue();754 }756 final public Number multiply(Number x, Number y){757 return x.doubleValue() * y.doubleValue();758 }760 public Number divide(Number x, Number y){761 return x.doubleValue() / y.doubleValue();762 }764 public Number quotient(Number x, Number y){765 return Numbers.quotient(x.doubleValue(), y.doubleValue());766 }768 public Number remainder(Number x, Number y){769 return Numbers.remainder(x.doubleValue(), y.doubleValue());770 }772 public boolean equiv(Number x, Number y){773 return x.doubleValue() == y.doubleValue();774 }776 public boolean lt(Number x, Number y){777 return x.doubleValue() < y.doubleValue();778 }780 //public Number subtract(Number x, Number y);781 final public Number negate(Number x){782 return -x.doubleValue();783 }785 public Number inc(Number x){786 return x.doubleValue() + 1;787 }789 public Number dec(Number x){790 return x.doubleValue() - 1;791 }792 }794 final static class RatioOps implements Ops{795 public Ops combine(Ops y){796 return y.opsWith(this);797 }799 final public Ops opsWith(IntegerOps x){800 return this;801 }803 final public Ops opsWith(LongOps x){804 return this;805 }807 final public Ops opsWith(FloatOps x){808 return FLOAT_OPS;809 }811 final public Ops opsWith(DoubleOps x){812 return DOUBLE_OPS;813 }815 final public Ops opsWith(RatioOps x){816 return this;817 }819 final public Ops opsWith(BigIntegerOps x){820 return this;821 }823 final public Ops opsWith(BigDecimalOps x){824 return this;825 }827 public boolean isZero(Number x){828 Ratio r = (Ratio) x;829 return r.numerator.signum() == 0;830 }832 public boolean isPos(Number x){833 Ratio r = (Ratio) x;834 return r.numerator.signum() > 0;835 }837 public boolean isNeg(Number x){838 Ratio r = (Ratio) x;839 return r.numerator.signum() < 0;840 }842 final public Number add(Number x, Number y){843 Ratio rx = toRatio(x);844 Ratio ry = toRatio(y);845 return divide(ry.numerator.multiply(rx.denominator)846 .add(rx.numerator.multiply(ry.denominator))847 , ry.denominator.multiply(rx.denominator));848 }850 final public Number multiply(Number x, Number y){851 Ratio rx = toRatio(x);852 Ratio ry = toRatio(y);853 return Numbers.divide(ry.numerator.multiply(rx.numerator)854 , ry.denominator.multiply(rx.denominator));855 }857 public Number divide(Number x, Number y){858 Ratio rx = toRatio(x);859 Ratio ry = toRatio(y);860 return Numbers.divide(ry.denominator.multiply(rx.numerator)861 , ry.numerator.multiply(rx.denominator));862 }864 public Number quotient(Number x, Number y){865 Ratio rx = toRatio(x);866 Ratio ry = toRatio(y);867 BigInteger q = rx.numerator.multiply(ry.denominator).divide(868 rx.denominator.multiply(ry.numerator));869 return reduce(q);870 }872 public Number remainder(Number x, Number y){873 Ratio rx = toRatio(x);874 Ratio ry = toRatio(y);875 BigInteger q = rx.numerator.multiply(ry.denominator).divide(876 rx.denominator.multiply(ry.numerator));877 return Numbers.minus(x, Numbers.multiply(q, y));878 }880 public boolean equiv(Number x, Number y){881 Ratio rx = toRatio(x);882 Ratio ry = toRatio(y);883 return rx.numerator.equals(ry.numerator)884 && rx.denominator.equals(ry.denominator);885 }887 public boolean lt(Number x, Number y){888 Ratio rx = toRatio(x);889 Ratio ry = toRatio(y);890 return Numbers.lt(rx.numerator.multiply(ry.denominator), ry.numerator.multiply(rx.denominator));891 }893 //public Number subtract(Number x, Number y);894 final public Number negate(Number x){895 Ratio r = (Ratio) x;896 return new Ratio(r.numerator.negate(), r.denominator);897 }899 public Number inc(Number x){900 return Numbers.add(x, 1);901 }903 public Number dec(Number x){904 return Numbers.add(x, -1);905 }907 }909 final static class BigIntegerOps implements Ops{910 public Ops combine(Ops y){911 return y.opsWith(this);912 }914 final public Ops opsWith(IntegerOps x){915 return this;916 }918 final public Ops opsWith(LongOps x){919 return this;920 }922 final public Ops opsWith(FloatOps x){923 return FLOAT_OPS;924 }926 final public Ops opsWith(DoubleOps x){927 return DOUBLE_OPS;928 }930 final public Ops opsWith(RatioOps x){931 return RATIO_OPS;932 }934 final public Ops opsWith(BigIntegerOps x){935 return this;936 }938 final public Ops opsWith(BigDecimalOps x){939 return BIGDECIMAL_OPS;940 }942 public boolean isZero(Number x){943 BigInteger bx = toBigInteger(x);944 return bx.signum() == 0;945 }947 public boolean isPos(Number x){948 BigInteger bx = toBigInteger(x);949 return bx.signum() > 0;950 }952 public boolean isNeg(Number x){953 BigInteger bx = toBigInteger(x);954 return bx.signum() < 0;955 }957 final public Number add(Number x, Number y){958 return reduce(toBigInteger(x).add(toBigInteger(y)));959 }961 final public Number multiply(Number x, Number y){962 return reduce(toBigInteger(x).multiply(toBigInteger(y)));963 }965 public Number divide(Number x, Number y){966 return Numbers.divide(toBigInteger(x), toBigInteger(y));967 }969 public Number quotient(Number x, Number y){970 return toBigInteger(x).divide(toBigInteger(y));971 }973 public Number remainder(Number x, Number y){974 return toBigInteger(x).remainder(toBigInteger(y));975 }977 public boolean equiv(Number x, Number y){978 return toBigInteger(x).equals(toBigInteger(y));979 }981 public boolean lt(Number x, Number y){982 return toBigInteger(x).compareTo(toBigInteger(y)) < 0;983 }985 //public Number subtract(Number x, Number y);986 final public Number negate(Number x){987 return toBigInteger(x).negate();988 }990 public Number inc(Number x){991 BigInteger bx = toBigInteger(x);992 return reduce(bx.add(BigInteger.ONE));993 }995 public Number dec(Number x){996 BigInteger bx = toBigInteger(x);997 return reduce(bx.subtract(BigInteger.ONE));998 }999 }1001 final static class BigDecimalOps implements Ops{1002 final static Var MATH_CONTEXT = RT.MATH_CONTEXT;1004 public Ops combine(Ops y){1005 return y.opsWith(this);1006 }1008 final public Ops opsWith(IntegerOps x){1009 return this;1010 }1012 final public Ops opsWith(LongOps x){1013 return this;1014 }1016 final public Ops opsWith(FloatOps x){1017 return FLOAT_OPS;1018 }1020 final public Ops opsWith(DoubleOps x){1021 return DOUBLE_OPS;1022 }1024 final public Ops opsWith(RatioOps x){1025 return RATIO_OPS;1026 }1028 final public Ops opsWith(BigIntegerOps x){1029 return this;1030 }1032 final public Ops opsWith(BigDecimalOps x){1033 return this;1034 }1036 public boolean isZero(Number x){1037 BigDecimal bx = (BigDecimal) x;1038 return bx.signum() == 0;1039 }1041 public boolean isPos(Number x){1042 BigDecimal bx = (BigDecimal) x;1043 return bx.signum() > 0;1044 }1046 public boolean isNeg(Number x){1047 BigDecimal bx = (BigDecimal) x;1048 return bx.signum() < 0;1049 }1051 final public Number add(Number x, Number y){1052 MathContext mc = (MathContext) MATH_CONTEXT.deref();1053 return mc == null1054 ? toBigDecimal(x).add(toBigDecimal(y))1055 : toBigDecimal(x).add(toBigDecimal(y), mc);1056 }1058 final public Number multiply(Number x, Number y){1059 MathContext mc = (MathContext) MATH_CONTEXT.deref();1060 return mc == null1061 ? toBigDecimal(x).multiply(toBigDecimal(y))1062 : toBigDecimal(x).multiply(toBigDecimal(y), mc);1063 }1065 public Number divide(Number x, Number y){1066 MathContext mc = (MathContext) MATH_CONTEXT.deref();1067 return mc == null1068 ? toBigDecimal(x).divide(toBigDecimal(y))1069 : toBigDecimal(x).divide(toBigDecimal(y), mc);1070 }1072 public Number quotient(Number x, Number y){1073 MathContext mc = (MathContext) MATH_CONTEXT.deref();1074 return mc == null1075 ? toBigDecimal(x).divideToIntegralValue(toBigDecimal(y))1076 : toBigDecimal(x).divideToIntegralValue(toBigDecimal(y), mc);1077 }1079 public Number remainder(Number x, Number y){1080 MathContext mc = (MathContext) MATH_CONTEXT.deref();1081 return mc == null1082 ? toBigDecimal(x).remainder(toBigDecimal(y))1083 : toBigDecimal(x).remainder(toBigDecimal(y), mc);1084 }1086 public boolean equiv(Number x, Number y){1087 return toBigDecimal(x).equals(toBigDecimal(y));1088 }1090 public boolean lt(Number x, Number y){1091 return toBigDecimal(x).compareTo(toBigDecimal(y)) < 0;1092 }1094 //public Number subtract(Number x, Number y);1095 final public Number negate(Number x){1096 MathContext mc = (MathContext) MATH_CONTEXT.deref();1097 return mc == null1098 ? ((BigDecimal) x).negate()1099 : ((BigDecimal) x).negate(mc);1100 }1102 public Number inc(Number x){1103 MathContext mc = (MathContext) MATH_CONTEXT.deref();1104 BigDecimal bx = (BigDecimal) x;1105 return mc == null1106 ? bx.add(BigDecimal.ONE)1107 : bx.add(BigDecimal.ONE, mc);1108 }1110 public Number dec(Number x){1111 MathContext mc = (MathContext) MATH_CONTEXT.deref();1112 BigDecimal bx = (BigDecimal) x;1113 return mc == null1114 ? bx.subtract(BigDecimal.ONE)1115 : bx.subtract(BigDecimal.ONE, mc);1116 }1117 }1119 final static class IntegerBitOps implements BitOps{1120 public BitOps combine(BitOps y){1121 return y.bitOpsWith(this);1122 }1124 final public BitOps bitOpsWith(IntegerBitOps x){1125 return this;1126 }1128 final public BitOps bitOpsWith(LongBitOps x){1129 return LONG_BITOPS;1130 }1132 final public BitOps bitOpsWith(BigIntegerBitOps x){1133 return BIGINTEGER_BITOPS;1134 }1137 public Number not(Number x){1138 return ~x.intValue();1139 }1141 public Number and(Number x, Number y){1142 return x.intValue() & y.intValue();1143 }1145 public Number or(Number x, Number y){1146 return x.intValue() | y.intValue();1147 }1149 public Number xor(Number x, Number y){1150 return x.intValue() ^ y.intValue();1151 }1153 public Number andNot(Number x, Number y){1154 return x.intValue() & ~y.intValue();1155 }1157 public Number clearBit(Number x, int n){1158 if(n < 31)1159 return x.intValue() & ~(1 << n);1160 else if(n < 63)1161 return x.longValue() & ~(1L << n);1162 else1163 return toBigInteger(x).clearBit(n);1164 }1166 public Number setBit(Number x, int n){1167 if(n < 31)1168 return x.intValue() | (1 << n);1169 else if(n < 63)1170 return x.longValue() | (1L << n);1171 else1172 return toBigInteger(x).setBit(n);1173 }1175 public Number flipBit(Number x, int n){1176 if(n < 31)1177 return x.intValue() ^ (1 << n);1178 else if(n < 63)1179 return x.longValue() ^ (1L << n);1180 else1181 return toBigInteger(x).flipBit(n);1182 }1184 public boolean testBit(Number x, int n){1185 if(n < 32)1186 return (x.intValue() & (1 << n)) != 0;1187 else if(n < 64)1188 return (x.longValue() & (1L << n)) != 0;1189 else1190 return toBigInteger(x).testBit(n);1191 }1193 public Number shiftLeft(Number x, int n){1194 if(n < 32)1195 {1196 if(n < 0)1197 return shiftRight(x, -n);1198 return reduce(x.longValue() << n);1199 }1200 else1201 return reduce(toBigInteger(x).shiftLeft(n));1202 }1204 public Number shiftRight(Number x, int n){1205 if(n < 0)1206 return shiftLeft(x, -n);1207 return x.intValue() >> n;1208 }1209 }1211 final static class LongBitOps implements BitOps{1212 public BitOps combine(BitOps y){1213 return y.bitOpsWith(this);1214 }1216 final public BitOps bitOpsWith(IntegerBitOps x){1217 return this;1218 }1220 final public BitOps bitOpsWith(LongBitOps x){1221 return this;1222 }1224 final public BitOps bitOpsWith(BigIntegerBitOps x){1225 return BIGINTEGER_BITOPS;1226 }1228 public Number not(Number x){1229 return ~x.longValue();1230 }1232 public Number and(Number x, Number y){1233 return x.longValue() & y.longValue();1234 }1236 public Number or(Number x, Number y){1237 return x.longValue() | y.longValue();1238 }1240 public Number xor(Number x, Number y){1241 return x.longValue() ^ y.longValue();1242 }1244 public Number andNot(Number x, Number y){1245 return x.longValue() & ~y.longValue();1246 }1248 public Number clearBit(Number x, int n){1249 if(n < 63)1250 return x.longValue() & ~(1L << n);1251 else1252 return toBigInteger(x).clearBit(n);1253 }1255 public Number setBit(Number x, int n){1256 if(n < 63)1257 return x.longValue() | (1L << n);1258 else1259 return toBigInteger(x).setBit(n);1260 }1262 public Number flipBit(Number x, int n){1263 if(n < 63)1264 return x.longValue() ^ (1L << n);1265 else1266 return toBigInteger(x).flipBit(n);1267 }1269 public boolean testBit(Number x, int n){1270 if(n < 64)1271 return (x.longValue() & (1L << n)) != 0;1272 else1273 return toBigInteger(x).testBit(n);1274 }1276 public Number shiftLeft(Number x, int n){1277 if(n < 0)1278 return shiftRight(x, -n);1279 return reduce(toBigInteger(x).shiftLeft(n));1280 }1282 public Number shiftRight(Number x, int n){1283 if(n < 0)1284 return shiftLeft(x, -n);1285 return x.longValue() >> n;1286 }1287 }1289 final static class BigIntegerBitOps implements BitOps{1290 public BitOps combine(BitOps y){1291 return y.bitOpsWith(this);1292 }1294 final public BitOps bitOpsWith(IntegerBitOps x){1295 return this;1296 }1298 final public BitOps bitOpsWith(LongBitOps x){1299 return this;1300 }1302 final public BitOps bitOpsWith(BigIntegerBitOps x){1303 return this;1304 }1306 public Number not(Number x){1307 return toBigInteger(x).not();1308 }1310 public Number and(Number x, Number y){1311 return toBigInteger(x).and(toBigInteger(y));1312 }1314 public Number or(Number x, Number y){1315 return toBigInteger(x).or(toBigInteger(y));1316 }1318 public Number xor(Number x, Number y){1319 return toBigInteger(x).xor(toBigInteger(y));1320 }1322 public Number andNot(Number x, Number y){1323 return toBigInteger(x).andNot(toBigInteger(y));1324 }1326 public Number clearBit(Number x, int n){1327 return toBigInteger(x).clearBit(n);1328 }1330 public Number setBit(Number x, int n){1331 return toBigInteger(x).setBit(n);1332 }1334 public Number flipBit(Number x, int n){1335 return toBigInteger(x).flipBit(n);1336 }1338 public boolean testBit(Number x, int n){1339 return toBigInteger(x).testBit(n);1340 }1342 public Number shiftLeft(Number x, int n){1343 return toBigInteger(x).shiftLeft(n);1344 }1346 public Number shiftRight(Number x, int n){1347 return toBigInteger(x).shiftRight(n);1348 }1349 }1351 static final IntegerOps INTEGER_OPS = new IntegerOps();1352 static final LongOps LONG_OPS = new LongOps();1353 static final FloatOps FLOAT_OPS = new FloatOps();1354 static final DoubleOps DOUBLE_OPS = new DoubleOps();1355 static final RatioOps RATIO_OPS = new RatioOps();1356 static final BigIntegerOps BIGINTEGER_OPS = new BigIntegerOps();1357 static final BigDecimalOps BIGDECIMAL_OPS = new BigDecimalOps();1359 static final IntegerBitOps INTEGER_BITOPS = new IntegerBitOps();1360 static final LongBitOps LONG_BITOPS = new LongBitOps();1361 static final BigIntegerBitOps BIGINTEGER_BITOPS = new BigIntegerBitOps();1363 static Ops ops(Object x){1364 Class xc = x.getClass();1366 if(xc == Integer.class)1367 return INTEGER_OPS;1368 else if(xc == Double.class)1369 return DOUBLE_OPS;1370 else if(xc == Float.class)1371 return FLOAT_OPS;1372 else if(xc == BigInteger.class)1373 return BIGINTEGER_OPS;1374 else if(xc == Long.class)1375 return LONG_OPS;1376 else if(xc == Ratio.class)1377 return RATIO_OPS;1378 else if(xc == BigDecimal.class)1379 return BIGDECIMAL_OPS;1380 else1381 return INTEGER_OPS;1382 }1384 static BitOps bitOps(Object x){1385 Class xc = x.getClass();1387 if(xc == Integer.class)1388 return INTEGER_BITOPS;1389 else if(xc == Long.class)1390 return LONG_BITOPS;1391 else if(xc == BigInteger.class)1392 return BIGINTEGER_BITOPS;1393 else if(xc == Double.class || xc == Float.class || xc == BigDecimalOps.class || xc == Ratio.class)1394 throw new ArithmeticException("bit operation on non integer type: " + xc);1395 else1396 return INTEGER_BITOPS;1397 }1399 //final static ExecutorService executor = Executors.newCachedThreadPool();1400 //static public int minChunk = 100;1401 //static int chunkSize(int alength){1402 // return Math.max(alength / Runtime.getRuntime().availableProcessors(), minChunk);1403 //}1405 // }1406 // else1407 // {1408 // LinkedList<Callable<Float>> ops = new LinkedList<Callable<Float>>();1409 // for(int offset = 0;offset < xs.length;offset+=chunk)1410 // {1411 // final int start = offset;1412 // final int end = Math.min(xs.length, start + chunk);1413 // ops.add(new Callable<Float>(){1414 // public Float call() throws Exception{1415 // for(int i=start;i<end;i++)1416 // xs[i] += ys[i];1417 // return null;1418 // }});1419 // }1420 // executor.invokeAll(ops);1421 // }1424 static public float[] float_array(int size, Object init){1425 float[] ret = new float[size];1426 if(init instanceof Number)1427 {1428 float f = ((Number) init).floatValue();1429 for(int i = 0; i < ret.length; i++)1430 ret[i] = f;1431 }1432 else1433 {1434 ISeq s = RT.seq(init);1435 for(int i = 0; i < size && s != null; i++, s = s.next())1436 ret[i] = ((Number) s.first()).floatValue();1437 }1438 return ret;1439 }1441 static public float[] float_array(Object sizeOrSeq){1442 if(sizeOrSeq instanceof Number)1443 return new float[((Number) sizeOrSeq).intValue()];1444 else1445 {1446 ISeq s = RT.seq(sizeOrSeq);1447 int size = RT.count(s);1448 float[] ret = new float[size];1449 for(int i = 0; i < size && s != null; i++, s = s.next())1450 ret[i] = ((Number) s.first()).floatValue();1451 return ret;1452 }1453 }1455 static public double[] double_array(int size, Object init){1456 double[] ret = new double[size];1457 if(init instanceof Number)1458 {1459 double f = ((Number) init).doubleValue();1460 for(int i = 0; i < ret.length; i++)1461 ret[i] = f;1462 }1463 else1464 {1465 ISeq s = RT.seq(init);1466 for(int i = 0; i < size && s != null; i++, s = s.next())1467 ret[i] = ((Number) s.first()).doubleValue();1468 }1469 return ret;1470 }1472 static public double[] double_array(Object sizeOrSeq){1473 if(sizeOrSeq instanceof Number)1474 return new double[((Number) sizeOrSeq).intValue()];1475 else1476 {1477 ISeq s = RT.seq(sizeOrSeq);1478 int size = RT.count(s);1479 double[] ret = new double[size];1480 for(int i = 0; i < size && s != null; i++, s = s.next())1481 ret[i] = ((Number) s.first()).doubleValue();1482 return ret;1483 }1484 }1486 static public int[] int_array(int size, Object init){1487 int[] ret = new int[size];1488 if(init instanceof Number)1489 {1490 int f = ((Number) init).intValue();1491 for(int i = 0; i < ret.length; i++)1492 ret[i] = f;1493 }1494 else1495 {1496 ISeq s = RT.seq(init);1497 for(int i = 0; i < size && s != null; i++, s = s.next())1498 ret[i] = ((Number) s.first()).intValue();1499 }1500 return ret;1501 }1503 static public int[] int_array(Object sizeOrSeq){1504 if(sizeOrSeq instanceof Number)1505 return new int[((Number) sizeOrSeq).intValue()];1506 else1507 {1508 ISeq s = RT.seq(sizeOrSeq);1509 int size = RT.count(s);1510 int[] ret = new int[size];1511 for(int i = 0; i < size && s != null; i++, s = s.next())1512 ret[i] = ((Number) s.first()).intValue();1513 return ret;1514 }1515 }1517 static public long[] long_array(int size, Object init){1518 long[] ret = new long[size];1519 if(init instanceof Number)1520 {1521 long f = ((Number) init).longValue();1522 for(int i = 0; i < ret.length; i++)1523 ret[i] = f;1524 }1525 else1526 {1527 ISeq s = RT.seq(init);1528 for(int i = 0; i < size && s != null; i++, s = s.next())1529 ret[i] = ((Number) s.first()).longValue();1530 }1531 return ret;1532 }1534 static public long[] long_array(Object sizeOrSeq){1535 if(sizeOrSeq instanceof Number)1536 return new long[((Number) sizeOrSeq).intValue()];1537 else1538 {1539 ISeq s = RT.seq(sizeOrSeq);1540 int size = RT.count(s);1541 long[] ret = new long[size];1542 for(int i = 0; i < size && s != null; i++, s = s.next())1543 ret[i] = ((Number) s.first()).longValue();1544 return ret;1545 }1546 }1548 static public short[] short_array(int size, Object init){1549 short[] ret = new short[size];1550 if(init instanceof Short)1551 {1552 short s = (Short) init;1553 for(int i = 0; i < ret.length; i++)1554 ret[i] = s;1555 }1556 else1557 {1558 ISeq s = RT.seq(init);1559 for(int i = 0; i < size && s != null; i++, s = s.next())1560 ret[i] = (Short) s.first();1561 }1562 return ret;1563 }1565 static public short[] short_array(Object sizeOrSeq){1566 if(sizeOrSeq instanceof Number)1567 return new short[((Number) sizeOrSeq).intValue()];1568 else1569 {1570 ISeq s = RT.seq(sizeOrSeq);1571 int size = RT.count(s);1572 short[] ret = new short[size];1573 for(int i = 0; i < size && s != null; i++, s = s.next())1574 ret[i] = (Short) s.first();1575 return ret;1576 }1577 }1579 static public char[] char_array(int size, Object init){1580 char[] ret = new char[size];1581 if(init instanceof Character)1582 {1583 char c = (Character) init;1584 for(int i = 0; i < ret.length; i++)1585 ret[i] = c;1586 }1587 else1588 {1589 ISeq s = RT.seq(init);1590 for(int i = 0; i < size && s != null; i++, s = s.next())1591 ret[i] = (Character) s.first();1592 }1593 return ret;1594 }1596 static public char[] char_array(Object sizeOrSeq){1597 if(sizeOrSeq instanceof Number)1598 return new char[((Number) sizeOrSeq).intValue()];1599 else1600 {1601 ISeq s = RT.seq(sizeOrSeq);1602 int size = RT.count(s);1603 char[] ret = new char[size];1604 for(int i = 0; i < size && s != null; i++, s = s.next())1605 ret[i] = (Character) s.first();1606 return ret;1607 }1608 }1610 static public byte[] byte_array(int size, Object init){1611 byte[] ret = new byte[size];1612 if(init instanceof Byte)1613 {1614 byte b = (Byte) init;1615 for(int i = 0; i < ret.length; i++)1616 ret[i] = b;1617 }1618 else1619 {1620 ISeq s = RT.seq(init);1621 for(int i = 0; i < size && s != null; i++, s = s.next())1622 ret[i] = (Byte) s.first();1623 }1624 return ret;1625 }1627 static public byte[] byte_array(Object sizeOrSeq){1628 if(sizeOrSeq instanceof Number)1629 return new byte[((Number) sizeOrSeq).intValue()];1630 else1631 {1632 ISeq s = RT.seq(sizeOrSeq);1633 int size = RT.count(s);1634 byte[] ret = new byte[size];1635 for(int i = 0; i < size && s != null; i++, s = s.next())1636 ret[i] = (Byte)s.first();1637 return ret;1638 }1639 }1641 static public boolean[] boolean_array(int size, Object init){1642 boolean[] ret = new boolean[size];1643 if(init instanceof Boolean)1644 {1645 boolean b = (Boolean) init;1646 for(int i = 0; i < ret.length; i++)1647 ret[i] = b;1648 }1649 else1650 {1651 ISeq s = RT.seq(init);1652 for(int i = 0; i < size && s != null; i++, s = s.next())1653 ret[i] = (Boolean)s.first();1654 }1655 return ret;1656 }1658 static public boolean[] boolean_array(Object sizeOrSeq){1659 if(sizeOrSeq instanceof Number)1660 return new boolean[((Number) sizeOrSeq).intValue()];1661 else1662 {1663 ISeq s = RT.seq(sizeOrSeq);1664 int size = RT.count(s);1665 boolean[] ret = new boolean[size];1666 for(int i = 0; i < size && s != null; i++, s = s.next())1667 ret[i] = (Boolean)s.first();1668 return ret;1669 }1670 }1672 static public boolean[] booleans(Object array){1673 return (boolean[]) array;1674 }1676 static public byte[] bytes(Object array){1677 return (byte[]) array;1678 }1680 static public char[] chars(Object array){1681 return (char[]) array;1682 }1684 static public short[] shorts(Object array){1685 return (short[]) array;1686 }1688 static public float[] floats(Object array){1689 return (float[]) array;1690 }1692 static public double[] doubles(Object array){1693 return (double[]) array;1694 }1696 static public int[] ints(Object array){1697 return (int[]) array;1698 }1700 static public long[] longs(Object array){1701 return (long[]) array;1702 }1704 static public Number num(Object x){1705 return (Number) x;1706 }1708 static public Number num(float x){1709 return x;1710 }1712 static public float add(float x, float y){1713 return x + y;1714 }1716 static public float minus(float x, float y){1717 return x - y;1718 }1720 static public float minus(float x){1721 return -x;1722 }1724 static public float inc(float x){1725 return x + 1;1726 }1728 static public float dec(float x){1729 return x - 1;1730 }1732 static public float multiply(float x, float y){1733 return x * y;1734 }1736 static public float divide(float x, float y){1737 return x / y;1738 }1740 static public boolean equiv(float x, float y){1741 return x == y;1742 }1744 static public boolean lt(float x, float y){1745 return x < y;1746 }1748 static public boolean lte(float x, float y){1749 return x <= y;1750 }1752 static public boolean gt(float x, float y){1753 return x > y;1754 }1756 static public boolean gte(float x, float y){1757 return x >= y;1758 }1760 static public boolean isPos(float x){1761 return x > 0;1762 }1764 static public boolean isNeg(float x){1765 return x < 0;1766 }1768 static public boolean isZero(float x){1769 return x == 0;1770 }1772 static public Number num(double x){1773 return x;1774 }1776 static public double add(double x, double y){1777 return x + y;1778 }1780 static public double minus(double x, double y){1781 return x - y;1782 }1784 static public double minus(double x){1785 return -x;1786 }1788 static public double inc(double x){1789 return x + 1;1790 }1792 static public double dec(double x){1793 return x - 1;1794 }1796 static public double multiply(double x, double y){1797 return x * y;1798 }1800 static public double divide(double x, double y){1801 return x / y;1802 }1804 static public boolean equiv(double x, double y){1805 return x == y;1806 }1808 static public boolean lt(double x, double y){1809 return x < y;1810 }1812 static public boolean lte(double x, double y){1813 return x <= y;1814 }1816 static public boolean gt(double x, double y){1817 return x > y;1818 }1820 static public boolean gte(double x, double y){1821 return x >= y;1822 }1824 static public boolean isPos(double x){1825 return x > 0;1826 }1828 static public boolean isNeg(double x){1829 return x < 0;1830 }1832 static public boolean isZero(double x){1833 return x == 0;1834 }1836 static int throwIntOverflow(){1837 throw new ArithmeticException("integer overflow");1838 }1840 static public Number num(int x){1841 return x;1842 }1844 static public int unchecked_add(int x, int y){1845 return x + y;1846 }1848 static public int unchecked_subtract(int x, int y){1849 return x - y;1850 }1852 static public int unchecked_negate(int x){1853 return -x;1854 }1856 static public int unchecked_inc(int x){1857 return x + 1;1858 }1860 static public int unchecked_dec(int x){1861 return x - 1;1862 }1864 static public int unchecked_multiply(int x, int y){1865 return x * y;1866 }1868 static public int add(int x, int y){1869 int ret = x + y;1870 if ((ret ^ x) < 0 && (ret ^ y) < 0)1871 return throwIntOverflow();1872 return ret;1873 }1875 static public int not(int x){1876 return ~x;1877 }1879 static public int and(int x, int y){1880 return x & y;1881 }1883 static public int or(int x, int y){1884 return x | y;1885 }1887 static public int xor(int x, int y){1888 return x ^ y;1889 }1891 static public int minus(int x, int y){1892 int ret = x - y;1893 if (((ret ^ x) < 0 && (ret ^ ~y) < 0))1894 return throwIntOverflow();1895 return ret;1896 }1898 static public int minus(int x){1899 if(x == Integer.MIN_VALUE)1900 return throwIntOverflow();1901 return -x;1902 }1904 static public int inc(int x){1905 if(x == Integer.MAX_VALUE)1906 return throwIntOverflow();1907 return x + 1;1908 }1910 static public int dec(int x){1911 if(x == Integer.MIN_VALUE)1912 return throwIntOverflow();1913 return x - 1;1914 }1916 static public int multiply(int x, int y){1917 int ret = x * y;1918 if (y != 0 && ret/y != x)1919 return throwIntOverflow();1920 return ret;1921 }1923 static public int unchecked_divide(int x, int y){1924 return x / y;1925 }1927 static public int unchecked_remainder(int x, int y){1928 return x % y;1929 }1931 static public boolean equiv(int x, int y){1932 return x == y;1933 }1935 static public boolean lt(int x, int y){1936 return x < y;1937 }1939 static public boolean lte(int x, int y){1940 return x <= y;1941 }1943 static public boolean gt(int x, int y){1944 return x > y;1945 }1947 static public boolean gte(int x, int y){1948 return x >= y;1949 }1951 static public boolean isPos(int x){1952 return x > 0;1953 }1955 static public boolean isNeg(int x){1956 return x < 0;1957 }1959 static public boolean isZero(int x){1960 return x == 0;1961 }1963 static public Number num(long x){1964 return x;1965 }1967 static public long unchecked_add(long x, long y){1968 return x + y;1969 }1971 static public long unchecked_subtract(long x, long y){1972 return x - y;1973 }1975 static public long unchecked_negate(long x){1976 return -x;1977 }1979 static public long unchecked_inc(long x){1980 return x + 1;1981 }1983 static public long unchecked_dec(long x){1984 return x - 1;1985 }1987 static public long unchecked_multiply(long x, long y){1988 return x * y;1989 }1991 static public long add(long x, long y){1992 long ret = x + y;1993 if ((ret ^ x) < 0 && (ret ^ y) < 0)1994 return throwIntOverflow();1995 return ret;1996 }1998 static public long minus(long x, long y){1999 long ret = x - y;2000 if (((ret ^ x) < 0 && (ret ^ ~y) < 0))2001 return throwIntOverflow();2002 return ret;2003 }2005 static public long minus(long x){2006 if(x == Long.MIN_VALUE)2007 return throwIntOverflow();2008 return -x;2009 }2011 static public long inc(long x){2012 if(x == Long.MAX_VALUE)2013 return throwIntOverflow();2014 return x + 1;2015 }2017 static public long dec(long x){2018 if(x == Long.MIN_VALUE)2019 return throwIntOverflow();2020 return x - 1;2021 }2023 static public long multiply(long x, long y){2024 long ret = x * y;2025 if (y != 0 && ret/y != x)2026 return throwIntOverflow();2027 return ret;2028 }2030 static public long unchecked_divide(long x, long y){2031 return x / y;2032 }2034 static public long unchecked_remainder(long x, long y){2035 return x % y;2036 }2038 static public boolean equiv(long x, long y){2039 return x == y;2040 }2042 static public boolean lt(long x, long y){2043 return x < y;2044 }2046 static public boolean lte(long x, long y){2047 return x <= y;2048 }2050 static public boolean gt(long x, long y){2051 return x > y;2052 }2054 static public boolean gte(long x, long y){2055 return x >= y;2056 }2058 static public boolean isPos(long x){2059 return x > 0;2060 }2062 static public boolean isNeg(long x){2063 return x < 0;2064 }2066 static public boolean isZero(long x){2067 return x == 0;2068 }2070 /*2071 static public class F{2072 static public float add(float x, float y){2073 return x + y;2074 }2076 static public float subtract(float x, float y){2077 return x - y;2078 }2080 static public float negate(float x){2081 return -x;2082 }2084 static public float inc(float x){2085 return x + 1;2086 }2088 static public float dec(float x){2089 return x - 1;2090 }2092 static public float multiply(float x, float y){2093 return x * y;2094 }2096 static public float divide(float x, float y){2097 return x / y;2098 }2100 static public boolean equiv(float x, float y){2101 return x == y;2102 }2104 static public boolean lt(float x, float y){2105 return x < y;2106 }2108 static public boolean lte(float x, float y){2109 return x <= y;2110 }2112 static public boolean gt(float x, float y){2113 return x > y;2114 }2116 static public boolean gte(float x, float y){2117 return x >= y;2118 }2120 static public boolean pos(float x){2121 return x > 0;2122 }2124 static public boolean neg(float x){2125 return x < 0;2126 }2128 static public boolean zero(float x){2129 return x == 0;2130 }2132 static public float aget(float[] xs, int i){2133 return xs[i];2134 }2136 static public float aset(float[] xs, int i, float v){2137 xs[i] = v;2138 return v;2139 }2141 static public int alength(float[] xs){2142 return xs.length;2143 }2145 static public float[] aclone(float[] xs){2146 return xs.clone();2147 }2149 static public float[] vec(int size, Object init){2150 float[] ret = new float[size];2151 if(init instanceof Number)2152 {2153 float f = ((Number) init).floatValue();2154 for(int i = 0; i < ret.length; i++)2155 ret[i] = f;2156 }2157 else2158 {2159 ISeq s = RT.seq(init);2160 for(int i = 0; i < size && s != null; i++, s = s.rest())2161 ret[i] = ((Number) s.first()).floatValue();2162 }2163 return ret;2164 }2166 static public float[] vec(Object sizeOrSeq){2167 if(sizeOrSeq instanceof Number)2168 return new float[((Number) sizeOrSeq).intValue()];2169 else2170 {2171 ISeq s = RT.seq(sizeOrSeq);2172 int size = s.count();2173 float[] ret = new float[size];2174 for(int i = 0; i < size && s != null; i++, s = s.rest())2175 ret[i] = ((Number) s.first()).intValue();2176 return ret;2177 }2178 }2181 static public float[] vsadd(float[] x, float y){2182 final float[] xs = x.clone();2183 for(int i = 0; i < xs.length; i++)2184 xs[i] += y;2185 return xs;2186 }2188 static public float[] vssub(float[] x, float y){2189 final float[] xs = x.clone();2190 for(int i = 0; i < xs.length; i++)2191 xs[i] -= y;2192 return xs;2193 }2195 static public float[] vsdiv(float[] x, float y){2196 final float[] xs = x.clone();2197 for(int i = 0; i < xs.length; i++)2198 xs[i] /= y;2199 return xs;2200 }2202 static public float[] vsmul(float[] x, float y){2203 final float[] xs = x.clone();2204 for(int i = 0; i < xs.length; i++)2205 xs[i] *= y;2206 return xs;2207 }2209 static public float[] svdiv(float y, float[] x){2210 final float[] xs = x.clone();2211 for(int i = 0; i < xs.length; i++)2212 xs[i] = y / xs[i];2213 return xs;2214 }2216 static public float[] vsmuladd(float[] x, float y, float[] zs){2217 final float[] xs = x.clone();2218 for(int i = 0; i < xs.length; i++)2219 xs[i] = xs[i] * y + zs[i];2220 return xs;2221 }2223 static public float[] vsmulsub(float[] x, float y, float[] zs){2224 final float[] xs = x.clone();2225 for(int i = 0; i < xs.length; i++)2226 xs[i] = xs[i] * y - zs[i];2227 return xs;2228 }2230 static public float[] vsmulsadd(float[] x, float y, float z){2231 final float[] xs = x.clone();2232 for(int i = 0; i < xs.length; i++)2233 xs[i] = xs[i] * y + z;2234 return xs;2235 }2237 static public float[] vsmulssub(float[] x, float y, float z){2238 final float[] xs = x.clone();2239 for(int i = 0; i < xs.length; i++)2240 xs[i] = xs[i] * y - z;2241 return xs;2242 }2244 static public float[] vabs(float[] x){2245 final float[] xs = x.clone();2246 for(int i = 0; i < xs.length; i++)2247 xs[i] = Math.abs(xs[i]);2248 return xs;2249 }2251 static public float[] vnegabs(float[] x){2252 final float[] xs = x.clone();2253 for(int i = 0; i < xs.length; i++)2254 xs[i] = -Math.abs(xs[i]);2255 return xs;2256 }2258 static public float[] vneg(float[] x){2259 final float[] xs = x.clone();2260 for(int i = 0; i < xs.length; i++)2261 xs[i] = -xs[i];2262 return xs;2263 }2265 static public float[] vsqr(float[] x){2266 final float[] xs = x.clone();2267 for(int i = 0; i < xs.length; i++)2268 xs[i] *= xs[i];2269 return xs;2270 }2272 static public float[] vsignedsqr(float[] x){2273 final float[] xs = x.clone();2274 for(int i = 0; i < xs.length; i++)2275 xs[i] *= Math.abs(xs[i]);2276 return xs;2277 }2279 static public float[] vclip(float[] x, float low, float high){2280 final float[] xs = x.clone();2281 for(int i = 0; i < xs.length; i++)2282 {2283 if(xs[i] < low)2284 xs[i] = low;2285 else if(xs[i] > high)2286 xs[i] = high;2287 }2288 return xs;2289 }2291 static public IPersistentVector vclipcounts(float[] x, float low, float high){2292 final float[] xs = x.clone();2293 int lowc = 0;2294 int highc = 0;2296 for(int i = 0; i < xs.length; i++)2297 {2298 if(xs[i] < low)2299 {2300 ++lowc;2301 xs[i] = low;2302 }2303 else if(xs[i] > high)2304 {2305 ++highc;2306 xs[i] = high;2307 }2308 }2309 return RT.vector(xs, lowc, highc);2310 }2312 static public float[] vthresh(float[] x, float thresh, float otherwise){2313 final float[] xs = x.clone();2314 for(int i = 0; i < xs.length; i++)2315 {2316 if(xs[i] < thresh)2317 xs[i] = otherwise;2318 }2319 return xs;2320 }2322 static public float[] vreverse(float[] x){2323 final float[] xs = x.clone();2324 for(int i = 0; i < xs.length; i++)2325 xs[i] = xs[xs.length - i - 1];2326 return xs;2327 }2329 static public float[] vrunningsum(float[] x){2330 final float[] xs = x.clone();2331 for(int i = 1; i < xs.length; i++)2332 xs[i] = xs[i - 1] + xs[i];2333 return xs;2334 }2336 static public float[] vsort(float[] x){2337 final float[] xs = x.clone();2338 Arrays.sort(xs);2339 return xs;2340 }2342 static public float vdot(float[] xs, float[] ys){2343 float ret = 0;2344 for(int i = 0; i < xs.length; i++)2345 ret += xs[i] * ys[i];2346 return ret;2347 }2349 static public float vmax(float[] xs){2350 if(xs.length == 0)2351 return 0;2352 float ret = xs[0];2353 for(int i = 0; i < xs.length; i++)2354 ret = Math.max(ret, xs[i]);2355 return ret;2356 }2358 static public float vmin(float[] xs){2359 if(xs.length == 0)2360 return 0;2361 float ret = xs[0];2362 for(int i = 0; i < xs.length; i++)2363 ret = Math.min(ret, xs[i]);2364 return ret;2365 }2367 static public float vmean(float[] xs){2368 if(xs.length == 0)2369 return 0;2370 return vsum(xs) / xs.length;2371 }2373 static public double vrms(float[] xs){2374 if(xs.length == 0)2375 return 0;2376 float ret = 0;2377 for(int i = 0; i < xs.length; i++)2378 ret += xs[i] * xs[i];2379 return Math.sqrt(ret / xs.length);2380 }2382 static public float vsum(float[] xs){2383 float ret = 0;2384 for(int i = 0; i < xs.length; i++)2385 ret += xs[i];2386 return ret;2387 }2389 static public boolean vequiv(float[] xs, float[] ys){2390 return Arrays.equals(xs, ys);2391 }2393 static public float[] vadd(float[] x, float[] ys){2394 final float[] xs = x.clone();2395 for(int i = 0; i < xs.length; i++)2396 xs[i] += ys[i];2397 return xs;2398 }2400 static public float[] vsub(float[] x, float[] ys){2401 final float[] xs = x.clone();2402 for(int i = 0; i < xs.length; i++)2403 xs[i] -= ys[i];2404 return xs;2405 }2407 static public float[] vaddmul(float[] x, float[] ys, float[] zs){2408 final float[] xs = x.clone();2409 for(int i = 0; i < xs.length; i++)2410 xs[i] = (xs[i] + ys[i]) * zs[i];2411 return xs;2412 }2414 static public float[] vsubmul(float[] x, float[] ys, float[] zs){2415 final float[] xs = x.clone();2416 for(int i = 0; i < xs.length; i++)2417 xs[i] = (xs[i] - ys[i]) * zs[i];2418 return xs;2419 }2421 static public float[] vaddsmul(float[] x, float[] ys, float z){2422 final float[] xs = x.clone();2423 for(int i = 0; i < xs.length; i++)2424 xs[i] = (xs[i] + ys[i]) * z;2425 return xs;2426 }2428 static public float[] vsubsmul(float[] x, float[] ys, float z){2429 final float[] xs = x.clone();2430 for(int i = 0; i < xs.length; i++)2431 xs[i] = (xs[i] - ys[i]) * z;2432 return xs;2433 }2435 static public float[] vmulsadd(float[] x, float[] ys, float z){2436 final float[] xs = x.clone();2437 for(int i = 0; i < xs.length; i++)2438 xs[i] = (xs[i] * ys[i]) + z;2439 return xs;2440 }2442 static public float[] vdiv(float[] x, float[] ys){2443 final float[] xs = x.clone();2444 for(int i = 0; i < xs.length; i++)2445 xs[i] /= ys[i];2446 return xs;2447 }2449 static public float[] vmul(float[] x, float[] ys){2450 final float[] xs = x.clone();2451 for(int i = 0; i < xs.length; i++)2452 xs[i] *= ys[i];2453 return xs;2454 }2456 static public float[] vmuladd(float[] x, float[] ys, float[] zs){2457 final float[] xs = x.clone();2458 for(int i = 0; i < xs.length; i++)2459 xs[i] = (xs[i] * ys[i]) + zs[i];2460 return xs;2461 }2463 static public float[] vmulsub(float[] x, float[] ys, float[] zs){2464 final float[] xs = x.clone();2465 for(int i = 0; i < xs.length; i++)2466 xs[i] = (xs[i] * ys[i]) - zs[i];2467 return xs;2468 }2470 static public float[] vmax(float[] x, float[] ys){2471 final float[] xs = x.clone();2472 for(int i = 0; i < xs.length; i++)2473 xs[i] = Math.max(xs[i], ys[i]);2474 return xs;2475 }2477 static public float[] vmin(float[] x, float[] ys){2478 final float[] xs = x.clone();2479 for(int i = 0; i < xs.length; i++)2480 xs[i] = Math.min(xs[i], ys[i]);2481 return xs;2482 }2484 static public float[] vmap(IFn fn, float[] x) throws Exception{2485 float[] xs = x.clone();2486 for(int i = 0; i < xs.length; i++)2487 xs[i] = ((Number) fn.invoke(xs[i])).floatValue();2488 return xs;2489 }2491 static public float[] vmap(IFn fn, float[] x, float[] ys) throws Exception{2492 float[] xs = x.clone();2493 for(int i = 0; i < xs.length; i++)2494 xs[i] = ((Number) fn.invoke(xs[i], ys[i])).floatValue();2495 return xs;2496 }2498 }2500 static public class D{2501 static public double add(double x, double y){2502 return x + y;2503 }2505 static public double subtract(double x, double y){2506 return x - y;2507 }2509 static public double negate(double x){2510 return -x;2511 }2513 static public double inc(double x){2514 return x + 1;2515 }2517 static public double dec(double x){2518 return x - 1;2519 }2521 static public double multiply(double x, double y){2522 return x * y;2523 }2525 static public double divide(double x, double y){2526 return x / y;2527 }2529 static public boolean equiv(double x, double y){2530 return x == y;2531 }2533 static public boolean lt(double x, double y){2534 return x < y;2535 }2537 static public boolean lte(double x, double y){2538 return x <= y;2539 }2541 static public boolean gt(double x, double y){2542 return x > y;2543 }2545 static public boolean gte(double x, double y){2546 return x >= y;2547 }2549 static public boolean pos(double x){2550 return x > 0;2551 }2553 static public boolean neg(double x){2554 return x < 0;2555 }2557 static public boolean zero(double x){2558 return x == 0;2559 }2561 static public double aget(double[] xs, int i){2562 return xs[i];2563 }2565 static public double aset(double[] xs, int i, double v){2566 xs[i] = v;2567 return v;2568 }2570 static public int alength(double[] xs){2571 return xs.length;2572 }2574 static public double[] aclone(double[] xs){2575 return xs.clone();2576 }2578 static public double[] vec(int size, Object init){2579 double[] ret = new double[size];2580 if(init instanceof Number)2581 {2582 double f = ((Number) init).doubleValue();2583 for(int i = 0; i < ret.length; i++)2584 ret[i] = f;2585 }2586 else2587 {2588 ISeq s = RT.seq(init);2589 for(int i = 0; i < size && s != null; i++, s = s.rest())2590 ret[i] = ((Number) s.first()).doubleValue();2591 }2592 return ret;2593 }2595 static public double[] vec(Object sizeOrSeq){2596 if(sizeOrSeq instanceof Number)2597 return new double[((Number) sizeOrSeq).intValue()];2598 else2599 {2600 ISeq s = RT.seq(sizeOrSeq);2601 int size = s.count();2602 double[] ret = new double[size];2603 for(int i = 0; i < size && s != null; i++, s = s.rest())2604 ret[i] = ((Number) s.first()).intValue();2605 return ret;2606 }2607 }2609 static public double[] vsadd(double[] x, double y){2610 final double[] xs = x.clone();2611 for(int i = 0; i < xs.length; i++)2612 xs[i] += y;2613 return xs;2614 }2616 static public double[] vssub(double[] x, double y){2617 final double[] xs = x.clone();2618 for(int i = 0; i < xs.length; i++)2619 xs[i] -= y;2620 return xs;2621 }2623 static public double[] vsdiv(double[] x, double y){2624 final double[] xs = x.clone();2625 for(int i = 0; i < xs.length; i++)2626 xs[i] /= y;2627 return xs;2628 }2630 static public double[] vsmul(double[] x, double y){2631 final double[] xs = x.clone();2632 for(int i = 0; i < xs.length; i++)2633 xs[i] *= y;2634 return xs;2635 }2637 static public double[] svdiv(double y, double[] x){2638 final double[] xs = x.clone();2639 for(int i = 0; i < xs.length; i++)2640 xs[i] = y / xs[i];2641 return xs;2642 }2644 static public double[] vsmuladd(double[] x, double y, double[] zs){2645 final double[] xs = x.clone();2646 for(int i = 0; i < xs.length; i++)2647 xs[i] = xs[i] * y + zs[i];2648 return xs;2649 }2651 static public double[] vsmulsub(double[] x, double y, double[] zs){2652 final double[] xs = x.clone();2653 for(int i = 0; i < xs.length; i++)2654 xs[i] = xs[i] * y - zs[i];2655 return xs;2656 }2658 static public double[] vsmulsadd(double[] x, double y, double z){2659 final double[] xs = x.clone();2660 for(int i = 0; i < xs.length; i++)2661 xs[i] = xs[i] * y + z;2662 return xs;2663 }2665 static public double[] vsmulssub(double[] x, double y, double z){2666 final double[] xs = x.clone();2667 for(int i = 0; i < xs.length; i++)2668 xs[i] = xs[i] * y - z;2669 return xs;2670 }2672 static public double[] vabs(double[] x){2673 final double[] xs = x.clone();2674 for(int i = 0; i < xs.length; i++)2675 xs[i] = Math.abs(xs[i]);2676 return xs;2677 }2679 static public double[] vnegabs(double[] x){2680 final double[] xs = x.clone();2681 for(int i = 0; i < xs.length; i++)2682 xs[i] = -Math.abs(xs[i]);2683 return xs;2684 }2686 static public double[] vneg(double[] x){2687 final double[] xs = x.clone();2688 for(int i = 0; i < xs.length; i++)2689 xs[i] = -xs[i];2690 return xs;2691 }2693 static public double[] vsqr(double[] x){2694 final double[] xs = x.clone();2695 for(int i = 0; i < xs.length; i++)2696 xs[i] *= xs[i];2697 return xs;2698 }2700 static public double[] vsignedsqr(double[] x){2701 final double[] xs = x.clone();2702 for(int i = 0; i < xs.length; i++)2703 xs[i] *= Math.abs(xs[i]);2704 return xs;2705 }2707 static public double[] vclip(double[] x, double low, double high){2708 final double[] xs = x.clone();2709 for(int i = 0; i < xs.length; i++)2710 {2711 if(xs[i] < low)2712 xs[i] = low;2713 else if(xs[i] > high)2714 xs[i] = high;2715 }2716 return xs;2717 }2719 static public IPersistentVector vclipcounts(double[] x, double low, double high){2720 final double[] xs = x.clone();2721 int lowc = 0;2722 int highc = 0;2724 for(int i = 0; i < xs.length; i++)2725 {2726 if(xs[i] < low)2727 {2728 ++lowc;2729 xs[i] = low;2730 }2731 else if(xs[i] > high)2732 {2733 ++highc;2734 xs[i] = high;2735 }2736 }2737 return RT.vector(xs, lowc, highc);2738 }2740 static public double[] vthresh(double[] x, double thresh, double otherwise){2741 final double[] xs = x.clone();2742 for(int i = 0; i < xs.length; i++)2743 {2744 if(xs[i] < thresh)2745 xs[i] = otherwise;2746 }2747 return xs;2748 }2750 static public double[] vreverse(double[] x){2751 final double[] xs = x.clone();2752 for(int i = 0; i < xs.length; i++)2753 xs[i] = xs[xs.length - i - 1];2754 return xs;2755 }2757 static public double[] vrunningsum(double[] x){2758 final double[] xs = x.clone();2759 for(int i = 1; i < xs.length; i++)2760 xs[i] = xs[i - 1] + xs[i];2761 return xs;2762 }2764 static public double[] vsort(double[] x){2765 final double[] xs = x.clone();2766 Arrays.sort(xs);2767 return xs;2768 }2770 static public double vdot(double[] xs, double[] ys){2771 double ret = 0;2772 for(int i = 0; i < xs.length; i++)2773 ret += xs[i] * ys[i];2774 return ret;2775 }2777 static public double vmax(double[] xs){2778 if(xs.length == 0)2779 return 0;2780 double ret = xs[0];2781 for(int i = 0; i < xs.length; i++)2782 ret = Math.max(ret, xs[i]);2783 return ret;2784 }2786 static public double vmin(double[] xs){2787 if(xs.length == 0)2788 return 0;2789 double ret = xs[0];2790 for(int i = 0; i < xs.length; i++)2791 ret = Math.min(ret, xs[i]);2792 return ret;2793 }2795 static public double vmean(double[] xs){2796 if(xs.length == 0)2797 return 0;2798 return vsum(xs) / xs.length;2799 }2801 static public double vrms(double[] xs){2802 if(xs.length == 0)2803 return 0;2804 double ret = 0;2805 for(int i = 0; i < xs.length; i++)2806 ret += xs[i] * xs[i];2807 return Math.sqrt(ret / xs.length);2808 }2810 static public double vsum(double[] xs){2811 double ret = 0;2812 for(int i = 0; i < xs.length; i++)2813 ret += xs[i];2814 return ret;2815 }2817 static public boolean vequiv(double[] xs, double[] ys){2818 return Arrays.equals(xs, ys);2819 }2821 static public double[] vadd(double[] x, double[] ys){2822 final double[] xs = x.clone();2823 for(int i = 0; i < xs.length; i++)2824 xs[i] += ys[i];2825 return xs;2826 }2828 static public double[] vsub(double[] x, double[] ys){2829 final double[] xs = x.clone();2830 for(int i = 0; i < xs.length; i++)2831 xs[i] -= ys[i];2832 return xs;2833 }2835 static public double[] vaddmul(double[] x, double[] ys, double[] zs){2836 final double[] xs = x.clone();2837 for(int i = 0; i < xs.length; i++)2838 xs[i] = (xs[i] + ys[i]) * zs[i];2839 return xs;2840 }2842 static public double[] vsubmul(double[] x, double[] ys, double[] zs){2843 final double[] xs = x.clone();2844 for(int i = 0; i < xs.length; i++)2845 xs[i] = (xs[i] - ys[i]) * zs[i];2846 return xs;2847 }2849 static public double[] vaddsmul(double[] x, double[] ys, double z){2850 final double[] xs = x.clone();2851 for(int i = 0; i < xs.length; i++)2852 xs[i] = (xs[i] + ys[i]) * z;2853 return xs;2854 }2856 static public double[] vsubsmul(double[] x, double[] ys, double z){2857 final double[] xs = x.clone();2858 for(int i = 0; i < xs.length; i++)2859 xs[i] = (xs[i] - ys[i]) * z;2860 return xs;2861 }2863 static public double[] vmulsadd(double[] x, double[] ys, double z){2864 final double[] xs = x.clone();2865 for(int i = 0; i < xs.length; i++)2866 xs[i] = (xs[i] * ys[i]) + z;2867 return xs;2868 }2870 static public double[] vdiv(double[] x, double[] ys){2871 final double[] xs = x.clone();2872 for(int i = 0; i < xs.length; i++)2873 xs[i] /= ys[i];2874 return xs;2875 }2877 static public double[] vmul(double[] x, double[] ys){2878 final double[] xs = x.clone();2879 for(int i = 0; i < xs.length; i++)2880 xs[i] *= ys[i];2881 return xs;2882 }2884 static public double[] vmuladd(double[] x, double[] ys, double[] zs){2885 final double[] xs = x.clone();2886 for(int i = 0; i < xs.length; i++)2887 xs[i] = (xs[i] * ys[i]) + zs[i];2888 return xs;2889 }2891 static public double[] vmulsub(double[] x, double[] ys, double[] zs){2892 final double[] xs = x.clone();2893 for(int i = 0; i < xs.length; i++)2894 xs[i] = (xs[i] * ys[i]) - zs[i];2895 return xs;2896 }2898 static public double[] vmax(double[] x, double[] ys){2899 final double[] xs = x.clone();2900 for(int i = 0; i < xs.length; i++)2901 xs[i] = Math.max(xs[i], ys[i]);2902 return xs;2903 }2905 static public double[] vmin(double[] x, double[] ys){2906 final double[] xs = x.clone();2907 for(int i = 0; i < xs.length; i++)2908 xs[i] = Math.min(xs[i], ys[i]);2909 return xs;2910 }2912 static public double[] vmap(IFn fn, double[] x) throws Exception{2913 double[] xs = x.clone();2914 for(int i = 0; i < xs.length; i++)2915 xs[i] = ((Number) fn.invoke(xs[i])).doubleValue();2916 return xs;2917 }2919 static public double[] vmap(IFn fn, double[] x, double[] ys) throws Exception{2920 double[] xs = x.clone();2921 for(int i = 0; i < xs.length; i++)2922 xs[i] = ((Number) fn.invoke(xs[i], ys[i])).doubleValue();2923 return xs;2924 }2925 }2927 static public class I{2928 static public int add(int x, int y){2929 return x + y;2930 }2932 static public int subtract(int x, int y){2933 return x - y;2934 }2936 static public int negate(int x){2937 return -x;2938 }2940 static public int inc(int x){2941 return x + 1;2942 }2944 static public int dec(int x){2945 return x - 1;2946 }2948 static public int multiply(int x, int y){2949 return x * y;2950 }2952 static public int divide(int x, int y){2953 return x / y;2954 }2956 static public boolean equiv(int x, int y){2957 return x == y;2958 }2960 static public boolean lt(int x, int y){2961 return x < y;2962 }2964 static public boolean lte(int x, int y){2965 return x <= y;2966 }2968 static public boolean gt(int x, int y){2969 return x > y;2970 }2972 static public boolean gte(int x, int y){2973 return x >= y;2974 }2976 static public boolean pos(int x){2977 return x > 0;2978 }2980 static public boolean neg(int x){2981 return x < 0;2982 }2984 static public boolean zero(int x){2985 return x == 0;2986 }2988 static public int aget(int[] xs, int i){2989 return xs[i];2990 }2992 static public int aset(int[] xs, int i, int v){2993 xs[i] = v;2994 return v;2995 }2997 static public int alength(int[] xs){2998 return xs.length;2999 }3001 static public int[] aclone(int[] xs){3002 return xs.clone();3003 }3005 static public int[] vec(int size, Object init){3006 int[] ret = new int[size];3007 if(init instanceof Number)3008 {3009 int f = ((Number) init).intValue();3010 for(int i = 0; i < ret.length; i++)3011 ret[i] = f;3012 }3013 else3014 {3015 ISeq s = RT.seq(init);3016 for(int i = 0; i < size && s != null; i++, s = s.rest())3017 ret[i] = ((Number) s.first()).intValue();3018 }3019 return ret;3020 }3022 static public int[] vec(Object sizeOrSeq){3023 if(sizeOrSeq instanceof Number)3024 return new int[((Number) sizeOrSeq).intValue()];3025 else3026 {3027 ISeq s = RT.seq(sizeOrSeq);3028 int size = s.count();3029 int[] ret = new int[size];3030 for(int i = 0; i < size && s != null; i++, s = s.rest())3031 ret[i] = ((Number) s.first()).intValue();3032 return ret;3033 }3034 }3036 static public int[] vsadd(int[] x, int y){3037 final int[] xs = x.clone();3038 for(int i = 0; i < xs.length; i++)3039 xs[i] += y;3040 return xs;3041 }3043 static public int[] vssub(int[] x, int y){3044 final int[] xs = x.clone();3045 for(int i = 0; i < xs.length; i++)3046 xs[i] -= y;3047 return xs;3048 }3050 static public int[] vsdiv(int[] x, int y){3051 final int[] xs = x.clone();3052 for(int i = 0; i < xs.length; i++)3053 xs[i] /= y;3054 return xs;3055 }3057 static public int[] vsmul(int[] x, int y){3058 final int[] xs = x.clone();3059 for(int i = 0; i < xs.length; i++)3060 xs[i] *= y;3061 return xs;3062 }3064 static public int[] svdiv(int y, int[] x){3065 final int[] xs = x.clone();3066 for(int i = 0; i < xs.length; i++)3067 xs[i] = y / xs[i];3068 return xs;3069 }3071 static public int[] vsmuladd(int[] x, int y, int[] zs){3072 final int[] xs = x.clone();3073 for(int i = 0; i < xs.length; i++)3074 xs[i] = xs[i] * y + zs[i];3075 return xs;3076 }3078 static public int[] vsmulsub(int[] x, int y, int[] zs){3079 final int[] xs = x.clone();3080 for(int i = 0; i < xs.length; i++)3081 xs[i] = xs[i] * y - zs[i];3082 return xs;3083 }3085 static public int[] vsmulsadd(int[] x, int y, int z){3086 final int[] xs = x.clone();3087 for(int i = 0; i < xs.length; i++)3088 xs[i] = xs[i] * y + z;3089 return xs;3090 }3092 static public int[] vsmulssub(int[] x, int y, int z){3093 final int[] xs = x.clone();3094 for(int i = 0; i < xs.length; i++)3095 xs[i] = xs[i] * y - z;3096 return xs;3097 }3099 static public int[] vabs(int[] x){3100 final int[] xs = x.clone();3101 for(int i = 0; i < xs.length; i++)3102 xs[i] = Math.abs(xs[i]);3103 return xs;3104 }3106 static public int[] vnegabs(int[] x){3107 final int[] xs = x.clone();3108 for(int i = 0; i < xs.length; i++)3109 xs[i] = -Math.abs(xs[i]);3110 return xs;3111 }3113 static public int[] vneg(int[] x){3114 final int[] xs = x.clone();3115 for(int i = 0; i < xs.length; i++)3116 xs[i] = -xs[i];3117 return xs;3118 }3120 static public int[] vsqr(int[] x){3121 final int[] xs = x.clone();3122 for(int i = 0; i < xs.length; i++)3123 xs[i] *= xs[i];3124 return xs;3125 }3127 static public int[] vsignedsqr(int[] x){3128 final int[] xs = x.clone();3129 for(int i = 0; i < xs.length; i++)3130 xs[i] *= Math.abs(xs[i]);3131 return xs;3132 }3134 static public int[] vclip(int[] x, int low, int high){3135 final int[] xs = x.clone();3136 for(int i = 0; i < xs.length; i++)3137 {3138 if(xs[i] < low)3139 xs[i] = low;3140 else if(xs[i] > high)3141 xs[i] = high;3142 }3143 return xs;3144 }3146 static public IPersistentVector vclipcounts(int[] x, int low, int high){3147 final int[] xs = x.clone();3148 int lowc = 0;3149 int highc = 0;3151 for(int i = 0; i < xs.length; i++)3152 {3153 if(xs[i] < low)3154 {3155 ++lowc;3156 xs[i] = low;3157 }3158 else if(xs[i] > high)3159 {3160 ++highc;3161 xs[i] = high;3162 }3163 }3164 return RT.vector(xs, lowc, highc);3165 }3167 static public int[] vthresh(int[] x, int thresh, int otherwise){3168 final int[] xs = x.clone();3169 for(int i = 0; i < xs.length; i++)3170 {3171 if(xs[i] < thresh)3172 xs[i] = otherwise;3173 }3174 return xs;3175 }3177 static public int[] vreverse(int[] x){3178 final int[] xs = x.clone();3179 for(int i = 0; i < xs.length; i++)3180 xs[i] = xs[xs.length - i - 1];3181 return xs;3182 }3184 static public int[] vrunningsum(int[] x){3185 final int[] xs = x.clone();3186 for(int i = 1; i < xs.length; i++)3187 xs[i] = xs[i - 1] + xs[i];3188 return xs;3189 }3191 static public int[] vsort(int[] x){3192 final int[] xs = x.clone();3193 Arrays.sort(xs);3194 return xs;3195 }3197 static public int vdot(int[] xs, int[] ys){3198 int ret = 0;3199 for(int i = 0; i < xs.length; i++)3200 ret += xs[i] * ys[i];3201 return ret;3202 }3204 static public int vmax(int[] xs){3205 if(xs.length == 0)3206 return 0;3207 int ret = xs[0];3208 for(int i = 0; i < xs.length; i++)3209 ret = Math.max(ret, xs[i]);3210 return ret;3211 }3213 static public int vmin(int[] xs){3214 if(xs.length == 0)3215 return 0;3216 int ret = xs[0];3217 for(int i = 0; i < xs.length; i++)3218 ret = Math.min(ret, xs[i]);3219 return ret;3220 }3222 static public double vmean(int[] xs){3223 if(xs.length == 0)3224 return 0;3225 return vsum(xs) / (double) xs.length;3226 }3228 static public double vrms(int[] xs){3229 if(xs.length == 0)3230 return 0;3231 int ret = 0;3232 for(int i = 0; i < xs.length; i++)3233 ret += xs[i] * xs[i];3234 return Math.sqrt(ret / (double) xs.length);3235 }3237 static public int vsum(int[] xs){3238 int ret = 0;3239 for(int i = 0; i < xs.length; i++)3240 ret += xs[i];3241 return ret;3242 }3244 static public boolean vequiv(int[] xs, int[] ys){3245 return Arrays.equals(xs, ys);3246 }3248 static public int[] vadd(int[] x, int[] ys){3249 final int[] xs = x.clone();3250 for(int i = 0; i < xs.length; i++)3251 xs[i] += ys[i];3252 return xs;3253 }3255 static public int[] vsub(int[] x, int[] ys){3256 final int[] xs = x.clone();3257 for(int i = 0; i < xs.length; i++)3258 xs[i] -= ys[i];3259 return xs;3260 }3262 static public int[] vaddmul(int[] x, int[] ys, int[] zs){3263 final int[] xs = x.clone();3264 for(int i = 0; i < xs.length; i++)3265 xs[i] = (xs[i] + ys[i]) * zs[i];3266 return xs;3267 }3269 static public int[] vsubmul(int[] x, int[] ys, int[] zs){3270 final int[] xs = x.clone();3271 for(int i = 0; i < xs.length; i++)3272 xs[i] = (xs[i] - ys[i]) * zs[i];3273 return xs;3274 }3276 static public int[] vaddsmul(int[] x, int[] ys, int z){3277 final int[] xs = x.clone();3278 for(int i = 0; i < xs.length; i++)3279 xs[i] = (xs[i] + ys[i]) * z;3280 return xs;3281 }3283 static public int[] vsubsmul(int[] x, int[] ys, int z){3284 final int[] xs = x.clone();3285 for(int i = 0; i < xs.length; i++)3286 xs[i] = (xs[i] - ys[i]) * z;3287 return xs;3288 }3290 static public int[] vmulsadd(int[] x, int[] ys, int z){3291 final int[] xs = x.clone();3292 for(int i = 0; i < xs.length; i++)3293 xs[i] = (xs[i] * ys[i]) + z;3294 return xs;3295 }3297 static public int[] vdiv(int[] x, int[] ys){3298 final int[] xs = x.clone();3299 for(int i = 0; i < xs.length; i++)3300 xs[i] /= ys[i];3301 return xs;3302 }3304 static public int[] vmul(int[] x, int[] ys){3305 final int[] xs = x.clone();3306 for(int i = 0; i < xs.length; i++)3307 xs[i] *= ys[i];3308 return xs;3309 }3311 static public int[] vmuladd(int[] x, int[] ys, int[] zs){3312 final int[] xs = x.clone();3313 for(int i = 0; i < xs.length; i++)3314 xs[i] = (xs[i] * ys[i]) + zs[i];3315 return xs;3316 }3318 static public int[] vmulsub(int[] x, int[] ys, int[] zs){3319 final int[] xs = x.clone();3320 for(int i = 0; i < xs.length; i++)3321 xs[i] = (xs[i] * ys[i]) - zs[i];3322 return xs;3323 }3325 static public int[] vmax(int[] x, int[] ys){3326 final int[] xs = x.clone();3327 for(int i = 0; i < xs.length; i++)3328 xs[i] = Math.max(xs[i], ys[i]);3329 return xs;3330 }3332 static public int[] vmin(int[] x, int[] ys){3333 final int[] xs = x.clone();3334 for(int i = 0; i < xs.length; i++)3335 xs[i] = Math.min(xs[i], ys[i]);3336 return xs;3337 }3339 static public int[] vmap(IFn fn, int[] x) throws Exception{3340 int[] xs = x.clone();3341 for(int i = 0; i < xs.length; i++)3342 xs[i] = ((Number) fn.invoke(xs[i])).intValue();3343 return xs;3344 }3346 static public int[] vmap(IFn fn, int[] x, int[] ys) throws Exception{3347 int[] xs = x.clone();3348 for(int i = 0; i < xs.length; i++)3349 xs[i] = ((Number) fn.invoke(xs[i], ys[i])).intValue();3350 return xs;3351 }3353 }3355 static public class L{3356 static public long add(long x, long y){3357 return x + y;3358 }3360 static public long subtract(long x, long y){3361 return x - y;3362 }3364 static public long negate(long x){3365 return -x;3366 }3368 static public long inc(long x){3369 return x + 1;3370 }3372 static public long dec(long x){3373 return x - 1;3374 }3376 static public long multiply(long x, long y){3377 return x * y;3378 }3380 static public long divide(long x, long y){3381 return x / y;3382 }3384 static public boolean equiv(long x, long y){3385 return x == y;3386 }3388 static public boolean lt(long x, long y){3389 return x < y;3390 }3392 static public boolean lte(long x, long y){3393 return x <= y;3394 }3396 static public boolean gt(long x, long y){3397 return x > y;3398 }3400 static public boolean gte(long x, long y){3401 return x >= y;3402 }3404 static public boolean pos(long x){3405 return x > 0;3406 }3408 static public boolean neg(long x){3409 return x < 0;3410 }3412 static public boolean zero(long x){3413 return x == 0;3414 }3416 static public long aget(long[] xs, int i){3417 return xs[i];3418 }3420 static public long aset(long[] xs, int i, long v){3421 xs[i] = v;3422 return v;3423 }3425 static public int alength(long[] xs){3426 return xs.length;3427 }3429 static public long[] aclone(long[] xs){3430 return xs.clone();3431 }3433 static public long[] vec(int size, Object init){3434 long[] ret = new long[size];3435 if(init instanceof Number)3436 {3437 long f = ((Number) init).longValue();3438 for(int i = 0; i < ret.length; i++)3439 ret[i] = f;3440 }3441 else3442 {3443 ISeq s = RT.seq(init);3444 for(int i = 0; i < size && s != null; i++, s = s.rest())3445 ret[i] = ((Number) s.first()).longValue();3446 }3447 return ret;3448 }3450 static public long[] vec(Object sizeOrSeq){3451 if(sizeOrSeq instanceof Number)3452 return new long[((Number) sizeOrSeq).intValue()];3453 else3454 {3455 ISeq s = RT.seq(sizeOrSeq);3456 int size = s.count();3457 long[] ret = new long[size];3458 for(int i = 0; i < size && s != null; i++, s = s.rest())3459 ret[i] = ((Number) s.first()).intValue();3460 return ret;3461 }3462 }3465 static public long[] vsadd(long[] x, long y){3466 final long[] xs = x.clone();3467 for(int i = 0; i < xs.length; i++)3468 xs[i] += y;3469 return xs;3470 }3472 static public long[] vssub(long[] x, long y){3473 final long[] xs = x.clone();3474 for(int i = 0; i < xs.length; i++)3475 xs[i] -= y;3476 return xs;3477 }3479 static public long[] vsdiv(long[] x, long y){3480 final long[] xs = x.clone();3481 for(int i = 0; i < xs.length; i++)3482 xs[i] /= y;3483 return xs;3484 }3486 static public long[] vsmul(long[] x, long y){3487 final long[] xs = x.clone();3488 for(int i = 0; i < xs.length; i++)3489 xs[i] *= y;3490 return xs;3491 }3493 static public long[] svdiv(long y, long[] x){3494 final long[] xs = x.clone();3495 for(int i = 0; i < xs.length; i++)3496 xs[i] = y / xs[i];3497 return xs;3498 }3500 static public long[] vsmuladd(long[] x, long y, long[] zs){3501 final long[] xs = x.clone();3502 for(int i = 0; i < xs.length; i++)3503 xs[i] = xs[i] * y + zs[i];3504 return xs;3505 }3507 static public long[] vsmulsub(long[] x, long y, long[] zs){3508 final long[] xs = x.clone();3509 for(int i = 0; i < xs.length; i++)3510 xs[i] = xs[i] * y - zs[i];3511 return xs;3512 }3514 static public long[] vsmulsadd(long[] x, long y, long z){3515 final long[] xs = x.clone();3516 for(int i = 0; i < xs.length; i++)3517 xs[i] = xs[i] * y + z;3518 return xs;3519 }3521 static public long[] vsmulssub(long[] x, long y, long z){3522 final long[] xs = x.clone();3523 for(int i = 0; i < xs.length; i++)3524 xs[i] = xs[i] * y - z;3525 return xs;3526 }3528 static public long[] vabs(long[] x){3529 final long[] xs = x.clone();3530 for(int i = 0; i < xs.length; i++)3531 xs[i] = Math.abs(xs[i]);3532 return xs;3533 }3535 static public long[] vnegabs(long[] x){3536 final long[] xs = x.clone();3537 for(int i = 0; i < xs.length; i++)3538 xs[i] = -Math.abs(xs[i]);3539 return xs;3540 }3542 static public long[] vneg(long[] x){3543 final long[] xs = x.clone();3544 for(int i = 0; i < xs.length; i++)3545 xs[i] = -xs[i];3546 return xs;3547 }3549 static public long[] vsqr(long[] x){3550 final long[] xs = x.clone();3551 for(int i = 0; i < xs.length; i++)3552 xs[i] *= xs[i];3553 return xs;3554 }3556 static public long[] vsignedsqr(long[] x){3557 final long[] xs = x.clone();3558 for(int i = 0; i < xs.length; i++)3559 xs[i] *= Math.abs(xs[i]);3560 return xs;3561 }3563 static public long[] vclip(long[] x, long low, long high){3564 final long[] xs = x.clone();3565 for(int i = 0; i < xs.length; i++)3566 {3567 if(xs[i] < low)3568 xs[i] = low;3569 else if(xs[i] > high)3570 xs[i] = high;3571 }3572 return xs;3573 }3575 static public IPersistentVector vclipcounts(long[] x, long low, long high){3576 final long[] xs = x.clone();3577 int lowc = 0;3578 int highc = 0;3580 for(int i = 0; i < xs.length; i++)3581 {3582 if(xs[i] < low)3583 {3584 ++lowc;3585 xs[i] = low;3586 }3587 else if(xs[i] > high)3588 {3589 ++highc;3590 xs[i] = high;3591 }3592 }3593 return RT.vector(xs, lowc, highc);3594 }3596 static public long[] vthresh(long[] x, long thresh, long otherwise){3597 final long[] xs = x.clone();3598 for(int i = 0; i < xs.length; i++)3599 {3600 if(xs[i] < thresh)3601 xs[i] = otherwise;3602 }3603 return xs;3604 }3606 static public long[] vreverse(long[] x){3607 final long[] xs = x.clone();3608 for(int i = 0; i < xs.length; i++)3609 xs[i] = xs[xs.length - i - 1];3610 return xs;3611 }3613 static public long[] vrunningsum(long[] x){3614 final long[] xs = x.clone();3615 for(int i = 1; i < xs.length; i++)3616 xs[i] = xs[i - 1] + xs[i];3617 return xs;3618 }3620 static public long[] vsort(long[] x){3621 final long[] xs = x.clone();3622 Arrays.sort(xs);3623 return xs;3624 }3626 static public long vdot(long[] xs, long[] ys){3627 long ret = 0;3628 for(int i = 0; i < xs.length; i++)3629 ret += xs[i] * ys[i];3630 return ret;3631 }3633 static public long vmax(long[] xs){3634 if(xs.length == 0)3635 return 0;3636 long ret = xs[0];3637 for(int i = 0; i < xs.length; i++)3638 ret = Math.max(ret, xs[i]);3639 return ret;3640 }3642 static public long vmin(long[] xs){3643 if(xs.length == 0)3644 return 0;3645 long ret = xs[0];3646 for(int i = 0; i < xs.length; i++)3647 ret = Math.min(ret, xs[i]);3648 return ret;3649 }3651 static public double vmean(long[] xs){3652 if(xs.length == 0)3653 return 0;3654 return vsum(xs) / (double) xs.length;3655 }3657 static public double vrms(long[] xs){3658 if(xs.length == 0)3659 return 0;3660 long ret = 0;3661 for(int i = 0; i < xs.length; i++)3662 ret += xs[i] * xs[i];3663 return Math.sqrt(ret / (double) xs.length);3664 }3666 static public long vsum(long[] xs){3667 long ret = 0;3668 for(int i = 0; i < xs.length; i++)3669 ret += xs[i];3670 return ret;3671 }3673 static public boolean vequiv(long[] xs, long[] ys){3674 return Arrays.equals(xs, ys);3675 }3677 static public long[] vadd(long[] x, long[] ys){3678 final long[] xs = x.clone();3679 for(int i = 0; i < xs.length; i++)3680 xs[i] += ys[i];3681 return xs;3682 }3684 static public long[] vsub(long[] x, long[] ys){3685 final long[] xs = x.clone();3686 for(int i = 0; i < xs.length; i++)3687 xs[i] -= ys[i];3688 return xs;3689 }3691 static public long[] vaddmul(long[] x, long[] ys, long[] zs){3692 final long[] xs = x.clone();3693 for(int i = 0; i < xs.length; i++)3694 xs[i] = (xs[i] + ys[i]) * zs[i];3695 return xs;3696 }3698 static public long[] vsubmul(long[] x, long[] ys, long[] zs){3699 final long[] xs = x.clone();3700 for(int i = 0; i < xs.length; i++)3701 xs[i] = (xs[i] - ys[i]) * zs[i];3702 return xs;3703 }3705 static public long[] vaddsmul(long[] x, long[] ys, long z){3706 final long[] xs = x.clone();3707 for(int i = 0; i < xs.length; i++)3708 xs[i] = (xs[i] + ys[i]) * z;3709 return xs;3710 }3712 static public long[] vsubsmul(long[] x, long[] ys, long z){3713 final long[] xs = x.clone();3714 for(int i = 0; i < xs.length; i++)3715 xs[i] = (xs[i] - ys[i]) * z;3716 return xs;3717 }3719 static public long[] vmulsadd(long[] x, long[] ys, long z){3720 final long[] xs = x.clone();3721 for(int i = 0; i < xs.length; i++)3722 xs[i] = (xs[i] * ys[i]) + z;3723 return xs;3724 }3726 static public long[] vdiv(long[] x, long[] ys){3727 final long[] xs = x.clone();3728 for(int i = 0; i < xs.length; i++)3729 xs[i] /= ys[i];3730 return xs;3731 }3733 static public long[] vmul(long[] x, long[] ys){3734 final long[] xs = x.clone();3735 for(int i = 0; i < xs.length; i++)3736 xs[i] *= ys[i];3737 return xs;3738 }3740 static public long[] vmuladd(long[] x, long[] ys, long[] zs){3741 final long[] xs = x.clone();3742 for(int i = 0; i < xs.length; i++)3743 xs[i] = (xs[i] * ys[i]) + zs[i];3744 return xs;3745 }3747 static public long[] vmulsub(long[] x, long[] ys, long[] zs){3748 final long[] xs = x.clone();3749 for(int i = 0; i < xs.length; i++)3750 xs[i] = (xs[i] * ys[i]) - zs[i];3751 return xs;3752 }3754 static public long[] vmax(long[] x, long[] ys){3755 final long[] xs = x.clone();3756 for(int i = 0; i < xs.length; i++)3757 xs[i] = Math.max(xs[i], ys[i]);3758 return xs;3759 }3761 static public long[] vmin(long[] x, long[] ys){3762 final long[] xs = x.clone();3763 for(int i = 0; i < xs.length; i++)3764 xs[i] = Math.min(xs[i], ys[i]);3765 return xs;3766 }3768 static public long[] vmap(IFn fn, long[] x) throws Exception{3769 long[] xs = x.clone();3770 for(int i = 0; i < xs.length; i++)3771 xs[i] = ((Number) fn.invoke(xs[i])).longValue();3772 return xs;3773 }3775 static public long[] vmap(IFn fn, long[] x, long[] ys) throws Exception{3776 long[] xs = x.clone();3777 for(int i = 0; i < xs.length; i++)3778 xs[i] = ((Number) fn.invoke(xs[i], ys[i])).longValue();3779 return xs;3780 }3782 }3783 */3786 //overload resolution3788 static public Number add(int x, Object y){3789 return add((Object)x,y);3790 }3792 static public Number add(Object x, int y){3793 return add(x,(Object)y);3794 }3796 static public Number and(int x, Object y){3797 return and((Object)x,y);3798 }3800 static public Number and(Object x, int y){3801 return and(x,(Object)y);3802 }3804 static public Number or(int x, Object y){3805 return or((Object)x,y);3806 }3808 static public Number or(Object x, int y){3809 return or(x,(Object)y);3810 }3812 static public Number xor(int x, Object y){3813 return xor((Object)x,y);3814 }3816 static public Number xor(Object x, int y){3817 return xor(x,(Object)y);3818 }3820 static public Number add(float x, Object y){3821 return add((Object)x,y);3822 }3824 static public Number add(Object x, float y){3825 return add(x,(Object)y);3826 }3828 static public Number add(long x, Object y){3829 return add((Object)x,y);3830 }3832 static public Number add(Object x, long y){3833 return add(x,(Object)y);3834 }3836 static public Number add(double x, Object y){3837 return add((Object)x,y);3838 }3840 static public Number add(Object x, double y){3841 return add(x,(Object)y);3842 }3844 static public Number minus(int x, Object y){3845 return minus((Object)x,y);3846 }3848 static public Number minus(Object x, int y){3849 return minus(x,(Object)y);3850 }3852 static public Number minus(float x, Object y){3853 return minus((Object)x,y);3854 }3856 static public Number minus(Object x, float y){3857 return minus(x,(Object)y);3858 }3860 static public Number minus(long x, Object y){3861 return minus((Object)x,y);3862 }3864 static public Number minus(Object x, long y){3865 return minus(x,(Object)y);3866 }3868 static public Number minus(double x, Object y){3869 return minus((Object)x,y);3870 }3872 static public Number minus(Object x, double y){3873 return minus(x,(Object)y);3874 }3876 static public Number multiply(int x, Object y){3877 return multiply((Object)x,y);3878 }3880 static public Number multiply(Object x, int y){3881 return multiply(x,(Object)y);3882 }3884 static public Number multiply(float x, Object y){3885 return multiply((Object)x,y);3886 }3888 static public Number multiply(Object x, float y){3889 return multiply(x,(Object)y);3890 }3892 static public Number multiply(long x, Object y){3893 return multiply((Object)x,y);3894 }3896 static public Number multiply(Object x, long y){3897 return multiply(x,(Object)y);3898 }3900 static public Number multiply(double x, Object y){3901 return multiply((Object)x,y);3902 }3904 static public Number multiply(Object x, double y){3905 return multiply(x,(Object)y);3906 }3908 static public Number divide(int x, Object y){3909 return divide((Object)x,y);3910 }3912 static public Number divide(Object x, int y){3913 return divide(x,(Object)y);3914 }3916 static public Number divide(float x, Object y){3917 return divide((Object)x,y);3918 }3920 static public Number divide(Object x, float y){3921 return divide(x,(Object)y);3922 }3924 static public Number divide(long x, Object y){3925 return divide((Object)x,y);3926 }3928 static public Number divide(Object x, long y){3929 return divide(x,(Object)y);3930 }3932 static public Number divide(double x, Object y){3933 return divide((Object)x,y);3934 }3936 static public Number divide(Object x, double y){3937 return divide(x,(Object)y);3938 }3940 static public boolean lt(int x, Object y){3941 return lt((Object)x,y);3942 }3944 static public boolean lt(Object x, int y){3945 return lt(x,(Object)y);3946 }3948 static public boolean lt(float x, Object y){3949 return lt((Object)x,y);3950 }3952 static public boolean lt(Object x, float y){3953 return lt(x,(Object)y);3954 }3956 static public boolean lt(long x, Object y){3957 return lt((Object)x,y);3958 }3960 static public boolean lt(Object x, long y){3961 return lt(x,(Object)y);3962 }3964 static public boolean lt(double x, Object y){3965 return lt((Object)x,y);3966 }3968 static public boolean lt(Object x, double y){3969 return lt(x,(Object)y);3970 }3972 static public boolean lte(int x, Object y){3973 return lte((Object)x,y);3974 }3976 static public boolean lte(Object x, int y){3977 return lte(x,(Object)y);3978 }3980 static public boolean lte(float x, Object y){3981 return lte((Object)x,y);3982 }3984 static public boolean lte(Object x, float y){3985 return lte(x,(Object)y);3986 }3988 static public boolean lte(long x, Object y){3989 return lte((Object)x,y);3990 }3992 static public boolean lte(Object x, long y){3993 return lte(x,(Object)y);3994 }3996 static public boolean lte(double x, Object y){3997 return lte((Object)x,y);3998 }4000 static public boolean lte(Object x, double y){4001 return lte(x,(Object)y);4002 }4004 static public boolean gt(int x, Object y){4005 return gt((Object)x,y);4006 }4008 static public boolean gt(Object x, int y){4009 return gt(x,(Object)y);4010 }4012 static public boolean gt(float x, Object y){4013 return gt((Object)x,y);4014 }4016 static public boolean gt(Object x, float y){4017 return gt(x,(Object)y);4018 }4020 static public boolean gt(long x, Object y){4021 return gt((Object)x,y);4022 }4024 static public boolean gt(Object x, long y){4025 return gt(x,(Object)y);4026 }4028 static public boolean gt(double x, Object y){4029 return gt((Object)x,y);4030 }4032 static public boolean gt(Object x, double y){4033 return gt(x,(Object)y);4034 }4036 static public boolean gte(int x, Object y){4037 return gte((Object)x,y);4038 }4040 static public boolean gte(Object x, int y){4041 return gte(x,(Object)y);4042 }4044 static public boolean gte(float x, Object y){4045 return gte((Object)x,y);4046 }4048 static public boolean gte(Object x, float y){4049 return gte(x,(Object)y);4050 }4052 static public boolean gte(long x, Object y){4053 return gte((Object)x,y);4054 }4056 static public boolean gte(Object x, long y){4057 return gte(x,(Object)y);4058 }4060 static public boolean gte(double x, Object y){4061 return gte((Object)x,y);4062 }4064 static public boolean gte(Object x, double y){4065 return gte(x,(Object)y);4066 }4069 static public boolean equiv(int x, Object y){4070 return equiv((Object)x,y);4071 }4073 static public boolean equiv(Object x, int y){4074 return equiv(x,(Object)y);4075 }4077 static public boolean equiv(float x, Object y){4078 return equiv((Object)x,y);4079 }4081 static public boolean equiv(Object x, float y){4082 return equiv(x,(Object)y);4083 }4085 static public boolean equiv(long x, Object y){4086 return equiv((Object)x,y);4087 }4089 static public boolean equiv(Object x, long y){4090 return equiv(x,(Object)y);4091 }4093 static public boolean equiv(double x, Object y){4094 return equiv((Object)x,y);4095 }4097 static public boolean equiv(Object x, double y){4098 return equiv(x,(Object)y);4099 }4102 static public float add(int x, float y){4103 return add((float)x,y);4104 }4106 static public float add(float x, int y){4107 return add(x,(float)y);4108 }4110 static public double add(int x, double y){4111 return add((double)x,y);4112 }4114 static public double add(double x, int y){4115 return add(x,(double)y);4116 }4118 static public long add(int x, long y){4119 return add((long)x,y);4120 }4122 static public long add(long x, int y){4123 return add(x,(long)y);4124 }4126 static public float add(long x, float y){4127 return add((float)x,y);4128 }4130 static public float add(float x, long y){4131 return add(x,(float)y);4132 }4134 static public double add(long x, double y){4135 return add((double)x,y);4136 }4138 static public double add(double x, long y){4139 return add(x,(double)y);4140 }4142 static public double add(float x, double y){4143 return add((double)x,y);4144 }4146 static public double add(double x, float y){4147 return add(x,(double)y);4148 }4150 static public float minus(int x, float y){4151 return minus((float)x,y);4152 }4154 static public float minus(float x, int y){4155 return minus(x,(float)y);4156 }4158 static public double minus(int x, double y){4159 return minus((double)x,y);4160 }4162 static public double minus(double x, int y){4163 return minus(x,(double)y);4164 }4166 static public long minus(int x, long y){4167 return minus((long)x,y);4168 }4170 static public long minus(long x, int y){4171 return minus(x,(long)y);4172 }4174 static public float minus(long x, float y){4175 return minus((float)x,y);4176 }4178 static public float minus(float x, long y){4179 return minus(x,(float)y);4180 }4182 static public double minus(long x, double y){4183 return minus((double)x,y);4184 }4186 static public double minus(double x, long y){4187 return minus(x,(double)y);4188 }4190 static public double minus(float x, double y){4191 return minus((double)x,y);4192 }4194 static public double minus(double x, float y){4195 return minus(x,(double)y);4196 }4198 static public float multiply(int x, float y){4199 return multiply((float)x,y);4200 }4202 static public float multiply(float x, int y){4203 return multiply(x,(float)y);4204 }4206 static public double multiply(int x, double y){4207 return multiply((double)x,y);4208 }4210 static public double multiply(double x, int y){4211 return multiply(x,(double)y);4212 }4214 static public long multiply(int x, long y){4215 return multiply((long)x,y);4216 }4218 static public long multiply(long x, int y){4219 return multiply(x,(long)y);4220 }4222 static public float multiply(long x, float y){4223 return multiply((float)x,y);4224 }4226 static public float multiply(float x, long y){4227 return multiply(x,(float)y);4228 }4230 static public double multiply(long x, double y){4231 return multiply((double)x,y);4232 }4234 static public double multiply(double x, long y){4235 return multiply(x,(double)y);4236 }4238 static public double multiply(float x, double y){4239 return multiply((double)x,y);4240 }4242 static public double multiply(double x, float y){4243 return multiply(x,(double)y);4244 }4246 static public float divide(int x, float y){4247 return divide((float)x,y);4248 }4250 static public float divide(float x, int y){4251 return divide(x,(float)y);4252 }4254 static public double divide(int x, double y){4255 return divide((double)x,y);4256 }4258 static public double divide(double x, int y){4259 return divide(x,(double)y);4260 }4262 static public float divide(long x, float y){4263 return divide((float)x,y);4264 }4266 static public float divide(float x, long y){4267 return divide(x,(float)y);4268 }4270 static public double divide(long x, double y){4271 return divide((double)x,y);4272 }4274 static public double divide(double x, long y){4275 return divide(x,(double)y);4276 }4278 static public double divide(float x, double y){4279 return divide((double)x,y);4280 }4282 static public double divide(double x, float y){4283 return divide(x,(double)y);4284 }4286 static public boolean lt(int x, float y){4287 return lt((float)x,y);4288 }4290 static public boolean lt(float x, int y){4291 return lt(x,(float)y);4292 }4294 static public boolean lt(int x, double y){4295 return lt((double)x,y);4296 }4298 static public boolean lt(double x, int y){4299 return lt(x,(double)y);4300 }4302 static public boolean lt(int x, long y){4303 return lt((long)x,y);4304 }4306 static public boolean lt(long x, int y){4307 return lt(x,(long)y);4308 }4310 static public boolean lt(long x, float y){4311 return lt((float)x,y);4312 }4314 static public boolean lt(float x, long y){4315 return lt(x,(float)y);4316 }4318 static public boolean lt(long x, double y){4319 return lt((double)x,y);4320 }4322 static public boolean lt(double x, long y){4323 return lt(x,(double)y);4324 }4326 static public boolean lt(float x, double y){4327 return lt((double)x,y);4328 }4330 static public boolean lt(double x, float y){4331 return lt(x,(double)y);4332 }4335 static public boolean lte(int x, float y){4336 return lte((float)x,y);4337 }4339 static public boolean lte(float x, int y){4340 return lte(x,(float)y);4341 }4343 static public boolean lte(int x, double y){4344 return lte((double)x,y);4345 }4347 static public boolean lte(double x, int y){4348 return lte(x,(double)y);4349 }4351 static public boolean lte(int x, long y){4352 return lte((long)x,y);4353 }4355 static public boolean lte(long x, int y){4356 return lte(x,(long)y);4357 }4359 static public boolean lte(long x, float y){4360 return lte((float)x,y);4361 }4363 static public boolean lte(float x, long y){4364 return lte(x,(float)y);4365 }4367 static public boolean lte(long x, double y){4368 return lte((double)x,y);4369 }4371 static public boolean lte(double x, long y){4372 return lte(x,(double)y);4373 }4375 static public boolean lte(float x, double y){4376 return lte((double)x,y);4377 }4379 static public boolean lte(double x, float y){4380 return lte(x,(double)y);4381 }4383 static public boolean gt(int x, float y){4384 return gt((float)x,y);4385 }4387 static public boolean gt(float x, int y){4388 return gt(x,(float)y);4389 }4391 static public boolean gt(int x, double y){4392 return gt((double)x,y);4393 }4395 static public boolean gt(double x, int y){4396 return gt(x,(double)y);4397 }4399 static public boolean gt(int x, long y){4400 return gt((long)x,y);4401 }4403 static public boolean gt(long x, int y){4404 return gt(x,(long)y);4405 }4407 static public boolean gt(long x, float y){4408 return gt((float)x,y);4409 }4411 static public boolean gt(float x, long y){4412 return gt(x,(float)y);4413 }4415 static public boolean gt(long x, double y){4416 return gt((double)x,y);4417 }4419 static public boolean gt(double x, long y){4420 return gt(x,(double)y);4421 }4423 static public boolean gt(float x, double y){4424 return gt((double)x,y);4425 }4427 static public boolean gt(double x, float y){4428 return gt(x,(double)y);4429 }4431 static public boolean gte(int x, float y){4432 return gte((float)x,y);4433 }4435 static public boolean gte(float x, int y){4436 return gte(x,(float)y);4437 }4439 static public boolean gte(int x, double y){4440 return gte((double)x,y);4441 }4443 static public boolean gte(double x, int y){4444 return gte(x,(double)y);4445 }4447 static public boolean gte(int x, long y){4448 return gte((long)x,y);4449 }4451 static public boolean gte(long x, int y){4452 return gte(x,(long)y);4453 }4455 static public boolean gte(long x, float y){4456 return gte((float)x,y);4457 }4459 static public boolean gte(float x, long y){4460 return gte(x,(float)y);4461 }4463 static public boolean gte(long x, double y){4464 return gte((double)x,y);4465 }4467 static public boolean gte(double x, long y){4468 return gte(x,(double)y);4469 }4471 static public boolean gte(float x, double y){4472 return gte((double)x,y);4473 }4475 static public boolean gte(double x, float y){4476 return gte(x,(double)y);4477 }4479 static public boolean equiv(int x, float y){4480 return equiv((float)x,y);4481 }4483 static public boolean equiv(float x, int y){4484 return equiv(x,(float)y);4485 }4487 static public boolean equiv(int x, double y){4488 return equiv((double)x,y);4489 }4491 static public boolean equiv(double x, int y){4492 return equiv(x,(double)y);4493 }4495 static public boolean equiv(int x, long y){4496 return equiv((long)x,y);4497 }4499 static public boolean equiv(long x, int y){4500 return equiv(x,(long)y);4501 }4503 static public boolean equiv(long x, float y){4504 return equiv((float)x,y);4505 }4507 static public boolean equiv(float x, long y){4508 return equiv(x,(float)y);4509 }4511 static public boolean equiv(long x, double y){4512 return equiv((double)x,y);4513 }4515 static public boolean equiv(double x, long y){4516 return equiv(x,(double)y);4517 }4519 static public boolean equiv(float x, double y){4520 return equiv((double)x,y);4521 }4523 static public boolean equiv(double x, float y){4524 return equiv(x,(double)y);4525 }4527 }