Пример #1
0
        static BigInteger kleinsterTeiler(BigInteger X, BigInteger start)
        {
            var stop_in = new sbyte[X.bitLength() / 2 + 1];

            stop_in[0] = ( sbyte )1;

            for (int n = 1; n < stop_in.Length; n++)
            {
                stop_in[n] = ( sbyte )0;
            }

            var stop = new BigInteger(stop_in);

            if (start.compareTo(stop) > 0)
            {
                return(X);
            }

            var b30 = BigInteger.valueOf(30L);
            var b   = start.divide(b30);

            b = b.multiply(b30);

            int m = ( int )start.mod(b30).intValue();
            int i = 0;

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

            while (start.compareTo(stop) <= 0)
            {
                if (Session.Proc.CheckInterrupt())
                {
                    return(null);
                }

                if (X.mod(start).Equals(BigInteger.ZERO))
                {
                    return(start);
                }

                i++;

                if (i >= mod.Length)
                {
                    i     = 0;
                    b     = b.add(b30);
                    start = b;
                }

                start = start.add(BigInteger.valueOf(( long )moddif[i]));
            }

            return(X);
        }
Пример #2
0
        static Vector teiler(BigInteger X)
        {
            var teiler = new ArrayList();

            var b2 = BigInteger.valueOf(2L);

            while (X.mod(b2).Equals(BigInteger.ZERO))
            {
                teiler.Add(Symbol.TWO);

                X = X.divide(b2);
            }

            var b3 = BigInteger.valueOf(3L);

            while (X.mod(b3).Equals(BigInteger.ZERO))
            {
                teiler.Add(Symbol.THREE);

                X = X.divide(b3);
            }

            var b5 = BigInteger.valueOf(5L);

            while (X.mod(b5).Equals(BigInteger.ZERO))
            {
                teiler.Add(new Number(5.0));

                X = X.divide(b5);
            }

            var f = BigInteger.valueOf(7L);

            while (!X.Equals(BigInteger.ONE))
            {
                f = kleinsterTeiler(X, f);

                if (f == null)
                {
                    return(null);
                }

                teiler.Add(new Number(f));

                X = X.divide(f);
            }

            return(Vector.Create(teiler));
        }
Пример #3
0
        public override int Eval(Stack stack)
        {
            int narg = GetNarg(stack);

            var x = GetAlgebraic(stack);

            if (!(x is Symbol) && !(( Symbol )x).IsInteger())
            {
                throw new SymbolicException("Expected integer argument.");
            }

            if (( Symbol )x < Symbol.ZERO)
            {
                x = -x;
            }

            Algebraic res;

            if (x is Number)
            {
                var xl = ( long )(( Symbol )x).ToComplex().Re;

                res = teiler(xl);
            }
            else
            {
                var xb = (( Number )x).real[0];

                if (xb.compareTo(BigInteger.valueOf(long.MaxValue)) <= 0)
                {
                    var xl = xb.longValue();

                    res = teiler(xl);
                }
                else
                {
                    res = teiler(xb);
                }
            }

            if (res != null)
            {
                stack.Push(res);
            }

            return(0);
        }
Пример #4
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.");
        }