Esempio n. 1
0
File: BitLevel.cs Progetto: vic/ioke
 internal static void inplaceShiftLeft(BigInteger val, int count)
 {
     int intCount = count >> 5; // count of integers
     val.numberLength += intCount
         + ( BigDecimal
             .numberOfLeadingZeros(val.digits[val.numberLength - 1])
             - ( count & 31 ) >= 0 ? 0 : 1 );
     shiftLeft(val.digits, val.digits, intCount, count & 31);
     val.cutOffLeadingZeroes();
     val.unCache();
 }
Esempio n. 2
0
File: BitLevel.cs Progetto: vic/ioke
 internal static void inplaceShiftRight(BigInteger val, int count)
 {
     int sign = val.signum();
     if (count == 0 || val.signum() == 0)
         return;
     int intCount = count >> 5; // count of integers
     val.numberLength -= intCount;
     if (!shiftRight(val.digits, val.numberLength, val.digits, intCount,
                     count & 31)
         && sign < 0) {
         // remainder not zero: add one to the result
         int i;
         for (i = 0; ( i < val.numberLength ) && ( val.digits[i] == -1 ); i++) {
             val.digits[i] = 0;
         }
         if (i == val.numberLength) {
             val.numberLength++;
         }
         val.digits[i]++;
     }
     val.cutOffLeadingZeroes();
     val.unCache();
 }
Esempio n. 3
0
 internal static void completeInPlaceAdd(BigInteger op1, BigInteger op2)
 {
     if (op1.sign == 0)
         Array.Copy(op2.digits, op1.digits, op2.numberLength);
     else if (op2.sign == 0)
         return;
     else if (op1.sign == op2.sign)
         add (op1.digits, op1.digits, op1.numberLength, op2.digits,
              op2.numberLength);
     else {
         int sign = unsignedArraysCompare(op1.digits,
                                          op2.digits, op1.numberLength, op2.numberLength);
         if (sign > 0)
             subtract (op1.digits, op1.digits, op1.numberLength, op2.digits,
                       op2.numberLength);
         else {
             inverseSubtract (op1.digits, op1.digits, op1.numberLength,
                              op2.digits, op2.numberLength);
             op1.sign = -op1.sign;
         }
     }
     op1.numberLength = Math.Max(op1.numberLength, op2.numberLength) + 1;
     op1.cutOffLeadingZeroes ();
     op1.unCache();
 }
Esempio n. 4
0
 internal static void inplaceSubtract(BigInteger op1, BigInteger op2)
 {
     subtract (op1.digits, op1.digits, op1.numberLength, op2.digits,
               op2.numberLength);
     op1.cutOffLeadingZeroes ();
     op1.unCache();
 }
Esempio n. 5
0
 internal static void inplaceAdd(BigInteger op1, int addend)
 {
     int carry = inplaceAdd(op1.digits, op1.numberLength, addend);
     if (carry == 1) {
         op1.digits[op1.numberLength] = 1;
         op1.numberLength++;
     }
     op1.unCache();
 }
Esempio n. 6
0
 internal static void inplaceAdd(BigInteger op1, BigInteger op2)
 {
     // PRE: op1 >= op2 > 0
     add (op1.digits, op1.digits, op1.numberLength, op2.digits,
          op2.numberLength);
     op1.numberLength = Math.Min(Math.Max(op1.numberLength,
                                          op2.numberLength) + 1, op1.digits.Length);
     op1.cutOffLeadingZeroes ();
     op1.unCache();
 }
Esempio n. 7
0
 internal static void completeInPlaceSubtract(BigInteger op1, BigInteger op2)
 {
     int resultSign = op1.compareTo (op2);
     if (op1.sign == 0) {
         Array.Copy(op2.digits, op1.digits, op2.numberLength);
         op1.sign = -op2.sign;
     } else if (op1.sign != op2.sign) {
         add (op1.digits, op1.digits, op1.numberLength, op2.digits,
              op2.numberLength);
         op1.sign = resultSign;
     } else {
         int sign = unsignedArraysCompare (op1.digits,
                                           op2.digits, op1.numberLength, op2.numberLength);
         if (sign > 0) {
             subtract (op1.digits, op1.digits, op1.numberLength, op2.digits,
                       op2.numberLength);	// op1 = op1 - op2
             // op1.sign remains equal
         } else {
             inverseSubtract (op1.digits, op1.digits, op1.numberLength,
                              op2.digits, op2.numberLength);	// op1 = op2 - op1
             op1.sign = -op1.sign;
         }
     }
     op1.numberLength = Math.Max(op1.numberLength, op2.numberLength) + 1;
     op1.cutOffLeadingZeroes ();
     op1.unCache();
 }