예제 #1
0
        public BigInteger divide(BigInteger divisor)
        {
            if (divisor.sign == 0)
            {
                throw new ArithmeticException("BigInteger divide by zero");
            }
            int divisorSign = divisor.sign;

            if (divisor.isOne())
            {
                return((divisor.sign > 0) ? this : this.negate());
            }
            int thisSign   = sign;
            int thisLen    = numberLength;
            int divisorLen = divisor.numberLength;

            if (thisLen + divisorLen == 2)
            {
                long val = (digits[0] & 0xFFFFFFFFL)
                           / (divisor.digits[0] & 0xFFFFFFFFL);
                if (thisSign != divisorSign)
                {
                    val = -val;
                }
                return(valueOf(val));
            }
            int cmp = ((thisLen != divisorLen) ? ((thisLen > divisorLen) ? 1 : -1)
                       : Elementary.compareArrays(digits, divisor.digits, thisLen));

            if (cmp == EQUALS)
            {
                return((thisSign == divisorSign) ? ONE : MINUS_ONE);
            }
            if (cmp == LESS)
            {
                return(ZERO);
            }
            int resLength = thisLen - divisorLen + 1;

            int[] resDigits = new int[resLength];
            int   resSign   = ((thisSign == divisorSign) ? 1 : -1);

            if (divisorLen == 1)
            {
                Division.divideArrayByInt(resDigits, digits, thisLen,
                                          divisor.digits[0]);
            }
            else
            {
                Division.divide(resDigits, resLength, digits, thisLen,
                                divisor.digits, divisorLen);
            }
            BigInteger result = new BigInteger(resSign, resLength, resDigits);

            result.cutOffLeadingZeroes();
            return(result);
        }
예제 #2
0
        internal static BigInteger[] divideAndRemainderByInteger(BigInteger val,
                                                                 int divisor, int divisorSign)
        {
            // res[0] is a quotient and res[1] is a remainder:
            int[] valDigits = val.digits;
            int   valLen    = val.numberLength;
            int   valSign   = val.sign;

            if (valLen == 1)
            {
                long a   = (valDigits[0] & 0xffffffffL);
                long b   = (divisor & 0xffffffffL);
                long quo = a / b;
                long rem = a % b;
                if (valSign != divisorSign)
                {
                    quo = -quo;
                }
                if (valSign < 0)
                {
                    rem = -rem;
                }
                return(new BigInteger[] { BigInteger.valueOf(quo),
                                          BigInteger.valueOf(rem) });
            }
            int quotientLength = valLen;
            int quotientSign   = ((valSign == divisorSign) ? 1 : -1);

            int[] quotientDigits = new int[quotientLength];
            int[] remainderDigits;
            remainderDigits = new int[] { Division.divideArrayByInt(
                                              quotientDigits, valDigits, valLen, divisor) };
            BigInteger result0 = new BigInteger(quotientSign, quotientLength,
                                                quotientDigits);
            BigInteger result1 = new BigInteger(valSign, 1, remainderDigits);

            result0.cutOffLeadingZeroes();
            result1.cutOffLeadingZeroes();
            return(new BigInteger[] { result0, result1 });
        }
예제 #3
0
파일: Conversion.cs 프로젝트: tspring/ioke
        internal static String bigInteger2String(BigInteger val, int radix)
        {
            int sign         = val.sign;
            int numberLength = val.numberLength;

            int[] digits = val.digits;

            if (sign == 0)
            {
                return("0"); //$NON-NLS-1$
            }
            if (numberLength == 1)
            {
                int  highDigit = digits[numberLength - 1];
                long v         = highDigit & 0xFFFFFFFFL;
                if (sign < 0)
                {
                    v = -v;
                }
                return(Convert.ToString(v, radix));
            }
            if ((radix == 10) || (radix < 0) ||
                (radix > 26))
            {
                return(val.ToString());
            }
            double bitsForRadixDigit;

            bitsForRadixDigit = Math.Log(radix) / Math.Log(2);
            int resLengthInChars = (int)(val.abs().bitLength() / bitsForRadixDigit + ((sign < 0) ? 1
                                                                                       : 0)) + 1;

            char[] result      = new char[resLengthInChars];
            int    currentChar = resLengthInChars;
            int    resDigit;

            if (radix != 16)
            {
                int[] temp = new int[numberLength];
                Array.Copy(digits, 0, temp, 0, numberLength);
                int tempLen     = numberLength;
                int charsPerInt = digitFitInInt[radix];
                int i;
                // get the maximal power of radix that fits in int
                int bigRadix = bigRadices[radix - 2];
                while (true)
                {
                    // divide the array of digits by bigRadix and convert remainders
                    // to characters collecting them in the char array
                    resDigit = Division.divideArrayByInt(temp, temp, tempLen,
                                                         bigRadix);
                    int previous = currentChar;
                    do
                    {
                        result[--currentChar] = Convert.ToString(resDigit % radix, radix)[0];
                    } while (((resDigit /= radix) != 0) && (currentChar != 0));
                    int delta = charsPerInt - previous + currentChar;
                    for (i = 0; i < delta && currentChar > 0; i++)
                    {
                        result[--currentChar] = '0';
                    }
                    for (i = tempLen - 1; (i > 0) && (temp[i] == 0); i--)
                    {
                        ;
                    }
                    tempLen = i + 1;
                    if ((tempLen == 1) && (temp[0] == 0))   // the quotient is 0
                    {
                        break;
                    }
                }
            }
            else
            {
                // radix == 16
                for (int i = 0; i < numberLength; i++)
                {
                    for (int j = 0; (j < 8) && (currentChar > 0); j++)
                    {
                        resDigit = digits[i] >> (j << 2) & 0xf;
                        result[--currentChar] = Convert.ToString(resDigit % radix, 16)[0];
                    }
                }
            }
            while (result[currentChar] == '0')
            {
                currentChar++;
            }
            if (sign == -1)
            {
                result[--currentChar] = '-';
            }
            return(new String(result, currentChar, resLengthInChars - currentChar));
        }