コード例 #1
0
        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;
                }
            }
        }
コード例 #2
0
 public PoweredPrime[] Divide(UInt32 value, PoweredPrime[] denominatorFactors)
 {
     return(underlyingFactorizer.Divide(value, denominatorFactors));
 }