public FactoredRational(Rational rational, IPrimeFactorizer factorizer) { if (rational.numerator == 0 || rational.denominator == 0) { this.numerator = rational.numerator; this.denominator = rational.denominator; this.primeFactors = PoweredPrime.None; } else { // // Take the absolute value of the rational // PoweredPrime[] denominatorFactors = factorizer.PrimeFactorize(rational.denominator); if (denominatorFactors == null) { throw factorizer.UnableToFactorize(rational.denominator); } UInt32 numeratorAbsoluteValue = (UInt32)((rational.numerator >= 0) ? rational.numerator : -rational.numerator); this.primeFactors = factorizer.Divide(numeratorAbsoluteValue, denominatorFactors); if (this.primeFactors == null) { throw factorizer.UnableToDivide(numeratorAbsoluteValue, denominatorFactors); } // Get new numerator and denominator this.numerator = 1; this.denominator = 1; for (int i = 0; i < this.primeFactors.Length; i++) { PoweredPrime factor = this.primeFactors[i]; if (factor.power > 0) { numerator *= (Int32)factor.value; // I don't need to check overflow here because these factors came from an Int32 } else { denominator *= factor.value; // I don't need to check overflow here because these factors came from a UInt32 } } if (rational.numerator < 0) { numerator = -numerator; } } }
public PoweredPrime[] Divide(UInt32 value, PoweredPrime[] denominatorFactors) { return(underlyingFactorizer.Divide(value, denominatorFactors)); }