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

        Algebraic r = Symbolic.ONE;

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

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

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

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

        var qs = x + new Complex(0.5);

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

        qs = x * new Complex(4);

        if (((Symbolic)qs).IsInteger())
        {
            Algebraic sq2 = FunctionVariable.Create("sqrt", new Complex(0.5));
            switch (((Symbolic)qs).ToInt() % 8)
            {
            case 1:
                return((Symbolic.ONE + Symbolic.IONE) / Symbolic.SQRT2);

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

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

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

        qs = x * new Complex(6);

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

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

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

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

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

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

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

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