Program: 57478
Project: 57478
Buggy source:
/** 
 * Returns an exact representation of the <a href="http://mathworld.wolfram.com/BinomialCoefficient.html"> Binomial Coefficient</a>, "<code>n choose k</code>", the number of <code>k</code>-element subsets that can be selected from an <code>n</code>-element set. <p> <Strong>Preconditions</strong>: <ul> <li> <code>0 <= k <= n </code> (otherwise <code>IllegalArgumentException</code> is thrown)</li> <li> The result is small enough to fit into a <code>long</code>. The largest value of <code>n</code> for which all coefficients are <code> < Long.MAX_VALUE</code> is 66. If the computed value exceeds <code>Long.MAX_VALUE</code> an <code>ArithMeticException</code> is thrown.</li> </ul></p>
 * @param n the size of the set
 * @param k the size of the subsets to be counted
 * @return <code>n choose k</code>
 * @throws IllegalArgumentException if preconditions are not met.
 * @throws ArithmeticException if the result is too large to be representedby a long integer.
 */
public static long binomialCoefficient(final int n,final int k){
  if (n < k) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (n < 0) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if ((n == k) || (k == 0)) {
    return 1;
  }
  if ((k == 1) || (k == n - 1)) {
    return n;
  }
  long result=Math.round(binomialCoefficientDouble(n,k));
  if (result == Long.MAX_VALUE) {
    throw new ArithmeticException("String_Node_Str");
  }
  return result;
}

Fixed version (ground truth):
/** 
 * Returns an exact representation of the <a href="http://mathworld.wolfram.com/BinomialCoefficient.html"> Binomial Coefficient</a>, "<code>n choose k</code>", the number of <code>k</code>-element subsets that can be selected from an <code>n</code>-element set. <p> <Strong>Preconditions</strong>: <ul> <li> <code>0 <= k <= n </code> (otherwise <code>IllegalArgumentException</code> is thrown)</li> <li> The result is small enough to fit into a <code>long</code>. The largest value of <code>n</code> for which all coefficients are <code> < Long.MAX_VALUE</code> is 66. If the computed value exceeds <code>Long.MAX_VALUE</code> an <code>ArithMeticException</code> is thrown.</li> </ul></p>
 * @param n the size of the set
 * @param k the size of the subsets to be counted
 * @return <code>n choose k</code>
 * @throws IllegalArgumentException if preconditions are not met.
 * @throws ArithmeticException if the result is too large to be representedby a long integer.
 */
public static long binomialCoefficient(final int n,final int k){
  if (n < k) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (n < 0) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if ((n == k) || (k == 0)) {
    return 1;
  }
  if ((k == 1) || (k == n - 1)) {
    return n;
  }
  if (k > n / 2)   return binomialCoefficient(n,n - k);
  long result=1;
  if (n <= 61) {
    for (int j=1, i=n - k + 1; j <= k; i++, j++) {
      result=result * i / j;
    }
  }
 else   if (n <= 66) {
    for (int j=1, i=n - k + 1; j <= k; i++, j++) {
      long d=gcd(i,j);
      result=(result / (j / d)) * (i / d);
    }
  }
 else {
    for (int j=1, i=n - k + 1; j <= k; i++, j++) {
      long d=gcd(i,j);
      result=mulAndCheck((result / (j / d)),(i / d));
    }
  }
  return result;
}