Esempio n. 1
0
 public MyBigType(ulong number)
 {
     m_digits = new ArrayForDigits((8 / ArrayForDigits.DataSizeOf) + 1, 0);
     while (number != 0 && m_digits.DataUsed < m_digits.Count)
     {
         m_digits[m_digits.DataUsed] = (unsignIn)(number & ArrayForDigits.AllBits);
         number >>= ArrayForDigits.DataSizeBits;
         m_digits.DataUsed++;
     }
     m_digits.ResetDataUsed();
 }
Esempio n. 2
0
        private static void SingleDivide(MyBigType leftSide, MyBigType rightSide, out MyBigType quotient, out MyBigType remainder)
        {
            if (rightSide.IsZero)
            {
                throw new DivideByZeroException();
            }

            ArrayForDigits remainderDigits = new ArrayForDigits(leftSide.m_digits);

            remainderDigits.ResetDataUsed();

            int   pos      = remainderDigits.DataUsed - 1;
            ulong divisor  = (ulong)rightSide.m_digits[0];
            ulong dividend = (ulong)remainderDigits[pos];

            unsignIn[] result = new unsignIn[leftSide.m_digits.Count];
            leftSide.m_digits.CopyTo(result, 0, result.Length);
            int resultPos = 0;

            if (dividend >= divisor)
            {
                result[resultPos++]  = (unsignIn)(dividend / divisor);
                remainderDigits[pos] = (unsignIn)(dividend % divisor);
            }
            pos--;

            while (pos >= 0)
            {
                dividend                 = ((ulong)(remainderDigits[pos + 1]) << ArrayForDigits.DataSizeBits) + (ulong)remainderDigits[pos];
                result[resultPos++]      = (unsignIn)(dividend / divisor);
                remainderDigits[pos + 1] = 0;
                remainderDigits[pos--]   = (unsignIn)(dividend % divisor);
            }
            remainder = new MyBigType(remainderDigits);

            ArrayForDigits quotientDigits = new ArrayForDigits(resultPos + 1, resultPos);
            int            j = 0;

            for (int i = quotientDigits.DataUsed - 1; i >= 0; i--, j++)
            {
                quotientDigits[j] = result[i];
            }
            quotient = new MyBigType(quotientDigits);
        }
Esempio n. 3
0
        private void ConstructFrom(byte[] array, int offset, int length)
        {
            if (array == null)
            {
                throw new ArgumentNullException("array");
            }
            if (offset > array.Length || length > array.Length)
            {
                throw new ArgumentOutOfRangeException("offset");
            }
            if (length > array.Length || (offset + length) > array.Length)
            {
                throw new ArgumentOutOfRangeException("length");
            }

            int isSize   = length / 4;
            int leftOver = length & 3;

            if (leftOver != 0)
            {
                ++isSize;
            }

            m_digits = new ArrayForDigits(isSize + 1, 0); // alloc one extra since we can't init -'s from here.

            for (int i = offset + length - 1, j = 0; (i - offset) >= 3; i -= 4, j++)
            {
                m_digits[j] = (unsignIn)((array[i - 3] << 24) + (array[i - 2] << 16) + (array[i - 1] << 8) + array[i]);
                m_digits.DataUsed++;
            }

            unsignIn accumulator = 0;

            for (int i = leftOver; i > 0; i--)
            {
                unsignIn digit = array[offset + leftOver - i];
                digit        = (digit << ((i - 1) * 8));
                accumulator |= digit;
            }
            m_digits[m_digits.DataUsed] = accumulator;

            m_digits.ResetDataUsed();
        }
Esempio n. 4
0
 private MyBigType(ArrayForDigits digits)
 {
     digits.ResetDataUsed();
     this.m_digits = digits;
 }