コード例 #1
0
        private static T GetGCD <T>(IValueHelper <T> valueHelper, T d1, params T[] denominators)
            where T : struct, IComparable, IFormattable, IConvertible, IComparable <T>, IEquatable <T>
        {
            if (denominators == null || denominators.Length == 0)
            {
                return(d1);
            }
            T gcd = valueHelper.Abs(d1);

            foreach (T d in denominators)
            {
                T b;
                if (d.CompareTo(gcd) > 0)
                {
                    b   = gcd;
                    gcd = valueHelper.Abs(d);
                }
                else
                {
                    b = valueHelper.Abs(d);
                }
                while (b.CompareTo(valueHelper.Zero) > 0)
                {
                    T rem = valueHelper.Modulus(gcd, b);
                    gcd = b;
                    b   = rem;
                }
            }

            return(gcd);
        }
コード例 #2
0
        private static T GetLCM <T>(IValueHelper <T> valueHelper, T d1, T d2, out T secondMultiplier)
            where T : struct, IComparable, IFormattable, IConvertible, IComparable <T>, IEquatable <T>
        {
            T zero = default(T);

            if (d1.CompareTo(zero) < 0)
            {
                return(GetLCM <T>(valueHelper, valueHelper.Abs(d1), d2, out secondMultiplier));
            }

            if (d2.CompareTo(zero) < 0)
            {
                return(GetLCM <T>(valueHelper, d1, valueHelper.Abs(d2), out secondMultiplier));
            }

            if (d1.Equals(d2))
            {
                secondMultiplier = valueHelper.PositiveOne;
                return(secondMultiplier);
            }

            if (d1.CompareTo(d2) < 0)
            {
                secondMultiplier = GetLCM <T>(valueHelper, d2, d1, out d1);
                return(d1);
            }

            secondMultiplier = d1;

            while (!valueHelper.Modulus(secondMultiplier, d2).Equals(zero))
            {
                secondMultiplier = valueHelper.Add(secondMultiplier, d1);
            }

            return(GetSimplifiedRational <T>(valueHelper, valueHelper.Divide(secondMultiplier, d1), secondMultiplier, out secondMultiplier));
        }