示例#1
0
        public BigInteger remainder(BigInteger divisor)
        {
            if (divisor.sign == 0)
            {
                throw new ArithmeticException("BigInteger divide by zero");
            }
            int thisLen    = numberLength;
            int divisorLen = divisor.numberLength;

            if (((thisLen != divisorLen) ? ((thisLen > divisorLen) ? 1 : -1)
                 : Elementary.compareArrays(digits, divisor.digits, thisLen)) == LESS)
            {
                return(this);
            }
            int resLength = divisorLen;

            int[] resDigits = new int[resLength];
            if (resLength == 1)
            {
                resDigits[0] = Division.remainderArrayByInt(digits, thisLen,
                                                            divisor.digits[0]);
            }
            else
            {
                int qLen = thisLen - divisorLen + 1;
                resDigits = Division.divide(null, qLen, digits, thisLen,
                                            divisor.digits, divisorLen);
            }
            BigInteger result = new BigInteger(sign, resLength, resDigits);

            result.cutOffLeadingZeroes();
            return(result);
        }
示例#2
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);
        }
示例#3
0
        public BigInteger[] divideAndRemainder(BigInteger divisor)
        {
            int divisorSign = divisor.sign;

            if (divisorSign == 0)
            {
                throw new ArithmeticException("BigInteger divide by zero");
            }
            int divisorLen = divisor.numberLength;

            int[] divisorDigits = divisor.digits;
            if (divisorLen == 1)
            {
                return(Division.divideAndRemainderByInteger(this, divisorDigits[0],
                                                            divisorSign));
            }


            // res[0] is a quotient and res[1] is a remainder:
            int[] thisDigits = digits;
            int   thisLen    = numberLength;
            int   cmp        = (thisLen != divisorLen) ? ((thisLen > divisorLen) ? 1 : -1)
                : Elementary.compareArrays(thisDigits, divisorDigits, thisLen);

            if (cmp < 0)
            {
                return(new BigInteger[] { ZERO, this });
            }
            int thisSign        = sign;
            int quotientLength  = thisLen - divisorLen + 1;
            int remainderLength = divisorLen;
            int quotientSign    = ((thisSign == divisorSign) ? 1 : -1);

            int[] quotientDigits  = new int[quotientLength];
            int[] remainderDigits = Division.divide(quotientDigits, quotientLength,
                                                    thisDigits, thisLen, divisorDigits, divisorLen);
            BigInteger result0 = new BigInteger(quotientSign, quotientLength,
                                                quotientDigits);
            BigInteger result1 = new BigInteger(thisSign, remainderLength,
                                                remainderDigits);

            result0.cutOffLeadingZeroes();
            result1.cutOffLeadingZeroes();
            return(new BigInteger[] { result0, result1 });
        }
示例#4
0
 public int compareTo(BigInteger val)
 {
     if (sign > val.sign)
     {
         return(GREATER);
     }
     if (sign < val.sign)
     {
         return(LESS);
     }
     if (numberLength > val.numberLength)
     {
         return(sign);
     }
     if (numberLength < val.numberLength)
     {
         return(-val.sign);
     }
     // Equal sign and equal numberLength
     return(sign * Elementary.compareArrays(digits, val.digits,
                                            numberLength));
 }
示例#5
0
        internal static BigInteger subtract(BigInteger op1, BigInteger op2)
        {
            int resSign;

            int[] resDigits;
            int   op1Sign = op1.sign;
            int   op2Sign = op2.sign;

            if (op2Sign == 0)
            {
                return(op1);
            }
            if (op1Sign == 0)
            {
                return(op2.negate());
            }
            int op1Len = op1.numberLength;
            int op2Len = op2.numberLength;

            if (op1Len + op2Len == 2)
            {
                long a = (op1.digits[0] & 0xFFFFFFFFL);
                long b = (op2.digits[0] & 0xFFFFFFFFL);
                if (op1Sign < 0)
                {
                    a = -a;
                }
                if (op2Sign < 0)
                {
                    b = -b;
                }
                return(BigInteger.valueOf(a - b));
            }
            int cmp = ((op1Len != op2Len) ? ((op1Len > op2Len) ? 1 : -1)
                        : Elementary.compareArrays(op1.digits, op2.digits, op1Len));

            if (cmp == BigInteger.LESS)
            {
                resSign   = -op2Sign;
                resDigits = (op1Sign == op2Sign) ? subtract(op2.digits, op2Len,
                                                            op1.digits, op1Len) : add(op2.digits, op2Len, op1.digits,
                                                                                      op1Len);
            }
            else
            {
                resSign = op1Sign;
                if (op1Sign == op2Sign)
                {
                    if (cmp == BigInteger.EQUALS)
                    {
                        return(BigInteger.ZERO);
                    }
                    resDigits = subtract(op1.digits, op1Len, op2.digits, op2Len);
                }
                else
                {
                    resDigits = add(op1.digits, op1Len, op2.digits, op2Len);
                }
            }
            BigInteger res = new BigInteger(resSign, resDigits.Length, resDigits);

            res.cutOffLeadingZeroes();
            return(res);
        }