Class LongMath
- java.lang.Object
-
- com.google.common.math.LongMath
-
public final class LongMath extends java.lang.ObjectA class for arithmetic on values of typelong. Where possible, methods are defined and named analogously to theirBigIntegercounterparts.The implementations of many methods in this class are based on material from Henry S. Warren, Jr.'s Hacker's Delight, (Addison Wesley, 2002).
Similar functionality for
intand forBigIntegercan be found inIntMathandBigIntegerMathrespectively. For other common operations onlongvalues, seeLongs.- Since:
- 11.0
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classLongMath.MillerRabinTester
-
Field Summary
Fields Modifier and Type Field Description (package private) static int[]biggestBinomials(package private) static int[]biggestSimpleBinomials(package private) static long[]factorials(package private) static longFLOOR_SQRT_MAX_LONG(package private) static long[]halfPowersOf10(package private) static longMAX_POWER_OF_SQRT2_UNSIGNEDThe biggest half power of two that fits into an unsigned long(package private) static longMAX_SIGNED_POWER_OF_TWO(package private) static byte[]maxLog10ForLeadingZerosprivate static long[][]millerRabinBaseSets(package private) static long[]powersOf10private static intSIEVE_30
-
Constructor Summary
Constructors Modifier Constructor Description privateLongMath()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static longbinomial(int n, int k)Returnsnchoosek, also known as the binomial coefficient ofnandk, orLong.MAX_VALUEif the result does not fit in along.static longceilingPowerOfTwo(long x)Returns the smallest power of two greater than or equal tox.static longcheckedAdd(long a, long b)Returns the sum ofaandb, provided it does not overflow.static longcheckedMultiply(long a, long b)Returns the product ofaandb, provided it does not overflow.static longcheckedPow(long b, int k)Returns thebto thekth power, provided it does not overflow.static longcheckedSubtract(long a, long b)Returns the difference ofaandb, provided it does not overflow.static longdivide(long p, long q, java.math.RoundingMode mode)Returns the result of dividingpbyq, rounding using the specifiedRoundingMode.static longfactorial(int n)Returnsn!, that is, the product of the firstnpositive integers,1ifn == 0, orLong.MAX_VALUEif the result does not fit in along.(package private) static booleanfitsInInt(long x)static longfloorPowerOfTwo(long x)Returns the largest power of two less than or equal tox.static longgcd(long a, long b)Returns the greatest common divisor ofa, b.static booleanisPowerOfTwo(long x)Returnstrueifxrepresents a power of two.static booleanisPrime(long n)Returnstrueifnis a prime number: an integer greater than one that cannot be factored into a product of smaller positive integers.(package private) static intlessThanBranchFree(long x, long y)Returns 1 ifx < yas unsigned longs, and 0 otherwise.static intlog10(long x, java.math.RoundingMode mode)Returns the base-10 logarithm ofx, rounded according to the specified rounding mode.(package private) static intlog10Floor(long x)static intlog2(long x, java.math.RoundingMode mode)Returns the base-2 logarithm ofx, rounded according to the specified rounding mode.static longmean(long x, long y)Returns the arithmetic mean ofxandy, rounded toward negative infinity.static intmod(long x, int m)Returnsx mod m, a non-negative value less thanm.static longmod(long x, long m)Returnsx mod m, a non-negative value less thanm.(package private) static longmultiplyFraction(long x, long numerator, long denominator)Returns (x * numerator / denominator), which is assumed to come out to an integral value.static longpow(long b, int k)Returnsbto thekth power.static doubleroundToDouble(long x, java.math.RoundingMode mode)Returnsx, rounded to adoublewith the specified rounding mode.static longsaturatedAdd(long a, long b)Returns the sum ofaandbunless it would overflow or underflow in which caseLong.MAX_VALUEorLong.MIN_VALUEis returned, respectively.static longsaturatedMultiply(long a, long b)Returns the product ofaandbunless it would overflow or underflow in which caseLong.MAX_VALUEorLong.MIN_VALUEis returned, respectively.static longsaturatedPow(long b, int k)Returns thebto thekth power, unless it would overflow or underflow in which caseLong.MAX_VALUEorLong.MIN_VALUEis returned, respectively.static longsaturatedSubtract(long a, long b)Returns the difference ofaandbunless it would overflow or underflow in which caseLong.MAX_VALUEorLong.MIN_VALUEis returned, respectively.static longsqrt(long x, java.math.RoundingMode mode)Returns the square root ofx, rounded with the specified rounding mode.
-
-
-
Field Detail
-
MAX_SIGNED_POWER_OF_TWO
static final long MAX_SIGNED_POWER_OF_TWO
- See Also:
- Constant Field Values
-
MAX_POWER_OF_SQRT2_UNSIGNED
static final long MAX_POWER_OF_SQRT2_UNSIGNED
The biggest half power of two that fits into an unsigned long- See Also:
- Constant Field Values
-
maxLog10ForLeadingZeros
static final byte[] maxLog10ForLeadingZeros
-
powersOf10
static final long[] powersOf10
-
halfPowersOf10
static final long[] halfPowersOf10
-
FLOOR_SQRT_MAX_LONG
static final long FLOOR_SQRT_MAX_LONG
- See Also:
- Constant Field Values
-
factorials
static final long[] factorials
-
biggestBinomials
static final int[] biggestBinomials
-
biggestSimpleBinomials
static final int[] biggestSimpleBinomials
-
SIEVE_30
private static final int SIEVE_30
- See Also:
- Constant Field Values
-
millerRabinBaseSets
private static final long[][] millerRabinBaseSets
-
-
Method Detail
-
ceilingPowerOfTwo
public static long ceilingPowerOfTwo(long x)
Returns the smallest power of two greater than or equal tox. This is equivalent tocheckedPow(2, log2(x, CEILING)).- Throws:
java.lang.IllegalArgumentException- ifx <= 0java.lang.ArithmeticException- of the next-higher power of two is not representable as along, i.e. whenx > 2^62- Since:
- 20.0
-
floorPowerOfTwo
public static long floorPowerOfTwo(long x)
Returns the largest power of two less than or equal tox. This is equivalent tocheckedPow(2, log2(x, FLOOR)).- Throws:
java.lang.IllegalArgumentException- ifx <= 0- Since:
- 20.0
-
isPowerOfTwo
public static boolean isPowerOfTwo(long x)
Returnstrueifxrepresents a power of two.This differs from
Long.bitCount(x) == 1, becauseLong.bitCount(Long.MIN_VALUE) == 1, butLong.MIN_VALUEis not a power of two.
-
lessThanBranchFree
static int lessThanBranchFree(long x, long y)Returns 1 ifx < yas unsigned longs, and 0 otherwise. Assumes that x - y fits into a signed long. The implementation is branch-free, and benchmarks suggest it is measurably faster than the straightforward ternary expression.
-
log2
public static int log2(long x, java.math.RoundingMode mode)Returns the base-2 logarithm ofx, rounded according to the specified rounding mode.- Throws:
java.lang.IllegalArgumentException- ifx <= 0java.lang.ArithmeticException- ifmodeisRoundingMode.UNNECESSARYandxis not a power of two
-
log10
public static int log10(long x, java.math.RoundingMode mode)Returns the base-10 logarithm ofx, rounded according to the specified rounding mode.- Throws:
java.lang.IllegalArgumentException- ifx <= 0java.lang.ArithmeticException- ifmodeisRoundingMode.UNNECESSARYandxis not a power of ten
-
log10Floor
static int log10Floor(long x)
-
pow
public static long pow(long b, int k)Returnsbto thekth power. Even if the result overflows, it will be equal toBigInteger.valueOf(b).pow(k).longValue(). This implementation runs inO(log k)time.- Throws:
java.lang.IllegalArgumentException- ifk < 0
-
sqrt
public static long sqrt(long x, java.math.RoundingMode mode)Returns the square root ofx, rounded with the specified rounding mode.- Throws:
java.lang.IllegalArgumentException- ifx < 0java.lang.ArithmeticException- ifmodeisRoundingMode.UNNECESSARYandsqrt(x)is not an integer
-
divide
public static long divide(long p, long q, java.math.RoundingMode mode)Returns the result of dividingpbyq, rounding using the specifiedRoundingMode.- Throws:
java.lang.ArithmeticException- ifq == 0, or ifmode == UNNECESSARYandais not an integer multiple ofb
-
mod
public static int mod(long x, int m)Returnsx mod m, a non-negative value less thanm. This differs fromx % m, which might be negative.For example:
mod(7, 4) == 3 mod(-7, 4) == 1 mod(-1, 4) == 3 mod(-8, 4) == 0 mod(8, 4) == 0- Throws:
java.lang.ArithmeticException- ifm <= 0- See Also:
- Remainder Operator
-
mod
public static long mod(long x, long m)Returnsx mod m, a non-negative value less thanm. This differs fromx % m, which might be negative.For example:
mod(7, 4) == 3 mod(-7, 4) == 1 mod(-1, 4) == 3 mod(-8, 4) == 0 mod(8, 4) == 0- Throws:
java.lang.ArithmeticException- ifm <= 0- See Also:
- Remainder Operator
-
gcd
public static long gcd(long a, long b)Returns the greatest common divisor ofa, b. Returns0ifa == 0 && b == 0.- Throws:
java.lang.IllegalArgumentException- ifa < 0orb < 0
-
checkedAdd
public static long checkedAdd(long a, long b)Returns the sum ofaandb, provided it does not overflow.- Throws:
java.lang.ArithmeticException- ifa + boverflows in signedlongarithmetic
-
checkedSubtract
public static long checkedSubtract(long a, long b)Returns the difference ofaandb, provided it does not overflow.- Throws:
java.lang.ArithmeticException- ifa - boverflows in signedlongarithmetic
-
checkedMultiply
public static long checkedMultiply(long a, long b)Returns the product ofaandb, provided it does not overflow.- Throws:
java.lang.ArithmeticException- ifa * boverflows in signedlongarithmetic
-
checkedPow
public static long checkedPow(long b, int k)Returns thebto thekth power, provided it does not overflow.- Throws:
java.lang.ArithmeticException- ifbto thekth power overflows in signedlongarithmetic
-
saturatedAdd
public static long saturatedAdd(long a, long b)Returns the sum ofaandbunless it would overflow or underflow in which caseLong.MAX_VALUEorLong.MIN_VALUEis returned, respectively.- Since:
- 20.0
-
saturatedSubtract
public static long saturatedSubtract(long a, long b)Returns the difference ofaandbunless it would overflow or underflow in which caseLong.MAX_VALUEorLong.MIN_VALUEis returned, respectively.- Since:
- 20.0
-
saturatedMultiply
public static long saturatedMultiply(long a, long b)Returns the product ofaandbunless it would overflow or underflow in which caseLong.MAX_VALUEorLong.MIN_VALUEis returned, respectively.- Since:
- 20.0
-
saturatedPow
public static long saturatedPow(long b, int k)Returns thebto thekth power, unless it would overflow or underflow in which caseLong.MAX_VALUEorLong.MIN_VALUEis returned, respectively.- Since:
- 20.0
-
factorial
public static long factorial(int n)
Returnsn!, that is, the product of the firstnpositive integers,1ifn == 0, orLong.MAX_VALUEif the result does not fit in along.- Throws:
java.lang.IllegalArgumentException- ifn < 0
-
binomial
public static long binomial(int n, int k)Returnsnchoosek, also known as the binomial coefficient ofnandk, orLong.MAX_VALUEif the result does not fit in along.- Throws:
java.lang.IllegalArgumentException- ifn < 0,k < 0, ork > n
-
multiplyFraction
static long multiplyFraction(long x, long numerator, long denominator)Returns (x * numerator / denominator), which is assumed to come out to an integral value.
-
fitsInInt
static boolean fitsInInt(long x)
-
mean
public static long mean(long x, long y)Returns the arithmetic mean ofxandy, rounded toward negative infinity. This method is resilient to overflow.- Since:
- 14.0
-
isPrime
public static boolean isPrime(long n)
Returnstrueifnis a prime number: an integer greater than one that cannot be factored into a product of smaller positive integers. Returnsfalseifnis zero, one, or a composite number (one which can be factored into smaller positive integers).To test larger numbers, use
BigInteger.isProbablePrime(int).- Throws:
java.lang.IllegalArgumentException- ifnis negative- Since:
- 20.0
-
roundToDouble
public static double roundToDouble(long x, java.math.RoundingMode mode)Returnsx, rounded to adoublewith the specified rounding mode. Ifxis precisely representable as adouble, itsdoublevalue will be returned; otherwise, the rounding will choose between the two nearest representable values withmode.For the case of
RoundingMode.HALF_EVEN, this implementation uses the IEEE 754 default rounding mode: if the two nearest representable values are equally near, the one with the least significant bit zero is chosen. (In such cases, both of the nearest representable values are even integers; this method returns the one that is a multiple of a greater power of two.)- Throws:
java.lang.ArithmeticException- ifmodeisRoundingMode.UNNECESSARYandxis not precisely representable as adouble- Since:
- 30.0
-
-