示例#1
0
        private double abs(double real, double imag)
        {
            double temp;

            if (real < 0)
            {
                real = -real;
            }

            if (imag < 0)
            {
                imag = -imag;
            }

            if (imag > real)
            {
                temp = real;
                real = imag;
                imag = temp;
            }

            if ((real + imag) == real)
            {
                return(real);
            }

            temp = imag / real;
            temp = real * Math.Sqrt(1.0 + temp * temp);

            return(temp);
        }
示例#2
0
        internal virtual int cfs(double x)
        {
            if (x < 0)
            {
                return(cfs(-x));
            }

            int a0 = ( int )Math.floor(x);

            if (x == ( double )a0)
            {
                return(a0);
            }

            int a1 = ( int )Math.floor(1.0 / (x - a0));

            int z = a0 * a1 + 1;

            if (Math.abs(( double )z / ( double )a1 - x) < 1.0e-6)
            {
                return(z);
            }

            return(0);
        }
示例#3
0
        internal override Symbol PreEval(Symbol x)
        {
            Complex z = x.ToComplex();

            if (z.Im == 0.0)
            {
                return(new Complex(Math.tan(z.Re)));
            }
            return(( Symbol )evalx(trigrule, z));
        }
示例#4
0
        internal override Symbol PreEval(Symbol x)
        {
            var z = x.ToComplex();

            if (z.Re < 0 || z.Im != 0.0)
            {
                return(new Complex(Math.log(z.Re * z.Re + z.Im * z.Im) / 2, Math.atan2(z.Im, z.Re)));
            }

            return(new Complex(Math.log(z.Re)));
        }
示例#5
0
        internal override Symbol PreEval(Symbol x)
        {
            var z = x.ToComplex();

            var r = Math.exp(z.Re);

            if (z.Im != 0.0)
            {
                return(new Complex(r * Math.cos(z.Im), r * Math.sin(z.Im)));
            }

            return(new Complex(r));
        }
示例#6
0
        public override int Eval(Stack st)
        {
            int       narg = GetNarg(st);
            Algebraic x    = GetAlgebraic(st);

            if (x.IsScalar() && !x.IsConstant())
            {
                throw new SymbolicException("Unknown variable dimension: " + x);
            }
            Matrix m = new Matrix(x);

            st.Push(new Complex(( double )Math.max(m.Cols(), m.Rows())));
            return(0);
        }
示例#7
0
        internal static long kleinsterTeiler(long X, long start)
        {
            long stop = ( long )Math.ceil(Math.Sqrt(( double )X));

            if (start > stop)
            {
                return(X);
            }

            long b = start / 30L;

            b *= 30L;

            long m = start % 30L;

            int i = 0;

            while (m > mod[i])
            {
                i++;
            }

            while (start <= stop)
            {
                if (Session.Proc.CheckInterrupt())
                {
                    return(-1L);
                }

                if (X % start == 0)
                {
                    return(start);
                }

                i++;

                if (i >= mod.Length)
                {
                    i     = 0;
                    b    += 30L;
                    start = b;
                }

                start += moddif[i];
            }

            return(X);
        }
示例#8
0
        internal override Algebraic SymEval(Algebraic x, Algebraic y)
        {
            if (y is Complex && !y.IsComplex() && x is Complex && !x.IsComplex())
            {
                return(new Complex(Math.atan2((( Complex )y).Re, (( Complex )x).Re)));
            }

            if (Symbol.ZERO != x)
            {
                return(FunctionVariable.Create("atan", y / x) + FunctionVariable.Create("sign", y) * (Symbol.ONE - FunctionVariable.Create("sign", x)) * Symbol.PI / Symbol.TWO);
            }
            else
            {
                return((FunctionVariable.Create("sign", y) * Symbol.PI) / Symbol.TWO);
            }
        }
示例#9
0
        internal static void dft(double[] re, double[] im, double[] outRe, double[] outIm)
        {
            int N = re.Length;

            for (int k = 0; k < N; k++)
            {
                outRe[k] = outIm[k] = 0.0;

                for (int n = 0; n < N; n++)
                {
                    var ang = -2.0 * Math.PI * k * n / N;

                    var eim = Math.sin(ang);
                    var ere = Math.cos(ang);

                    outRe[k] += re[n] * ere - im[n] * eim;
                    outIm[k] += re[n] * eim + im[n] * ere;
                }
            }
        }
示例#10
0
        public override double Norm()
        {
            double r;

            if (Math.abs(Re) > Math.abs(Im))
            {
                r = Im / Re;
                r = Math.abs(Re) * Math.Sqrt(1 + r * r);
            }
            else if (Im != 0)
            {
                r = Re / Im;
                r = Math.abs(Im) * Math.Sqrt(1 + r * r);
            }
            else
            {
                r = 0.0;
            }

            return(r);
        }
示例#11
0
        public override int Eval(Stack st)
        {
            int narg = GetNarg(st);
            var x    = GetVector(st);

            x = ( Vector )(new ExpandConstants()).SymEval(x);

            var re = (( Vector )x.RealPart()).Double;
            var im = (( Vector )x.ImagPart()).Double;

            int n = re.Length;

            var power = Math.log(n) / Math.log(2.0);

            if (power != Math.round(power))
            {
                var outRe = new double[n];
                var outIm = new double[n];

                dft(re, im, outRe, outIm);

                re = outRe;
                im = outIm;
            }
            else
            {
                ifft_1d(re, im, -1);
            }

            var a = new Number[n];

            for (int i = 0; i < n; i++)
            {
                a[i] = new Number(re[i], im[i]);
            }

            st.Push(new Vector(a));

            return(0);
        }
示例#12
0
        internal override Algebraic SymEval(Algebraic x)
        {
            if (x is Rational)
            {
                var xr = ( Rational )x;

                if (xr.den.Var is FunctionVariable &&
                    (( FunctionVariable )xr.den.Var).Name.Equals("exp") &&
                    (( FunctionVariable )xr.den.Var).Var.IsComplex())
                {
                    var fv = ( FunctionVariable )xr.den.Var;

                    int maxdeg = Math.max(Poly.Degree(xr.nom, fv), Poly.Degree(xr.den, fv));

                    if (maxdeg % 2 == 0)
                    {
                        return(divExponential(xr.nom, fv, maxdeg / 2) / divExponential(xr.den, fv, maxdeg / 2));
                    }
                    else
                    {
                        var fv2 = new FunctionVariable("exp", (( FunctionVariable )xr.den.Var).Var / Symbol.TWO, (( FunctionVariable )xr.den.Var).Body);

                        Algebraic ex = new Polynomial(fv2, new Algebraic[] { Symbol.ZERO, Symbol.ZERO, Symbol.ONE });

                        var xr1 = xr.nom.Value(xr.den.Var, ex) / xr.den.Value(xr.den.Var, ex);

                        return(SymEval(xr1));
                    }
                }
            }

            if (x is Polynomial && (( Polynomial )x).Var is FunctionVariable)
            {
                var xp = ( Polynomial )x;

                Algebraic xf = null;

                var fvar = ( FunctionVariable )xp.Var;

                if (fvar.Name.Equals("exp"))
                {
                    var re = fvar.Var.RealPart();
                    var im = fvar.Var.ImagPart();

                    if (im != Symbol.ZERO)

                    {
                        bool _minus = minus(im);

                        if (_minus)
                        {
                            im = -im;
                        }

                        var a = FunctionVariable.Create("exp", re);
                        var b = FunctionVariable.Create("cos", im);
                        var c = FunctionVariable.Create("sin", im) * Symbol.IONE;

                        xf = a * (_minus ? b - c : b + c);
                    }
                }

                if (fvar.Name.Equals("log"))
                {
                    var arg = fvar.Var;

                    Algebraic factor = Symbol.ONE, sum = Symbol.ZERO;

                    if (arg is Polynomial &&
                        (( Polynomial )arg).Degree() == 1 &&
                        (( Polynomial )arg).Var is FunctionVariable &&
                        (( Polynomial )arg)[0].Equals(Symbol.ZERO) &&
                        (( FunctionVariable )(( Polynomial )arg).Var).Name.Equals("sqrt"))
                    {
                        sum = FunctionVariable.Create("log", (( Polynomial )arg)[1]);

                        factor = new Complex(0.5);

                        arg = (( FunctionVariable )(( Polynomial )arg).Var).Var;

                        xf = FunctionVariable.Create("log", arg);
                    }

                    try
                    {
                        var re = arg.RealPart();
                        var im = arg.ImagPart();

                        if (im != Symbol.ZERO)
                        {
                            bool min_im = minus(im);

                            if (min_im)
                            {
                                im = -im;
                            }

                            var a1 = new SqrtExpand().SymEval(arg * arg.Conj());

                            var a = FunctionVariable.Create("log", a1) / Symbol.TWO;

                            var b1 = SymEval(re / im);

                            var b = FunctionVariable.Create("atan", b1) * Symbol.IONE;

                            xf = min_im ? a + b : a - b;

                            var pi2 = Symbol.PI * Symbol.IONE / Symbol.TWO;

                            xf = min_im ? xf - pi2 : xf + pi2;
                        }
                    }
                    catch (SymbolicException)
                    {
                    }

                    if (xf != null)
                    {
                        xf = xf * factor + sum;
                    }
                }

                if (xf == null)
                {
                    return(x.Map(this));
                }

                Algebraic r = Symbol.ZERO;

                for (int i = xp.Coeffs.Length - 1; i > 0; i--)
                {
                    r = (r + SymEval(xp[i])) * xf;
                }

                if (xp.Coeffs.Length > 0)
                {
                    r = r + SymEval(xp[0]);
                }

                return(r);
            }

            return(x.Map(this));
        }
示例#13
0
 public override bool IsInteger()
 {
     return(Im == 0.0 && Math.round(Re) == Re);
 }
示例#14
0
 internal override Symbol PreEval(Symbol x)
 {
     return(new Complex(Math.logGamma(x.ToComplex().Re)));
 }
示例#15
0
        public virtual string ToString(double x)
        {
            if (x < 0.0)
            {
                return("-" + ToString(-x));
            }

            if (x == 0.0)
            {
                return("0");
            }

            int exp = nsign - 1;

            while (x < mantisse_min)
            {
                exp--;
                x *= dbase;
            }

            while (x >= mantisse_min)
            {
                exp++;
                x /= dbase;
            }

            long xl = ( long )Math.round(x);

            string r  = "";
            int    nc = nsign;

            while (xl != 0L)
            {
                nc--;

                int _digit = digit(xl % ibase);

                if (!(r.Equals("") && _digit == '0'))
                {
                    r = ( char )_digit + r;
                }

                xl = xl / ibase;
            }

            exp -= nc;

            if (exp > nsign - 1 || exp < -1)
            {
                if (r.Length == 1)
                {
                    r = r + "0";
                }

                return(sub(r, 0, 1) + "." + sub(r, 1, r.Length) + "E" + exp);
            }

            if (exp == -1)
            {
                return("0." + r);
            }
            else
            {
                return(sub(r, 0, exp + 1) + (r.Length > exp + 1 ? "." + sub(r, exp + 1, r.Length) : ""));
            }
        }
示例#16
0
 public virtual Complex Arg()
 {
     return(new Complex(Math.atan2(Im, Re)));
 }
示例#17
0
        internal static void ifft_1d(double[] re, double[] im, int sign)
        {
            double u_r, u_i, w_r, w_i, t_r, t_i;
            int    ln, nv2, k, l, le, le1, j, ip, i, n;

            n = re.Length;

            ln = ( int )(Math.log(( double )n) / Math.log(2) + 0.5);

            nv2 = n / 2;
            j   = 1;

            for (i = 1; i < n; i++)
            {
                if (i < j)
                {
                    t_r = re[i - 1];
                    t_i = im[i - 1];

                    re[i - 1] = re[j - 1];
                    im[i - 1] = im[j - 1];

                    re[j - 1] = t_r;
                    im[j - 1] = t_i;
                }

                k = nv2;

                while (k < j)
                {
                    j = j - k;
                    k = k / 2;
                }

                j = j + k;
            }

            for (l = 1; l <= ln; l++)
            {
                le  = ( int )(Math.exp(( double )l * Math.log(2)) + 0.5);
                le1 = le / 2;
                u_r = 1.0;
                u_i = 0.0;
                w_r = Math.cos(Math.PI / ( double )le1);
                w_i = sign * Math.sin(Math.PI / ( double )le1);

                for (j = 1; j <= le1; j++)
                {
                    for (i = j; i <= n; i += le)
                    {
                        ip  = i + le1;
                        t_r = re[ip - 1] * u_r - u_i * im[ip - 1];
                        t_i = im[ip - 1] * u_r + u_i * re[ip - 1];

                        re[ip - 1] = re[i - 1] - t_r;
                        im[ip - 1] = im[i - 1] - t_i;

                        re[i - 1] = re[i - 1] + t_r;
                        im[i - 1] = im[i - 1] + t_i;
                    }

                    t_r = u_r * w_r - w_i * u_i;
                    u_i = w_r * u_i + w_i * u_r;
                    u_r = t_r;
                }
            }

            if (sign > 0)
            {
                for (i = 0; i < n; i++)
                {
                    re[i] /= n;
                    im[i] /= n;
                }
            }
        }
示例#18
0
        public override int Eval(Stack st)
        {
            int narg = GetNarg(st);

            if (narg != 4)
            {
                throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)");
            }

            var exp = GetAlgebraic(st);
            var v   = GetVariable(st);
            var ll  = GetAlgebraic(st);
            var ul  = GetAlgebraic(st);

            LambdaAlgebraic xc = new ExpandConstants();

            exp = xc.SymEval(exp);
            ll  = xc.SymEval(ll);
            ul  = xc.SymEval(ul);

            if (!(ll is Symbol) || !(ul is Symbol))
            {
                throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)");
            }

            var rombergtol = 1.0e-4;
            int rombergit  = 11;

            var a1 = Session.Proc.Store.GetNum("rombergit");

            if (a1 != null)
            {
                rombergit = a1.ToInt();
            }

            a1 = Session.Proc.Store.GetNum("rombergtol");

            if (a1 != null)
            {
                rombergtol = a1.ToComplex().Re;
            }

            var a = (( Symbol )ll).ToComplex().Re;
            var b = (( Symbol )ul).ToComplex().Re;

            var I = Matrix.CreateRectangularArray <double>(rombergit, rombergit);
            int i = 0, n = 1;

            var t = trapez(exp, v, n, a, b);

            if (!(t is Symbol))
            {
                throw new ParseException("Expression must evaluate to number");
            }

            I[0][0] = (( Symbol )t).ToComplex().Re;

            double epsa = 1.1 * rombergtol;

            while (epsa > rombergtol && i < rombergit - 1)
            {
                i++;
                n *= 2;
                t  = trapez(exp, v, n, a, b);

                I[0][i] = (( Symbol )t).ToComplex().Re;

                double f = 1.0;

                for (int k = 1; k <= i; k++)
                {
                    f      *= 4;
                    I[k][i] = I[k - 1][i] + (I[k - 1][i] - I[k - 1][i - 1]) / (f - 1.0);
                }

                epsa = Math.abs((I[i][i] - I[i - 1][i - 1]) / I[i][i]);
            }

            st.Push(new Complex(I[i][i]));

            return(0);
        }
示例#19
0
        protected internal static Symbol readNumber(StringBuilder s)
        {
            int kmax = 0;

            while (kmax < s.Length && oneof(s[kmax], "0123456789.eE+-"))
            {
                kmax++;
            }

            var sub = s.ToString().Substring(0, kmax);

            var cultureInfo = new CultureInfo("")
            {
                NumberFormat = { NumberDecimalSeparator = "." }
            };

            for (int k = kmax; k > 0; k--)
            {
                try
                {
                    var ts = sub.Substring(0, k);

                    var x = double.Parse(ts, cultureInfo);

                    if (ts.EndsWith(".", StringComparison.Ordinal) && s.Length > k && (s[k] == '^' || s[k] == '/'))
                    {
                        continue;
                    }

                    bool imag = false;

                    if (s.Length > k && (s[k] == 'i' || s[k] == 'j'))
                    {
                        imag = true;
                        k++;
                    }

                    s.Remove(0, k);

                    if (Math.abs(x) > 1e15)
                    {
                        try
                        {
                            var bi = new BigInteger(ts, 10);

                            return(imag ? ( Symbol )(new Number(bi) * Symbol.IONE) : new Number(bi));
                        }
                        catch (Exception)
                        {
                        }
                    }

                    return(imag ? new Complex(0, x) : new Complex(x));
                }
                catch (Exception)
                {
                }
            }

            throw new ParseException("Internal Error.");
        }