/// <summary> /// Finds the greatest common divisor and reduces the fraction by this amount. /// </summary> /// <returns>the reduced rational</returns> private static void Reduce(ref T numerator, ref T denominator) { bool reduced = false; decimal n = Convert.ToDecimal(numerator); decimal d = Convert.ToDecimal(denominator); // greatest common divisor decimal gcd = Rational<T>.GCD(n, d); if (gcd != Decimal.One && gcd != Decimal.Zero) { reduced = true; n /= gcd; d /= gcd; } // cancel out signs if (d < Decimal.Zero) { reduced = true; n = -n; d = -d; } if (reduced) { numerator = (T)Convert.ChangeType(n, typeof(T)); denominator = (T)Convert.ChangeType(d, typeof(T)); } }
/// <summary> /// Lowest Common Denominator /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> private static decimal LCD(decimal a, decimal b) { if (a == Decimal.Zero && b == Decimal.Zero) { return Decimal.Zero; } return (a * b) / Rational<T>.GCD(a, b); }