コード例 #1
0
        public static ILongNumber DivisionLongInteger(LongInteger v1, LongInteger v2)
        {
            ILongNumber result           = Module(v1);
            var         modulo           = Module(v2);
            var         resultIsNegative = v1.IsNegative() != v2.IsNegative();

            if (v2.Values.Count == 1)
            {
                result = DivisionIntoSmall(result as LongInteger, v2.Values[0]);
            }
            else
            {
                var low = 0;
                var up  = Constants.Radix;
                while ((up - low) > 1)
                {
                    var midRange = (low + up) / 2;
                    var res      = MultiplicationLongInteger(modulo, LongInteger.Parse(Convert.ToString(midRange)));
                    if (Compare(res, modulo) > 0)
                    {
                        //                        up = up - up/2;
                        up = midRange;
                    }
                    else
                    {
                        //                        low = low + up/2;
                        low = midRange;
                    }
                }
                throw new NotImplementedException();
            }
            if (resultIsNegative)
            {
                result.InverSign();
            }
            return(result);
        }
コード例 #2
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);
        }