Program: 73467
Project: 73467
Buggy source:
/** 
 * Multiplies this object with another Time object. The formula for multiplying two Times with fraction parts are described as follows: To find X * Y, where X = q1 + r1/b, and Y = q2 + r2/d, X * Y can be written as: q1*q2 + (r1*q2*d + r2*q1*b + r1*r2) / (b*d), where all variables in this equation are BigIntegers, and the result is a new Time object that retains the arbitrary precision. By default, r1 and r2 are initialized to be zero, while b and d are initialized to be one. These values are used if the fraction part of either this object or the other Time object is null. However if either of them are not null, then r1, r2, b, and d are overwritten. The final Time is calculated according to the above equation.
 * @param resolutionInverse The inverse of the resolution.
 * @param time The other Time object
 * @return A new Time object that is the multple of this Time andthe other Time object.
 */
private Time _multiply(BigInteger resolutionInverse,Time time){
  BigInteger d=BigInteger.ONE;
  BigInteger b=BigInteger.ONE;
  BigInteger r1=BigInteger.ZERO;
  BigInteger r2=BigInteger.ZERO;
  if (_divisorAndRemainder != null) {
    b=_divisorAndRemainder[0];
    r1=_divisorAndRemainder[1];
  }
  if (time._divisorAndRemainder != null) {
    d=time._divisorAndRemainder[0];
    r2=time._divisorAndRemainder[1];
  }
  BigInteger temp1=r1.multiply(time._timeValue).multiply(d).divide(resolutionInverse);
  BigInteger temp2=r2.multiply(_timeValue).multiply(b).divide(resolutionInverse);
  BigInteger temp3=r1.multiply(r2);
  BigInteger newDivisor=b.multiply(d);
  BigInteger temp4=temp1.add(temp2).add(temp3);
  BigInteger q_r[]=temp4.divideAndRemainder(newDivisor);
  return new Time(_director,_timeValue.multiply(time._timeValue).divide(resolutionInverse).add(q_r[0]),newDivisor,q_r[1]);
}

Fixed version (ground truth):
/** 
 * Multiplies this object with another Time object. The formula for multiplying two Times with fraction parts are described as follows: To find X * Y, where X = q1 + r1/b, and Y = q2 + r2/d, X * Y can be written as: q1*q2 + (r1*q2*d + r2*q1*b + r1*r2) / (b*d), where all variables in this equation are BigIntegers, and the result is a new Time object that retains the arbitrary precision. By default, r1 and r2 are initialized to be zero, while b and d are initialized to be one. These values are used if the fraction part of either this object or the other Time object is null. However if either of them are not null, then r1, r2, b, and d are overwritten. The final Time is calculated according to the above equation.
 * @param resolutionInverse The inverse of the resolution.
 * @param time The other Time object
 * @return A new Time object that is the multiple of this Time andthe other Time object.
 */
private Time _multiply(BigInteger resolutionInverse,Time time){
  BigInteger d=BigInteger.ONE;
  BigInteger b=BigInteger.ONE;
  BigInteger r1=BigInteger.ZERO;
  BigInteger r2=BigInteger.ZERO;
  if (_divisorAndRemainder != null) {
    b=_divisorAndRemainder[0];
    r1=_divisorAndRemainder[1];
  }
  if (time._divisorAndRemainder != null) {
    d=time._divisorAndRemainder[0];
    r2=time._divisorAndRemainder[1];
  }
  BigInteger temp1=r1.multiply(time._timeValue).multiply(d);
  BigInteger temp2=r2.multiply(_timeValue).multiply(b);
  BigInteger temp3=r1.multiply(r2);
  BigInteger newDivisor=b.multiply(d);
  BigInteger temp4=temp1.add(temp2).add(temp3);
  BigInteger q_r[]=temp4.divideAndRemainder(newDivisor);
  return new Time(_director,_timeValue.multiply(time._timeValue).add(q_r[0]).divide(resolutionInverse),newDivisor,q_r[1]);
}