예제 #1
0
 public static Fraction CalculateMeasureRate(Fraction bpm)
 {
     Fraction result = new Fraction();
     result.Numerator = 240 * bpm.Denominator;
     result.Denominator = bpm.Numerator;
     return Fraction.Reduce(result);
 }
예제 #2
0
 public static Fraction Shrink(Fraction f)
 {
     checked
     {
         while ((f.Numerator > maxVal) || (f.Numerator < minVal) || (f.Denominator > maxVal) || (f.Denominator < minVal))
         {
             f.Numerator /= 2;
             f.Denominator /= 2;
         }
         return f;
     }
 }
예제 #3
0
        public static Fraction operator *(Fraction a, Fraction b)
        {
            checked
            {
                Fraction result = new Fraction();

                a = Shrink(a);
                b = Shrink(b);
                result.Numerator = (a.Numerator * b.Numerator);
                result.Denominator = (a.Denominator * b.Denominator);

                return Reduce(result);
            }
        }
예제 #4
0
 public static Fraction Rationalize(double input)
 {
     checked
     {
         Fraction result = new Fraction();
         result.Denominator = 1;
         while (input != Math.Round(input))
         {
             input *= 10;
             result.Denominator *= 10;
         }
         result.Numerator = (long)input;
         return Reduce(result);
     }
 }
예제 #5
0
        public static Fraction Reduce(Fraction input)
        {
            checked
            {
                long[] Primes = Util.Primes;
                int PrimeCount = Util.PrimeCount;
                bool finished = false;

                if (input.Numerator == 0)
                {
                    input.Denominator = 1;
                    return input;
                }

                while (!finished)
                {
                    finished = true;
                    for (int i = 0; i < PrimeCount; i++)
                    {
                        long thisPrime = Primes[i];

                        if (thisPrime > input.Denominator)
                            break;

                        if ((input.Denominator % thisPrime == 0) && (input.Numerator % thisPrime == 0))
                        {
                            input.Denominator /= thisPrime;
                            input.Numerator /= thisPrime;
                            //finished = false; break;
                            i--;
                        }
                    }
                }
                return input;
            }
        }
예제 #6
0
 public static Fraction Quantize(Fraction f, long val)
 {
     checked
     {
         return new Fraction((f.Numerator * val) / f.Denominator, val);
     }
 }
예제 #7
0
 public static Fraction Compound(Fraction f, long val)
 {
     checked
     {
         return new Fraction(f.Numerator * val, f.Denominator * val);
     }
 }
예제 #8
0
        public static void Commonize(Fraction a, Fraction b, out Fraction outputA, out Fraction outputB)
        {
            checked
            {
                long[] Primes = Util.Primes;
                int PrimeCount = Util.PrimeCount;

                a = Shrink(a);
                b = Shrink(b);

                long newNumeratorA = a.Numerator * b.Denominator;
                long newDenominator = a.Denominator * b.Denominator;
                long newNumeratorB = b.Numerator * a.Denominator;
                bool finished = false;

                if (a.Denominator != b.Denominator)
                {
                    while (!finished)
                    {
                        finished = true;
                        for (int i = 0; i < PrimeCount; i++)
                        {
                            long thisPrime = Primes[i];

                            if (thisPrime > newDenominator)
                                break;

                            if ((newDenominator % thisPrime == 0) && (newNumeratorA % thisPrime == 0) && (newNumeratorB % thisPrime == 0))
                            {
                                newDenominator /= thisPrime;
                                newNumeratorA /= thisPrime;
                                newNumeratorB /= thisPrime;
                                //finished = false; break;
                                i--;
                            }
                        }
                    }
                    outputA = new Fraction(newNumeratorA, newDenominator);
                    outputB = new Fraction(newNumeratorB, newDenominator);
                }
                else
                {
                    outputA = a;
                    outputB = b;
                }
            }
        }
예제 #9
0
        public static long CommonDenominator(Fraction[] fractions)
        {
            int count = fractions.Length;
            long result = 1;

            for (int i = 0; i < count; i++)
            {
                Fraction frac = Fraction.Reduce(fractions[i]);
                if (frac.denominator != 0)
                {
                    if (result % frac.denominator != 0)
                    {
                        result *= frac.denominator;
                    }
                }
            }

            return result;
        }
예제 #10
0
        public static Fraction operator -(Fraction a, Fraction b)
        {
            checked
            {
                Fraction result = new Fraction();
                Fraction commonA;
                Fraction commonB;

                Commonize(a, b, out commonA, out commonB);
                a = Shrink(a);
                b = Shrink(b);
                result.Numerator = (commonA.Numerator - commonB.Numerator);
                result.Denominator = commonA.Denominator;

                return Reduce(result);
            }
        }