Skip to content

Commit

Permalink
#7430 implemented multiFactorial
Browse files Browse the repository at this point in the history
  • Loading branch information
YujingZHG committed Oct 15, 2024
1 parent 99f97f6 commit 2fd39d6
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 2 deletions.
26 changes: 25 additions & 1 deletion guava/src/com/google/common/math/BigIntegerMath.java
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,30 @@ public static BigInteger binomial(int n, int k) {
static boolean fitsInLong(BigInteger x) {
return x.bitLength() <= Long.SIZE - 1;
}

/**
* Returns multifactorial of n with step size BigInteger k.
* This is used for large values of n.
*
* @param n the number to compute the multifactorial of. Must be non-negative.
* @param k the step size. Must be positive.
* @return the multifactorial of n with step size k. If none-zero n is less than k then return n, else return one.
* @throws IllegalArgumentException if n is negative or if k is less than 1.
*/
public static BigInteger multiFactorial(int n, int k) {

This comment has been minimized.

Copy link
@Mirrious

Mirrious Oct 26, 2024

This is a good practice, ensuring that invalid input is handled early.

if (n < 0) {
throw new IllegalArgumentException("n cannot be negative!");
}
if (k < 1) {
throw new IllegalArgumentException("k must be positive!");
}
if (n <= k) {

This comment has been minimized.

Copy link
@Mirrious

Mirrious Oct 26, 2024

The edge cases are handled well here, ensuring that scenarios where the step size k is larger than or equal to n return meaningful values

return n == 0 ? BigInteger.ONE : BigInteger.valueOf(n);
}
BigInteger result = BigInteger.valueOf(n);

This comment has been minimized.

Copy link
@Mirrious

Mirrious Oct 26, 2024

The loop logic correctly handles the multifactorial computation, and using BigInteger ensures that the method can handle large numbers without overflow.

for (int i = n - k; i > 1; i -= k) {
result = result.multiply(BigInteger.valueOf(i));
}
return result;
}
private BigIntegerMath() {}
}
24 changes: 24 additions & 0 deletions guava/src/com/google/common/math/IntMath.java
Original file line number Diff line number Diff line change
Expand Up @@ -721,6 +721,30 @@ public static int mean(int x, int y) {
public static boolean isPrime(int n) {
return LongMath.isPrime(n);
}
/**
* Returns multifactorial of Int n with step size k.
*
* @param n the number to compute. Must be non-negative.
* @param k the step size for the multifactorial. Must be positive.
* @return the multifactorial of n with step size k. If none-zero n is less than k then return n, else return 1.
* @throws IllegalArgumentException if n is negative or if k is less than 1.
*/
public static int multiFactorial(int n, int k) {
if (n < 0) {
throw new IllegalArgumentException("n cannot be negative!");

This comment has been minimized.

Copy link
@Mirrious

Mirrious Oct 26, 2024

The parameter checks in the multiFactorial method are well-implemented. Consider enhancing the exception messages to include the parameter names, e.g., "Parameter 'n' cannot be negative!" and "Parameter 'k' must be positive!"

}
if (k < 1) {
throw new IllegalArgumentException("k must be positive!");
}
if (n <= k) {
return n == 0 ? 1 : n;
}
int result = n;
for (int i = n - k; i > 1; i -= k) {
result *= i;
}
return result;
}

private IntMath() {}
}
25 changes: 24 additions & 1 deletion guava/src/com/google/common/math/LongMath.java
Original file line number Diff line number Diff line change
Expand Up @@ -1345,6 +1345,29 @@ public static double roundToDouble(long x, RoundingMode mode) {
}
throw new AssertionError("impossible");
}

/**
* Returns multifactorial of int n with step size k.
*
* @param n the number to compute. Must be non-negative.
* @param k the step size must be positive.
* @return the long type multifactorial of n with step size k. If none-zero n is less than k then return (long) n, else return 1L.
* @throws IllegalArgumentException if n is negative or if k is less than 1.
*/
public static long multiFactorial(int n, int k) {
if (n < 0) {
throw new IllegalArgumentException("n cannot be negative!");
}
if (k < 1) {
throw new IllegalArgumentException("k must be positive!");
}
if (n <= k) {
return n == 0 ? 1L : (long)n;
}
long result = n;
for (long i = n - k; i > 1; i -= k) {
result *= i;
}
return result;
}
private LongMath() {}
}

0 comments on commit 2fd39d6

Please sign in to comment.