示例#1
0
        private static LongInteger CalculationSumAndSubstruct(LongInteger v1, LongInteger v2, int sign)
        {
            var result = v1.Clone();
            var i      = v1.Values.Count - 1;
            var j      = v2.Values.Count - 1;
            var hold   = 0;

            while (i >= 0 && (j >= 0 || hold != 0))
            {
                var res = result.Values[i] + (((j >= 0) ? v2.Values[j] : 0)) * sign + hold;
                hold             = (res + Constants.Radix) / Constants.Radix - 1;
                result.Values[i] = (res + Constants.Radix) % Constants.Radix;
                i--;
                j--;
            }

            if (sign > 0 && hold != 0)
            {
                result.Values.Insert(0, hold);
            }
            else
            {
                result.Normalize();
            }

            return(result);
        }
示例#2
0
        public static LongInteger OppositeValue(LongInteger value)
        {
            var result = value.Clone();

            result.InverSign();
            return(result);
        }
示例#3
0
        public static LongInteger Module(LongInteger value)
        {
            var result = value.Clone();

            result.Negative = false;
            return(result);
        }
示例#4
0
        public static LongInteger MultiplicationLongInteger(LongInteger v1, LongInteger v2)
        {
            if (v1.Values.Count < v2.Values.Count)
            {
                MultiplicationLongInteger(v2, v1);
            }

            if (v1.Equals("0") || v2.Equals("0"))
            {
                return(LongInteger.Parse("0"));
            }

            var multResult = LongInteger.Parse("0");

            var j = v2.Values.Count - 1;
            var n = 0;

            while (j >= 0)
            {
                var result = Module(v1.Clone());
                var i      = v1.Values.Count - 1;
                var hold   = 0;
                while (i >= 0)
                {
                    var res = v1.Values[i] * v2.Values[j] + hold;
                    hold             = res / Constants.Radix;
                    result.Values[i] = res % Constants.Radix;
                    i--;
                }
                if (hold != 0)
                {
                    result.Values.Insert(0, hold);
                }

                for (var k = 0; k < n; k++)
                {
                    result.Values.Add(0);
                }

                multResult = SumLongInteger(multResult, result);
                j--;
                n++;
            }

            multResult.Negative = v1.Negative != v2.Negative;
            multResult.Normalize();
            return(multResult);
        }
示例#5
0
        public static ILongNumber DivisionIntoSmall(LongInteger v1, int v2)
        {
            if (v2 >= Constants.Radix)
            {
                var divider = LongInteger.Parse(Convert.ToString(v2));
                return(DivisionLongInteger(v1, divider));
            }

            if (v2 == 0)
            {
                return(v1.IsNegative() ? new InfinityLongNumber(true) : new InfinityLongNumber());
            }

            var result = v1.Clone();
            var modulo = 0;
            var i      = 0;

            while (i < v1.Values.Count)
            {
                var res = modulo * Constants.Radix + v1.Values[i];
                result.Values[i] = (res / Math.Abs(v2));
                modulo           = (res % Math.Abs(v2));
                i++;
            }

            if (v1.Negative || v2 < 0)
            {
                result.Negative = true;
            }
            if (v1.Negative && v2 < 0)
            {
                result.Negative = false;
            }

            result.Normalize();
            return(result);
        }