Esempio n. 1
0
        public void LeastCommonMultiple_Long(long x, long y, long lcm)
        {
            long actual = EuclideanAlgorithm.LeastCommonMultiple(x, y);

            Assert.Equal(lcm, actual);
        }
Esempio n. 2
0
        public void LeastCommonMultiple_Int(int x, int y, int lcm)
        {
            int actual = EuclideanAlgorithm.LeastCommonMultiple(x, y);

            Assert.Equal(lcm, actual);
        }
Esempio n. 3
0
        public void GreatestCommonDivisor_Int(int x, int y, int gcd)
        {
            int actual = EuclideanAlgorithm.GreatestCommonDivisor(x, y);

            Assert.Equal(gcd, actual);
        }
Esempio n. 4
0
        public void GreatestCommonDivisor_Long(long x, long y, long gcd)
        {
            long actual = EuclideanAlgorithm.GreatestCommonDivisor(x, y);

            Assert.Equal(gcd, actual);
        }
        public static Rational64 Multiply(Rational64 first, Rational64 second)
        {
            unchecked {
                var first_numerator    = (UInt32)first.bits;
                var first_denominator  = (Int32)(first.bits >> 32);
                var second_numerator   = (UInt32)second.bits;
                var second_denominator = (Int32)(second.bits >> 32);
                if (0 == first_numerator || 0 == second_numerator)
                {
                    return(Zero);
                }
                var s = 0 > (first_denominator ^ second_denominator);
                if (0 <= first_denominator)
                {
                    ++first_denominator;
                }
                else
                {
                    first_denominator = -first_denominator;
                }
                if (0 <= second_denominator)
                {
                    ++second_denominator;
                }
                else
                {
                    second_denominator = -second_denominator;
                }
                {
                    var d = EuclideanAlgorithm.GreatestCommonDivisorPartial((UInt32)first_denominator, second_numerator);
                    first_denominator = (Int32)((UInt32)first_denominator / d);
                    second_numerator /= d;
                }
                {
                    var d = EuclideanAlgorithm.GreatestCommonDivisorPartial(first_numerator, (UInt32)second_denominator);
                    first_numerator   /= d;
                    second_denominator = (Int32)((UInt32)second_denominator / d);
                }

                /*
                 * var q = (Int64)((UInt64)(UInt32)first_denominator * (UInt32)second_denominator);
                 * if (s) {
                 *  q = -q;
                 * } else {
                 *  --q;
                 * }
                 * checked((Int32)q).Ignore();
                 * return new Rational64(checked(first_numerator * second_numerator) | (UInt64)q << 32);
                 */
                var p = (UInt64)first_numerator * second_numerator;
                var q = (Int64)((UInt64)(UInt32)first_denominator * (UInt32)second_denominator);
                p = checked ((UInt32)p);
                checked (unchecked ((UInt32)Int32.MinValue) - unchecked ((UInt64)q)).Ignore();
                if (s)
                {
                    return(new Rational64((UInt64)(-q << 32) | p));
                }
                else
                {
                    return(new Rational64((UInt64)(--q << 32) | p));
                }
            }
        }