Example #1
0
 private static void ModDivCore(ref BigIntegerBuilder regNum, ref BigIntegerBuilder regDen, bool fQuo, ref BigIntegerBuilder regQuo)
 {
     regQuo.Set((uint)0);
     if (regNum._iuLast >= regDen._iuLast)
     {
         int num   = regDen._iuLast + 1;
         int num2  = regNum._iuLast - regDen._iuLast;
         int cu    = num2;
         int index = regNum._iuLast;
         while (true)
         {
             if (index < num2)
             {
                 cu++;
                 break;
             }
             if (regDen._rgu[index - num2] != regNum._rgu[index])
             {
                 if (regDen._rgu[index - num2] < regNum._rgu[index])
                 {
                     cu++;
                 }
                 break;
             }
             index--;
         }
         if (cu != 0)
         {
             if (fQuo)
             {
                 regQuo.SetSizeLazy(cu);
             }
             uint u    = regDen._rgu[num - 1];
             uint num6 = regDen._rgu[num - 2];
             int  num7 = NumericsHelpers.CbitHighZero(u);
             int  num8 = 0x20 - num7;
             if (num7 > 0)
             {
                 u    = (u << num7) | (num6 >> num8);
                 num6 = num6 << num7;
                 if (num > 2)
                 {
                     num6 |= regDen._rgu[num - 3] >> num8;
                 }
             }
             regNum.EnsureWritable();
             int num9 = cu;
             while (--num9 >= 0)
             {
                 uint  uHi   = ((num9 + num) <= regNum._iuLast) ? regNum._rgu[num9 + num] : 0;
                 ulong num11 = NumericsHelpers.MakeUlong(uHi, regNum._rgu[(num9 + num) - 1]);
                 uint  uLo   = regNum._rgu[(num9 + num) - 2];
                 if (num7 > 0)
                 {
                     num11 = (num11 << num7) | (uLo >> num8);
                     uLo   = uLo << num7;
                     if ((num9 + num) >= 3)
                     {
                         uLo |= regNum._rgu[(num9 + num) - 3] >> num8;
                     }
                 }
                 ulong num13 = num11 / ((ulong)u);
                 ulong num14 = (uint)(num11 % ((ulong)u));
                 if (num13 > 0xffffffffL)
                 {
                     num14 += u * (num13 - 0xffffffffL);
                     num13  = 0xffffffffL;
                 }
                 while ((num14 <= 0xffffffffL) && ((num13 * num6) > NumericsHelpers.MakeUlong((uint)num14, uLo)))
                 {
                     num13 -= (ulong)1L;
                     num14 += u;
                 }
                 if (num13 > 0L)
                 {
                     ulong num15 = 0L;
                     for (int i = 0; i < num; i++)
                     {
                         num15 += regDen._rgu[i] * num13;
                         uint num17 = (uint)num15;
                         num15 = num15 >> 0x20;
                         if (regNum._rgu[num9 + i] < num17)
                         {
                             num15 += (ulong)1L;
                         }
                         regNum._rgu[num9 + i] -= num17;
                     }
                     if (uHi < num15)
                     {
                         uint uCarry = 0;
                         for (int j = 0; j < num; j++)
                         {
                             uCarry = AddCarry(ref regNum._rgu[num9 + j], regDen._rgu[j], uCarry);
                         }
                         num13 -= (ulong)1L;
                     }
                     regNum._iuLast = (num9 + num) - 1;
                 }
                 if (fQuo)
                 {
                     if (cu == 1)
                     {
                         regQuo._uSmall = (uint)num13;
                     }
                     else
                     {
                         regQuo._rgu[num9] = (uint)num13;
                     }
                 }
             }
             regNum._iuLast = num - 1;
             regNum.Trim();
         }
     }
 }
Example #2
0
        internal static string FormatBigInteger(BigInteger value, string format, NumberFormatInfo info)
        {
            int  digits = 0;
            char ch     = ParseFormatSpecifier(format, out digits);

            switch (ch)
            {
            case 'X':
            case 'x':
                return(FormatBigIntegerToHexString(value, ch, digits, info));

            default:
            {
                bool flag = ((((ch == 'g') || (ch == 'G')) || ((ch == 'd') || (ch == 'D'))) || (ch == 'r')) || (ch == 'R');
                if (!flag)
                {
                    throw new FormatException("Format specifier was invalid.");
                }
                if (value._bits != null)
                {
                    int num;
                    int num2;
                    int num4 = BigInteger.Length(value._bits);
                    try
                    {
                        num = ((num4 * 10) / 9) + 2;
                    }
                    catch (OverflowException exception)
                    {
                        throw new FormatException("The value is too large to be represented by this format specifier.", exception);
                    }
                    uint[] numArray = new uint[num];
                    int    num5     = 0;
                    int    index    = num4;
                    while (--index >= 0)
                    {
                        uint uLo = value._bits[index];
                        for (int k = 0; k < num5; k++)
                        {
                            ulong num9 = NumericsHelpers.MakeUlong(numArray[k], uLo);
                            numArray[k] = (uint)(num9 % ((ulong)0x3b9aca00L));
                            uLo         = (uint)(num9 / ((ulong)0x3b9aca00L));
                        }
                        if (uLo != 0)
                        {
                            numArray[num5++] = uLo % 0x3b9aca00;
                            uLo /= 0x3b9aca00;
                            if (uLo != 0)
                            {
                                numArray[num5++] = uLo;
                            }
                        }
                    }
                    try
                    {
                        num2 = num5 * 9;
                    }
                    catch (OverflowException exception2)
                    {
                        throw new FormatException("The value is too large to be represented by this format specifier.", exception2);
                    }
                    if (flag)
                    {
                        if ((digits > 0) && (digits > num2))
                        {
                            num2 = digits;
                        }
                        if (value._sign < 0)
                        {
                            try
                            {
                                num2 += info.NegativeSign.Length;
                            }
                            catch (OverflowException exception3)
                            {
                                throw new FormatException("The value is too large to be represented by this format specifier.", exception3);
                            }
                        }
                    }
                    char[] chArray    = new char[num2];
                    int    startIndex = num2;
                    for (int i = 0; i < (num5 - 1); i++)
                    {
                        uint num12 = numArray[i];
                        int  num13 = 9;
                        while (--num13 >= 0)
                        {
                            chArray[--startIndex] = (char)(0x30 + (num12 % 10));
                            num12 /= 10;
                        }
                    }
                    for (uint j = numArray[num5 - 1]; j != 0; j /= 10)
                    {
                        chArray[--startIndex] = (char)(0x30 + (j % 10));
                    }
                    int num15 = num2 - startIndex;
                    while ((digits > 0) && (digits > num15))
                    {
                        chArray[--startIndex] = '0';
                        digits--;
                    }
                    if (value._sign < 0)
                    {
                        string negativeSign = info.NegativeSign;
                        for (int m = negativeSign.Length - 1; m > -1; m--)
                        {
                            chArray[--startIndex] = negativeSign[m];
                        }
                    }
                    return(new string(chArray, startIndex, num2 - startIndex));
                }
                switch (ch)
                {
                case 'g':
                case 'r':
                case 'G':
                case 'R':
                    if (digits > 0)
                    {
                        format = string.Format(CultureInfo.InvariantCulture, "D{0}", digits.ToString(CultureInfo.InvariantCulture));
                    }
                    else
                    {
                        format = "D";
                    }
                    break;
                }
                break;
            }
            }
            return(value._sign.ToString(format, info));
        }