You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I tried to calculate a number of possible Stirling permutations, which is defined as $n!!$, where n >= 0.
Initially I thought about creating an issue related to implement in Guava a method called doubleFactorial(n), however since doubleFactorial is a special case of multifactorial, I thought whether it wouldn't be more beneficial to just implement a generalization of the mentioned concept.
Multifactorial is defined as:
multifactorial(n, k) =
n * multifactorial(n - k, k), if $n \gt k$
n, if $1 \le n \le k$
multifactorial(n+k, k) / (n + k), if $n \le 0$ and $n$ is not a negative multiple of $k$
Examples:
multifactorial(n, 1) produces exactly the same as n!
multifactorial(n, 2) is the same as double factorial, so n(n-2)(n-4)...
multifactorial(n, 3) means n(n-3)(n-6)...
2. What's the best code you can write to accomplish that without the new feature?
I had to implement double factorial by hand, such like:
int doubleFactorial(int n) {
if (n == 0 || n == 1) {
return 1;
}
int res = n;
for (int i=n-2; i>1; i-=2) {
res *= i;
}
return res;
}
For multifactorial, the code is very similar. Value 2 is parametrized (for example as k), and the condition becomes:
for (int i=n-k; i>(k-1); i-=k) {
....
}
3. What would that same code look like if we added your feature?
Instead of creating double factorial (or multifactorial as a general concept), we could simply type:
int result = IntMath.multiFactorial(6, 2); // 6!!, which is 6*4*2=48
long result2 = LongMath.multiFactorial(6,3); // 6*3 = 18
BigInteger result3 = BigIntegerMath.multiFactorial(4, 1) // the same as 4! = 4*3*2*1 = 24
(Optional) What would the method signatures for your feature look like?
For com.google.common.math.IntMath:
public static int multiFactorial(int n, int k)
For com.google.common.math.LongMath:
public static long multiFactorial(int n, int k)
For com.google.common.math.BigIntegerMath:
public static java.math.BigInteger multiFactorial(int n, int k)
Concrete Use Cases
Remove need for creation of double factorial method “by hand”, which saves time in combinatorial computations. Requested feature (multifactorial) is a generalization of this concept, but the implementation is really similar to double factorial.
1. What are you trying to do?
I tried to calculate a number of possible Stirling permutations, which is defined as$n!!$ , where n >= 0.
Initially I thought about creating an issue related to implement in Guava a method called doubleFactorial(n), however since doubleFactorial is a special case of multifactorial, I thought whether it wouldn't be more beneficial to just implement a generalization of the mentioned concept.
Multifactorial is defined as:
multifactorial(n, k) =
Examples:
2. What's the best code you can write to accomplish that without the new feature?
I had to implement double factorial by hand, such like:
For multifactorial, the code is very similar. Value 2 is parametrized (for example as
k
), and the condition becomes:3. What would that same code look like if we added your feature?
Instead of creating double factorial (or multifactorial as a general concept), we could simply type:
(Optional) What would the method signatures for your feature look like?
For
com.google.common.math.IntMath
:For
com.google.common.math.LongMath
:For
com.google.common.math.BigIntegerMath
:Concrete Use Cases
Remove need for creation of double factorial method “by hand”, which saves time in combinatorial computations. Requested feature (multifactorial) is a generalization of this concept, but the implementation is really similar to double factorial.
Packages
com.google.common.math
Checklist
I agree to follow the code of conduct.
I have read and understood the contribution guidelines.
I have read and understood Guava's philosophy, and I strongly believe that this proposal aligns with it.
I have visited the idea graveyard, and did not see anything similar to this idea.
The text was updated successfully, but these errors were encountered: