Пример #1
0
        public static bool O3(List<MathObject> uElts, List<MathObject> vElts)
        {
            if (uElts.IsEmpty()) return true;
            if (vElts.IsEmpty()) return false;

            var u = uElts.First();
            var v = vElts.First();

            return (!(u == v)) ?
                Compare(u, v) :
                O3(uElts.Cdr(), vElts.Cdr());
        }
Пример #2
0
        public static bool equal(List<MathObject> a, List<MathObject> b)
        {
            if (a.Count == 0 && b.Count == 0) return true;

            if (a.Count == 0) return false;

            if (b.Count == 0) return false;

            if (a[0] == b[0]) return equal(a.Cdr(), b.Cdr());

            return false;
        }
Пример #3
0
        //////////////////////////////////////////////////////////////////////
        static List<MathObject> MergeSums(List<MathObject> pElts, List<MathObject> qElts)
        {
            if (pElts.Count == 0) return qElts;
            if (qElts.Count == 0) return pElts;

            var p = pElts[0];
            var ps = pElts.Cdr();

            var q = qElts[0];
            var qs = qElts.Cdr();

            var res = RecursiveSimplify(new List<MathObject>() { p, q });

            if (res.Count == 0) return MergeSums(ps, qs);

            if (res.Count == 1) return MergeSums(ps, qs).Cons(res[0]);

            if (ListUtils.equal(res, new List<MathObject>() { p, q }))
                return MergeSums(ps, qElts).Cons(p);

            if (ListUtils.equal(res, new List<MathObject>() { q, p }))
                return MergeSums(pElts, qs).Cons(q);

            throw new Exception();
        }
Пример #4
0
        static List<MathObject> RecursiveSimplify(List<MathObject> elts)
        {
            if (elts.Count == 2)
            {
                if (elts[0] is Sum && elts[1] is Sum)
                    return MergeSums(
                        ((Sum)elts[0]).elts,
                        ((Sum)elts[1]).elts);

                if (elts[0] is Sum)
                    return MergeSums(
                        ((Sum)elts[0]).elts,
                        new List<MathObject>() { elts[1] });

                if (elts[1] is Sum)
                    return MergeSums(
                        new List<MathObject>() { elts[0] },
                        ((Sum)elts[1]).elts);

                //////////////////////////////////////////////////////////////////////

                if (elts[0] is DoubleFloat && elts[1] is Number)
                    return SimplifyDoubleNumberSum((DoubleFloat)elts[0], (Number)elts[1]);

                if (elts[0] is Number && elts[1] is DoubleFloat)
                    return SimplifyDoubleNumberSum((DoubleFloat)elts[1], (Number)elts[0]);

                //////////////////////////////////////////////////////////////////////

                if ((elts[0] is Integer || elts[0] is Fraction)
                    &&
                    (elts[1] is Integer || elts[1] is Fraction))
                {
                    var P =
                        Rational.SimplifyRNE(new Sum(elts[0], elts[1]));

                    if (P is Integer && ((Integer)P).val == 0)
                        return new List<MathObject>() { };

                    return new List<MathObject>() { P };
                }

                if (elts[0] is Integer && elts[1] is Integer)
                {
                    var res = ((Integer)elts[0]).val + ((Integer)elts[1]).val;

                    return res == 0 ?
                        new List<MathObject>() :
                        new List<MathObject>() { new Integer(res) };
                }

                if (elts[0] is Integer && ((Integer)elts[0]).val == 0)
                    return new List<MathObject>() { elts[1] };

                if (elts[1] is Integer && ((Integer)elts[1]).val == 0)
                    return new List<MathObject>() { elts[0] };

                var p = elts[0];
                var q = elts[1];

                if (OrderRelation.Term(p) == OrderRelation.Term(q))
                {
                    var res =
                        new Product(
                            OrderRelation.Term(p),
                            new Sum(
                                OrderRelation.Const(p),
                                OrderRelation.Const(q)).Simplify()
                            ).Simplify();

                    if (res is Integer && ((Integer)res).val == 0)
                        return new List<MathObject>() { };
                    else
                        return new List<MathObject>() { res };
                }

                if (OrderRelation.Compare(q, p))
                    return new List<MathObject>() { q, p };

                return new List<MathObject>() { p, q };
            }

            if (elts[0] is Sum)
                return
                    MergeSums(
                        ((Sum)elts[0]).elts, RecursiveSimplify(elts.Cdr()));

            return MergeSums(
                new List<MathObject>() { elts[0] }, RecursiveSimplify(elts.Cdr()));
        }
Пример #5
0
        public static List<MathObject> RecursiveSimplify(List<MathObject> elts)
        {
            if (elts.Count == 2)
            {
                if (elts[0] is Product && elts[1] is Product)
                    return MergeProducts(
                        ((Product)elts[0]).elts,
                        ((Product)elts[1]).elts);

                if (elts[0] is Product)
                    return MergeProducts(
                        ((Product)elts[0]).elts,
                        new List<MathObject>() { elts[1] });

                if (elts[1] is Product)
                    return MergeProducts(
                        new List<MathObject>() { elts[0] },
                        ((Product)elts[1]).elts);

                //////////////////////////////////////////////////////////////////////

                if (elts[0] is DoubleFloat && elts[1] is Number)
                    return SimplifyDoubleNumberProduct((DoubleFloat)elts[0], (Number)elts[1]);

                if (elts[0] is Number && elts[1] is DoubleFloat)
                    return SimplifyDoubleNumberProduct((DoubleFloat)elts[1], (Number)elts[0]);

                //////////////////////////////////////////////////////////////////////

                if ((elts[0] is Integer || elts[0] is Fraction)
                    &&
                    (elts[1] is Integer || elts[1] is Fraction))
                {
                    var P =
                        Rational.SimplifyRNE(new Product(elts[0], elts[1]));

                    if (P is Integer && ((Integer)P).val == 1)
                        return new List<MathObject>() { };

                    return new List<MathObject>() { P };
                }

                if (elts[0] == new Integer(1))
                    return new List<MathObject>() { elts[1] };

                if (elts[1] == new Integer(1))
                    return new List<MathObject>() { elts[0] };

                var p = elts[0];
                var q = elts[1];

                if (OrderRelation.Base(p) == OrderRelation.Base(q))
                {
                    var res = OrderRelation.Base(p) ^ (OrderRelation.Exponent(p) + OrderRelation.Exponent(q));

                    if (res is Integer && ((Integer)res).val == 1)
                        return new List<MathObject>() { };
                    else
                        return new List<MathObject>() { res };
                }

                if (OrderRelation.Compare(q, p))
                    return new List<MathObject>() { q, p };

                return new List<MathObject>() { p, q };
            }

            if (elts[0] is Product)
                return
                    MergeProducts(
                        ((Product)elts[0]).elts,
                        RecursiveSimplify(elts.Cdr()));

            return MergeProducts(
                new List<MathObject>() { elts[0] },
                RecursiveSimplify(elts.Cdr()));

            throw new Exception();
        }