Example #1
0
        internal override Symbol PreEval(Symbol x)
        {
            if (!x.IsInteger() || x.Smaller(Symbol.ZERO))
            {
                throw new SymbolicException("Argument to factorial must be a positive integer, is " + x);
            }

            Algebraic r = Symbol.ONE;

            while (Symbol.ONE.Smaller(x))
            {
                r = r * x;
                x = ( Symbol )(x - Symbol.ONE);
            }

            return(( Symbol )r);
        }
Example #2
0
        internal virtual Algebraic fzexakt(Symbol x)
        {
            if (x < Symbol.ZERO)
            {
                var r = fzexakt(( Symbol )(-x));

                if (r != null)
                {
                    return(r.Conj());
                }

                return(r);
            }

            if (x.IsInteger())
            {
                if (x.ToInt() % 2 == 0)
                {
                    return(Symbol.ONE);
                }
                else
                {
                    return(Symbol.MINUS);
                }
            }

            var qs = x + new Complex(0.5);

            if ((( Symbol )qs).IsInteger())
            {
                if ((( Symbol )qs).ToInt() % 2 == 0)
                {
                    return(Symbol.IMINUS);
                }
                else
                {
                    return(Symbol.IONE);
                }
            }

            qs = x * new Complex(4);

            if ((( Symbol )qs).IsInteger())
            {
                var sq2 = FunctionVariable.Create("sqrt", new Complex(0.5));

                switch ((( Symbol )qs).ToInt() % 8)
                {
                case 1: return((Symbol.ONE + Symbol.IONE) / Symbol.SQRT2);

                case 3: return((Symbol.MINUS + Symbol.IONE) / Symbol.SQRT2);

                case 5: return((Symbol.MINUS + Symbol.IMINUS) / Symbol.SQRT2);

                case 7: return((Symbol.ONE + Symbol.IMINUS) / Symbol.SQRT2);
                }
            }

            qs = x * new Complex(6);

            if ((( Symbol )qs).IsInteger())
            {
                switch ((( Symbol )qs).ToInt() % 12)
                {
                case 1: return((Symbol.SQRT3 + Symbol.IONE) / Symbol.TWO);

                case 2: return((Symbol.ONE + Symbol.SQRT3) * Symbol.IONE / Symbol.TWO);

                case 4: return((Symbol.SQRT3 * Symbol.IONE + Symbol.MINUS) / Symbol.TWO);

                case 5: return((Symbol.IONE - Symbol.SQRT3) / Symbol.TWO);

                case 7: return((Symbol.IMINUS - Symbol.SQRT3) / Symbol.TWO);

                case 8: return((Symbol.SQRT3 * Symbol.IMINUS - Symbol.ONE) / Symbol.TWO);

                case 10: return((Symbol.SQRT3 * Symbol.IMINUS + Symbol.ONE) / Symbol.TWO);

                case 11: return((Symbol.IMINUS + Symbol.SQRT3) / Symbol.TWO);
                }
            }

            return(null);
        }