• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 // BEGIN android-note
19 // Since the original Harmony Code of the BigInteger class was strongly modified,
20 // in order to use the more efficient OpenSSL BIGNUM implementation,
21 // no android-modification-tags were placed, at all.
22 // END android-note
23 
24 package java.math;
25 
26 import java.io.IOException;
27 import java.io.ObjectInputStream;
28 import java.io.ObjectOutputStream;
29 import java.io.Serializable;
30 import java.util.Random;
31 
32 /**
33  * An immutable signed integer of arbitrary magnitude.
34  *
35  * <h3>Fast Cryptography</h3>
36  * This implementation is efficient for operations traditionally used in
37  * cryptography, such as the generation of large prime numbers and computation
38  * of the modular inverse.
39  *
40  * <h3>Slow Two's Complement Bitwise Operations</h3>
41  * This API includes operations for bitwise operations in two's complement
42  * representation. Two's complement is not the internal representation used by
43  * this implementation, so such methods may be inefficient. Use {@link
44  * java.util.BitSet} for high-performance bitwise operations on
45  * arbitrarily-large sequences of bits.
46  */
47 public class BigInteger extends Number
48         implements Comparable<BigInteger>, Serializable {
49 
50     /** This is the serialVersionUID used by the sun implementation. */
51     private static final long serialVersionUID = -8287574255936472291L;
52 
53     private transient BigInt bigInt;
54 
55     private transient boolean nativeIsValid = false;
56 
57     private transient boolean javaIsValid = false;
58 
59     /** The magnitude of this in the little-endian representation. */
60     transient int[] digits;
61 
62     /**
63      * The length of this in measured in ints. Can be less than
64      * digits.length().
65      */
66     transient int numberLength;
67 
68     /** The sign of this. */
69     transient int sign;
70 
71     /** The {@code BigInteger} constant 0. */
72     public static final BigInteger ZERO = new BigInteger(0, 0);
73 
74     /** The {@code BigInteger} constant 1. */
75     public static final BigInteger ONE = new BigInteger(1, 1);
76 
77     /** The {@code BigInteger} constant 10. */
78     public static final BigInteger TEN = new BigInteger(1, 10);
79 
80     /** The {@code BigInteger} constant -1. */
81     static final BigInteger MINUS_ONE = new BigInteger(-1, 1);
82 
83     /** All the {@code BigInteger} numbers in the range [0,10] are cached. */
84     static final BigInteger[] SMALL_VALUES = { ZERO, ONE, new BigInteger(1, 2),
85             new BigInteger(1, 3), new BigInteger(1, 4), new BigInteger(1, 5),
86             new BigInteger(1, 6), new BigInteger(1, 7), new BigInteger(1, 8),
87             new BigInteger(1, 9), TEN };
88 
89     private transient int firstNonzeroDigit = -2;
90 
91     /** sign field, used for serialization. */
92     private int signum;
93 
94     /** absolute value field, used for serialization */
95     private byte[] magnitude;
96 
97     /** Cache for the hash code. */
98     private transient int hashCode = 0;
99 
BigInteger(BigInt bigInt)100     BigInteger(BigInt bigInt) {
101         if (bigInt == null || bigInt.getNativeBIGNUM() == 0) {
102             throw new AssertionError();
103         }
104         setBigInt(bigInt);
105     }
106 
BigInteger(int sign, long value)107     BigInteger(int sign, long value) {
108         BigInt bigInt = new BigInt();
109         bigInt.putULongInt(value, (sign < 0));
110         setBigInt(bigInt);
111     }
112 
113     /**
114      * Constructs a number without creating new space. This construct should be
115      * used only if the three fields of representation are known.
116      *
117      * @param sign the sign of the number.
118      * @param numberLength the length of the internal array.
119      * @param digits a reference of some array created before.
120      */
BigInteger(int sign, int numberLength, int[] digits)121     BigInteger(int sign, int numberLength, int[] digits) {
122         setJavaRepresentation(sign, numberLength, digits);
123     }
124 
125     /**
126      * Constructs a random non-negative {@code BigInteger} instance in the range
127      * {@code [0, pow(2, numBits)-1]}.
128      *
129      * @param numBits maximum length of the new {@code BigInteger} in bits.
130      * @param random is the random number generator to be used.
131      * @throws IllegalArgumentException if {@code numBits} < 0.
132      */
BigInteger(int numBits, Random random)133     public BigInteger(int numBits, Random random) {
134         if (numBits < 0) {
135             throw new IllegalArgumentException("numBits < 0: " + numBits);
136         }
137         if (numBits == 0) {
138             setJavaRepresentation(0, 1, new int[] { 0 });
139         } else {
140             int sign = 1;
141             int numberLength = (numBits + 31) >> 5;
142             int[] digits = new int[numberLength];
143             for (int i = 0; i < numberLength; i++) {
144                 digits[i] = random.nextInt();
145             }
146             // Using only the necessary bits
147             digits[numberLength - 1] >>>= (-numBits) & 31;
148             setJavaRepresentation(sign, numberLength, digits);
149         }
150         javaIsValid = true;
151     }
152 
153     /**
154      * Constructs a random {@code BigInteger} instance in the range {@code [0,
155      * pow(2, bitLength)-1]} which is probably prime. The probability that the
156      * returned {@code BigInteger} is prime is beyond
157      * {@code 1 - 1/pow(2, certainty)}.
158      *
159      * <p><b>Implementation Note:</b> the {@code Random} argument is ignored.
160      * This implementation uses OpenSSL's {@code bn_rand} as a source of
161      * cryptographically strong pseudo-random numbers.
162      *
163      * @param bitLength length of the new {@code BigInteger} in bits.
164      * @param certainty tolerated primality uncertainty.
165      * @throws ArithmeticException if {@code bitLength < 2}.
166      * @see <a href="http://www.openssl.org/docs/crypto/BN_rand.html">
167      *      Specification of random generator used from OpenSSL library</a>
168      */
BigInteger(int bitLength, int certainty, Random unused)169     public BigInteger(int bitLength, int certainty, Random unused) {
170         if (bitLength < 2) {
171             throw new ArithmeticException("bitLength < 2: " + bitLength);
172         }
173         setBigInt(BigInt.generatePrimeDefault(bitLength));
174     }
175 
176     /**
177      * Constructs a new {@code BigInteger} by parsing {@code value}. The string
178      * representation consists of an optional plus or minus sign followed by a
179      * non-empty sequence of decimal digits. Digits are interpreted as if by
180      * {@code Character.digit(char,10)}.
181      *
182      * @param value string representation of the new {@code BigInteger}.
183      * @throws NullPointerException if {@code value == null}.
184      * @throws NumberFormatException if {@code value} is not a valid
185      *     representation of a {@code BigInteger}.
186      */
BigInteger(String value)187     public BigInteger(String value) {
188         BigInt bigInt = new BigInt();
189         bigInt.putDecString(value);
190         setBigInt(bigInt);
191     }
192 
193     /**
194      * Constructs a new {@code BigInteger} instance by parsing {@code value}.
195      * The string representation consists of an optional plus or minus sign
196      * followed by a non-empty sequence of digits in the specified radix. Digits
197      * are interpreted as if by {@code Character.digit(char, radix)}.
198      *
199      * @param value string representation of the new {@code BigInteger}.
200      * @param radix the base to be used for the conversion.
201      * @throws NullPointerException if {@code value == null}.
202      * @throws NumberFormatException if {@code value} is not a valid
203      *     representation of a {@code BigInteger} or if {@code radix <
204      *     Character.MIN_RADIX} or {@code radix > Character.MAX_RADIX}.
205      */
BigInteger(String value, int radix)206     public BigInteger(String value, int radix) {
207         if (value == null) {
208             throw new NullPointerException("value == null");
209         }
210         if (radix == 10) {
211             BigInt bigInt = new BigInt();
212             bigInt.putDecString(value);
213             setBigInt(bigInt);
214         } else if (radix == 16) {
215             BigInt bigInt = new BigInt();
216             bigInt.putHexString(value);
217             setBigInt(bigInt);
218         } else {
219             if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
220                 throw new NumberFormatException("bad radix: " + radix);
221             }
222             if (value.isEmpty()) {
223                 throw new NumberFormatException("value.isEmpty()");
224             }
225             BigInteger.parseFromString(this, value, radix);
226         }
227     }
228 
229     /**
230      * Constructs a new {@code BigInteger} instance with the given sign and
231      * magnitude.
232      *
233      * @param signum sign of the new {@code BigInteger} (-1 for negative, 0 for
234      *     zero, 1 for positive).
235      * @param magnitude magnitude of the new {@code BigInteger} with the most
236      *     significant byte first.
237      * @throws NullPointerException if {@code magnitude == null}.
238      * @throws NumberFormatException if the sign is not one of -1, 0, 1 or if
239      *     the sign is zero and the magnitude contains non-zero entries.
240      */
BigInteger(int signum, byte[] magnitude)241     public BigInteger(int signum, byte[] magnitude) {
242         if (magnitude == null) {
243             throw new NullPointerException("magnitude == null");
244         }
245         if (signum < -1 || signum > 1) {
246             throw new NumberFormatException("bad signum: " + signum);
247         }
248         if (signum == 0) {
249             for (byte element : magnitude) {
250                 if (element != 0) {
251                     throw new NumberFormatException("signum-magnitude mismatch");
252                 }
253             }
254         }
255         BigInt bigInt = new BigInt();
256         bigInt.putBigEndian(magnitude, signum < 0);
257         setBigInt(bigInt);
258     }
259 
260     /**
261      * Constructs a new {@code BigInteger} from the given two's complement
262      * representation. The most significant byte is the entry at index 0. The
263      * most significant bit of this entry determines the sign of the new {@code
264      * BigInteger} instance. The array must be nonempty.
265      *
266      * @param value two's complement representation of the new {@code
267      *     BigInteger}.
268      * @throws NullPointerException if {@code value == null}.
269      * @throws NumberFormatException if the length of {@code value} is zero.
270      */
BigInteger(byte[] value)271     public BigInteger(byte[] value) {
272         if (value.length == 0) {
273             throw new NumberFormatException("value.length == 0");
274         }
275         BigInt bigInt = new BigInt();
276         bigInt.putBigEndianTwosComplement(value);
277         setBigInt(bigInt);
278     }
279 
280     /**
281      * Returns the internal native representation of this big integer, computing
282      * it if necessary.
283      */
getBigInt()284     BigInt getBigInt() {
285         if (nativeIsValid) {
286             return bigInt;
287         }
288 
289         synchronized (this) {
290             if (nativeIsValid) {
291                 return bigInt;
292             }
293             BigInt bigInt = new BigInt();
294             bigInt.putLittleEndianInts(digits, (sign < 0));
295             setBigInt(bigInt);
296             return bigInt;
297         }
298     }
299 
setBigInt(BigInt bigInt)300     private void setBigInt(BigInt bigInt) {
301         this.bigInt = bigInt;
302         this.nativeIsValid = true;
303     }
304 
setJavaRepresentation(int sign, int numberLength, int[] digits)305     private void setJavaRepresentation(int sign, int numberLength, int[] digits) {
306         // decrement numberLength to drop leading zeroes...
307         while (numberLength > 0 && digits[--numberLength] == 0) {
308             ;
309         }
310         // ... and then increment it back because we always drop one too many
311         if (digits[numberLength++] == 0) {
312             sign = 0;
313         }
314         this.sign = sign;
315         this.digits = digits;
316         this.numberLength = numberLength;
317         this.javaIsValid = true;
318     }
319 
prepareJavaRepresentation()320     void prepareJavaRepresentation() {
321         if (javaIsValid) {
322             return;
323         }
324 
325         synchronized (this) {
326             if (javaIsValid) {
327                 return;
328             }
329             int sign = bigInt.sign();
330             int[] digits = (sign != 0) ? bigInt.littleEndianIntsMagnitude() : new int[] { 0 };
331             setJavaRepresentation(sign, digits.length, digits);
332         }
333     }
334 
335     /** Returns a {@code BigInteger} whose value is equal to {@code value}. */
valueOf(long value)336     public static BigInteger valueOf(long value) {
337         if (value < 0) {
338             if (value != -1) {
339                 return new BigInteger(-1, -value);
340             }
341             return MINUS_ONE;
342         } else if (value < SMALL_VALUES.length) {
343             return SMALL_VALUES[(int) value];
344         } else {// (value > 10)
345             return new BigInteger(1, value);
346         }
347     }
348 
349     /**
350      * Returns the two's complement representation of this {@code BigInteger} in
351      * a byte array.
352      */
toByteArray()353     public byte[] toByteArray() {
354         return twosComplement();
355     }
356 
357     /**
358      * Returns a {@code BigInteger} whose value is the absolute value of {@code
359      * this}.
360      */
abs()361     public BigInteger abs() {
362         BigInt bigInt = getBigInt();
363         if (bigInt.sign() >= 0) {
364             return this;
365         }
366         BigInt a = bigInt.copy();
367         a.setSign(1);
368         return new BigInteger(a);
369     }
370 
371     /**
372      * Returns a {@code BigInteger} whose value is the {@code -this}.
373      */
negate()374     public BigInteger negate() {
375         BigInt bigInt = getBigInt();
376         int sign = bigInt.sign();
377         if (sign == 0) {
378             return this;
379         }
380         BigInt a = bigInt.copy();
381         a.setSign(-sign);
382         return new BigInteger(a);
383     }
384 
385     /**
386      * Returns a {@code BigInteger} whose value is {@code this + value}.
387      */
add(BigInteger value)388     public BigInteger add(BigInteger value) {
389         BigInt lhs = getBigInt();
390         BigInt rhs = value.getBigInt();
391         if (rhs.sign() == 0) {
392             return this;
393         }
394         if (lhs.sign() == 0) {
395             return value;
396         }
397         return new BigInteger(BigInt.addition(lhs, rhs));
398     }
399 
400     /**
401      * Returns a {@code BigInteger} whose value is {@code this - value}.
402      */
subtract(BigInteger value)403     public BigInteger subtract(BigInteger value) {
404         BigInt lhs = getBigInt();
405         BigInt rhs = value.getBigInt();
406         if (rhs.sign() == 0) {
407             return this;
408         }
409         return new BigInteger(BigInt.subtraction(lhs, rhs));
410     }
411 
412     /**
413      * Returns the sign of this {@code BigInteger}.
414      *
415      * @return {@code -1} if {@code this < 0}, {@code 0} if {@code this == 0},
416      *     {@code 1} if {@code this > 0}.
417      */
signum()418     public int signum() {
419         if (javaIsValid) {
420             return sign;
421         }
422         return getBigInt().sign();
423     }
424 
425     /**
426      * Returns a {@code BigInteger} whose value is {@code this >> n}. For
427      * negative arguments, the result is also negative. The shift distance may
428      * be negative which means that {@code this} is shifted left.
429      *
430      * <p><b>Implementation Note:</b> Usage of this method on negative values is
431      * not recommended as the current implementation is not efficient.
432      *
433      * @param n shift distance
434      * @return {@code this >> n} if {@code n >= 0}; {@code this << (-n)}
435      *     otherwise
436      */
shiftRight(int n)437     public BigInteger shiftRight(int n) {
438         return shiftLeft(-n);
439     }
440 
441     /**
442      * Returns a {@code BigInteger} whose value is {@code this << n}. The
443      * result is equivalent to {@code this * pow(2, n)} if n >= 0. The shift
444      * distance may be negative which means that {@code this} is shifted right.
445      * The result then corresponds to {@code floor(this / pow(2, -n))}.
446      *
447      * <p><b>Implementation Note:</b> Usage of this method on negative values is
448      * not recommended as the current implementation is not efficient.
449      *
450      * @param n shift distance.
451      * @return {@code this << n} if {@code n >= 0}; {@code this >> (-n)}.
452      *     otherwise
453      */
shiftLeft(int n)454     public BigInteger shiftLeft(int n) {
455         if (n == 0) {
456             return this;
457         }
458         int sign = signum();
459         if (sign == 0) {
460             return this;
461         }
462         if ((sign > 0) || (n >= 0)) {
463             return new BigInteger(BigInt.shift(getBigInt(), n));
464         } else {
465             // Negative numbers faking 2's complement:
466             // Not worth optimizing this:
467             // Sticking to Harmony Java implementation.
468             return BitLevel.shiftRight(this, -n);
469         }
470     }
471 
shiftLeftOneBit()472     BigInteger shiftLeftOneBit() {
473         return (signum() == 0) ? this : BitLevel.shiftLeftOneBit(this);
474     }
475 
476     /**
477      * Returns the length of the value's two's complement representation without
478      * leading zeros for positive numbers / without leading ones for negative
479      * values.
480      *
481      * <p>The two's complement representation of {@code this} will be at least
482      * {@code bitLength() + 1} bits long.
483      *
484      * <p>The value will fit into an {@code int} if {@code bitLength() < 32} or
485      * into a {@code long} if {@code bitLength() < 64}.
486      *
487      * @return the length of the minimal two's complement representation for
488      *     {@code this} without the sign bit.
489      */
bitLength()490     public int bitLength() {
491         // Optimization to avoid unnecessary duplicate representation:
492         if (!nativeIsValid && javaIsValid) {
493             return BitLevel.bitLength(this);
494         }
495         return getBigInt().bitLength();
496     }
497 
498     /**
499      * Tests whether the bit at position n in {@code this} is set. The result is
500      * equivalent to {@code this & pow(2, n) != 0}.
501      *
502      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
503      * the current implementation is not efficient.
504      *
505      * @param n position where the bit in {@code this} has to be inspected.
506      * @throws ArithmeticException if {@code n < 0}.
507      */
testBit(int n)508     public boolean testBit(int n) {
509         if (n < 0) {
510             throw new ArithmeticException("n < 0: " + n);
511         }
512         int sign = signum();
513         if (sign > 0 && nativeIsValid && !javaIsValid) {
514             return getBigInt().isBitSet(n);
515         } else {
516             // Negative numbers faking 2's complement:
517             // Not worth optimizing this:
518             // Sticking to Harmony Java implementation.
519             prepareJavaRepresentation();
520             if (n == 0) {
521                 return ((digits[0] & 1) != 0);
522             }
523             int intCount = n >> 5;
524             if (intCount >= numberLength) {
525                 return (sign < 0);
526             }
527             int digit = digits[intCount];
528             n = (1 << (n & 31)); // int with 1 set to the needed position
529             if (sign < 0) {
530                 int firstNonZeroDigit = getFirstNonzeroDigit();
531                 if (intCount < firstNonZeroDigit) {
532                     return false;
533                 } else if (firstNonZeroDigit == intCount) {
534                     digit = -digit;
535                 } else {
536                     digit = ~digit;
537                 }
538             }
539             return ((digit & n) != 0);
540         }
541     }
542 
543     /**
544      * Returns a {@code BigInteger} which has the same binary representation
545      * as {@code this} but with the bit at position n set. The result is
546      * equivalent to {@code this | pow(2, n)}.
547      *
548      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
549      * the current implementation is not efficient.
550      *
551      * @param n position where the bit in {@code this} has to be set.
552      * @throws ArithmeticException if {@code n < 0}.
553      */
setBit(int n)554     public BigInteger setBit(int n) {
555         prepareJavaRepresentation();
556         if (!testBit(n)) {
557             return BitLevel.flipBit(this, n);
558         } else {
559             return this;
560         }
561     }
562 
563     /**
564      * Returns a {@code BigInteger} which has the same binary representation
565      * as {@code this} but with the bit at position n cleared. The result is
566      * equivalent to {@code this & ~pow(2, n)}.
567      *
568      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
569      * the current implementation is not efficient.
570      *
571      * @param n position where the bit in {@code this} has to be cleared.
572      * @throws ArithmeticException if {@code n < 0}.
573      */
clearBit(int n)574     public BigInteger clearBit(int n) {
575         prepareJavaRepresentation();
576         if (testBit(n)) {
577             return BitLevel.flipBit(this, n);
578         } else {
579             return this;
580         }
581     }
582 
583     /**
584      * Returns a {@code BigInteger} which has the same binary representation
585      * as {@code this} but with the bit at position n flipped. The result is
586      * equivalent to {@code this ^ pow(2, n)}.
587      *
588      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
589      * the current implementation is not efficient.
590      *
591      * @param n position where the bit in {@code this} has to be flipped.
592      * @throws ArithmeticException if {@code n < 0}.
593      */
flipBit(int n)594     public BigInteger flipBit(int n) {
595         prepareJavaRepresentation();
596         if (n < 0) {
597             throw new ArithmeticException("n < 0: " + n);
598         }
599         return BitLevel.flipBit(this, n);
600     }
601 
602     /**
603      * Returns the position of the lowest set bit in the two's complement
604      * representation of this {@code BigInteger}. If all bits are zero (this==0)
605      * then -1 is returned as result.
606      *
607      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
608      * the current implementation is not efficient.
609      */
getLowestSetBit()610     public int getLowestSetBit() {
611         prepareJavaRepresentation();
612         if (sign == 0) {
613             return -1;
614         }
615         // (sign != 0) implies that exists some non zero digit
616         int i = getFirstNonzeroDigit();
617         return ((i << 5) + Integer.numberOfTrailingZeros(digits[i]));
618     }
619 
620     /**
621      * Returns the number of bits in the two's complement representation of
622      * {@code this} which differ from the sign bit. If {@code this} is negative,
623      * the result is equivalent to the number of bits set in the two's
624      * complement representation of {@code -this - 1}.
625      *
626      * <p>Use {@code bitLength(0)} to find the length of the binary value in
627      * bits.
628      *
629      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
630      * the current implementation is not efficient.
631      */
bitCount()632     public int bitCount() {
633         prepareJavaRepresentation();
634         return BitLevel.bitCount(this);
635     }
636 
637     /**
638      * Returns a {@code BigInteger} whose value is {@code ~this}. The result
639      * of this operation is {@code -this-1}.
640      *
641      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
642      * the current implementation is not efficient.
643      */
not()644     public BigInteger not() {
645         this.prepareJavaRepresentation();
646         return Logical.not(this);
647     }
648 
649     /**
650      * Returns a {@code BigInteger} whose value is {@code this & value}.
651      *
652      * <p><b>Implementation Note:</b> Usage of this method is not recommended
653      * as the current implementation is not efficient.
654      *
655      * @param value value to be and'ed with {@code this}.
656      * @throws NullPointerException if {@code value == null}.
657      */
and(BigInteger value)658     public BigInteger and(BigInteger value) {
659         this.prepareJavaRepresentation();
660         value.prepareJavaRepresentation();
661         return Logical.and(this, value);
662     }
663 
664     /**
665      * Returns a {@code BigInteger} whose value is {@code this | value}.
666      *
667      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
668      * the current implementation is not efficient.
669      *
670      * @param value value to be or'ed with {@code this}.
671      * @throws NullPointerException if {@code value == null}.
672      */
or(BigInteger value)673     public BigInteger or(BigInteger value) {
674         this.prepareJavaRepresentation();
675         value.prepareJavaRepresentation();
676         return Logical.or(this, value);
677     }
678 
679     /**
680      * Returns a {@code BigInteger} whose value is {@code this ^ value}.
681      *
682      * <p><b>Implementation Note:</b> Usage of this method is not recommended as
683      * the current implementation is not efficient.
684      *
685      * @param value value to be xor'ed with {@code this}
686      * @throws NullPointerException if {@code value == null}
687      */
xor(BigInteger value)688     public BigInteger xor(BigInteger value) {
689         this.prepareJavaRepresentation();
690         value.prepareJavaRepresentation();
691         return Logical.xor(this, value);
692     }
693 
694     /**
695      * Returns a {@code BigInteger} whose value is {@code this & ~value}.
696      * Evaluating {@code x.andNot(value)} returns the same result as {@code
697      * x.and(value.not())}.
698      *
699      * <p><b>Implementation Note:</b> Usage of this method is not recommended
700      * as the current implementation is not efficient.
701      *
702      * @param value value to be not'ed and then and'ed with {@code this}.
703      * @throws NullPointerException if {@code value == null}.
704      */
andNot(BigInteger value)705     public BigInteger andNot(BigInteger value) {
706         this.prepareJavaRepresentation();
707         value.prepareJavaRepresentation();
708         return Logical.andNot(this, value);
709     }
710 
711     /**
712      * Returns this {@code BigInteger} as an int value. If {@code this} is too
713      * big to be represented as an int, then {@code this % (1 << 32)} is
714      * returned.
715      */
716     @Override
intValue()717     public int intValue() {
718         if (nativeIsValid && bigInt.twosCompFitsIntoBytes(4)) {
719             return (int) bigInt.longInt();
720         }
721         this.prepareJavaRepresentation();
722         return (sign * digits[0]);
723     }
724 
725     /**
726      * Returns this {@code BigInteger} as a long value. If {@code this} is too
727      * big to be represented as a long, then {@code this % pow(2, 64)} is
728      * returned.
729      */
730     @Override
longValue()731     public long longValue() {
732         if (nativeIsValid && bigInt.twosCompFitsIntoBytes(8)) {
733             return bigInt.longInt();
734         }
735         prepareJavaRepresentation();
736         long value = numberLength > 1
737                 ? ((long) digits[1]) << 32 | digits[0] & 0xFFFFFFFFL
738                 : digits[0] & 0xFFFFFFFFL;
739         return sign * value;
740     }
741 
742     /**
743      * Returns this {@code BigInteger} as a float. If {@code this} is too big to
744      * be represented as a float, then {@code Float.POSITIVE_INFINITY} or
745      * {@code Float.NEGATIVE_INFINITY} is returned. Note that not all integers
746      * in the range {@code [-Float.MAX_VALUE, Float.MAX_VALUE]} can be exactly
747      * represented as a float.
748      */
749     @Override
floatValue()750     public float floatValue() {
751         return (float) doubleValue();
752     }
753 
754     /**
755      * Returns this {@code BigInteger} as a double. If {@code this} is too big
756      * to be represented as a double, then {@code Double.POSITIVE_INFINITY} or
757      * {@code Double.NEGATIVE_INFINITY} is returned. Note that not all integers
758      * in the range {@code [-Double.MAX_VALUE, Double.MAX_VALUE]} can be exactly
759      * represented as a double.
760      */
761     @Override
doubleValue()762     public double doubleValue() {
763         return Conversion.bigInteger2Double(this);
764     }
765 
766     /**
767      * Compares this {@code BigInteger} with {@code value}. Returns {@code -1}
768      * if {@code this < value}, {@code 0} if {@code this == value} and {@code 1}
769      * if {@code this > value}, .
770      *
771      * @param value value to be compared with {@code this}.
772      * @throws NullPointerException if {@code value == null}.
773      */
compareTo(BigInteger value)774     public int compareTo(BigInteger value) {
775         return BigInt.cmp(getBigInt(), value.getBigInt());
776     }
777 
778     /**
779      * Returns the minimum of this {@code BigInteger} and {@code value}.
780      *
781      * @param value value to be used to compute the minimum with {@code this}.
782      * @throws NullPointerException if {@code value == null}.
783      */
min(BigInteger value)784     public BigInteger min(BigInteger value) {
785         return this.compareTo(value) == -1 ? this : value;
786     }
787 
788     /**
789      * Returns the maximum of this {@code BigInteger} and {@code value}.
790      *
791      * @param value value to be used to compute the maximum with {@code this}
792      * @throws NullPointerException if {@code value == null}
793      */
max(BigInteger value)794     public BigInteger max(BigInteger value) {
795         return this.compareTo(value) == 1 ? this : value;
796     }
797 
798     @Override
hashCode()799     public int hashCode() {
800         if (hashCode != 0) {
801             return hashCode;
802         }
803         prepareJavaRepresentation();
804         for (int digit : digits) {
805             hashCode = hashCode * 33 + digit;
806         }
807         hashCode = hashCode * sign;
808         return hashCode;
809     }
810 
811     @Override
equals(Object x)812     public boolean equals(Object x) {
813         if (this == x) {
814             return true;
815         }
816         if (x instanceof BigInteger) {
817             return this.compareTo((BigInteger) x) == 0;
818         }
819         return false;
820     }
821 
822     /**
823      * Returns a string representation of this {@code BigInteger} in decimal
824      * form.
825      */
826     @Override
toString()827     public String toString() {
828         return getBigInt().decString();
829     }
830 
831     /**
832      * Returns a string containing a string representation of this {@code
833      * BigInteger} with base radix. If {@code radix < Character.MIN_RADIX} or
834      * {@code radix > Character.MAX_RADIX} then a decimal representation is
835      * returned. The characters of the string representation are generated with
836      * method {@code Character.forDigit}.
837      *
838      * @param radix base to be used for the string representation.
839      */
toString(int radix)840     public String toString(int radix) {
841         if (radix == 10) {
842             return getBigInt().decString();
843         } else {
844             prepareJavaRepresentation();
845             return Conversion.bigInteger2String(this, radix);
846         }
847     }
848 
849     /**
850      * Returns a {@code BigInteger} whose value is greatest common divisor
851      * of {@code this} and {@code value}. If {@code this == 0} and {@code
852      * value == 0} then zero is returned, otherwise the result is positive.
853      *
854      * @param value value with which the greatest common divisor is computed.
855      * @throws NullPointerException if {@code value == null}.
856      */
gcd(BigInteger value)857     public BigInteger gcd(BigInteger value) {
858         return new BigInteger(BigInt.gcd(getBigInt(), value.getBigInt()));
859     }
860 
861     /**
862      * Returns a {@code BigInteger} whose value is {@code this * value}.
863      *
864      * @throws NullPointerException if {@code value == null}.
865      */
multiply(BigInteger value)866     public BigInteger multiply(BigInteger value) {
867         return new BigInteger(BigInt.product(getBigInt(), value.getBigInt()));
868     }
869 
870     /**
871      * Returns a {@code BigInteger} whose value is {@code pow(this, exp)}.
872      *
873      * @throws ArithmeticException if {@code exp < 0}.
874      */
pow(int exp)875     public BigInteger pow(int exp) {
876         if (exp < 0) {
877             throw new ArithmeticException("exp < 0: " + exp);
878         }
879         return new BigInteger(BigInt.exp(getBigInt(), exp));
880     }
881 
882     /**
883      * Returns a two element {@code BigInteger} array containing
884      * {@code this / divisor} at index 0 and {@code this % divisor} at index 1.
885      *
886      * @param divisor value by which {@code this} is divided.
887      * @throws NullPointerException if {@code divisor == null}.
888      * @throws ArithmeticException if {@code divisor == 0}.
889      * @see #divide
890      * @see #remainder
891      */
divideAndRemainder(BigInteger divisor)892     public BigInteger[] divideAndRemainder(BigInteger divisor) {
893         BigInt divisorBigInt = divisor.getBigInt();
894         BigInt quotient = new BigInt();
895         BigInt remainder = new BigInt();
896         BigInt.division(getBigInt(), divisorBigInt, quotient, remainder);
897         return new BigInteger[] {new BigInteger(quotient), new BigInteger(remainder) };
898     }
899 
900     /**
901      * Returns a {@code BigInteger} whose value is {@code this / divisor}.
902      *
903      * @param divisor value by which {@code this} is divided.
904      * @return {@code this / divisor}.
905      * @throws NullPointerException if {@code divisor == null}.
906      * @throws ArithmeticException if {@code divisor == 0}.
907      */
divide(BigInteger divisor)908     public BigInteger divide(BigInteger divisor) {
909         BigInt quotient = new BigInt();
910         BigInt.division(getBigInt(), divisor.getBigInt(), quotient, null);
911         return new BigInteger(quotient);
912     }
913 
914     /**
915      * Returns a {@code BigInteger} whose value is {@code this % divisor}.
916      * Regarding signs this methods has the same behavior as the % operator on
917      * ints: the sign of the remainder is the same as the sign of this.
918      *
919      * @param divisor value by which {@code this} is divided.
920      * @throws NullPointerException if {@code divisor == null}.
921      * @throws ArithmeticException if {@code divisor == 0}.
922      */
remainder(BigInteger divisor)923     public BigInteger remainder(BigInteger divisor) {
924         BigInt remainder = new BigInt();
925         BigInt.division(getBigInt(), divisor.getBigInt(), null, remainder);
926         return new BigInteger(remainder);
927     }
928 
929     /**
930      * Returns a {@code BigInteger} whose value is {@code 1/this mod m}. The
931      * modulus {@code m} must be positive. The result is guaranteed to be in the
932      * interval {@code [0, m)} (0 inclusive, m exclusive). If {@code this} is
933      * not relatively prime to m, then an exception is thrown.
934      *
935      * @param m the modulus.
936      * @throws NullPointerException if {@code m == null}
937      * @throws ArithmeticException if {@code m < 0 or} if {@code this} is not
938      *     relatively prime to {@code m}
939      */
modInverse(BigInteger m)940     public BigInteger modInverse(BigInteger m) {
941         if (m.signum() <= 0) {
942             throw new ArithmeticException("modulus not positive");
943         }
944         return new BigInteger(BigInt.modInverse(getBigInt(), m.getBigInt()));
945     }
946 
947     /**
948      * Returns a {@code BigInteger} whose value is {@code
949      * pow(this, exponent) mod m}. The modulus {@code m} must be positive. The
950      * result is guaranteed to be in the interval {@code [0, m)} (0 inclusive,
951      * m exclusive). If the exponent is negative, then {@code
952      * pow(this.modInverse(m), -exponent) mod m} is computed. The inverse of
953      * this only exists if {@code this} is relatively prime to m, otherwise an
954      * exception is thrown.
955      *
956      * @param exponent the exponent.
957      * @param m the modulus.
958      * @throws NullPointerException if {@code m == null} or {@code exponent ==
959      *     null}.
960      * @throws ArithmeticException if {@code m < 0} or if {@code exponent<0} and
961      *     this is not relatively prime to {@code m}.
962      */
modPow(BigInteger exponent, BigInteger m)963     public BigInteger modPow(BigInteger exponent, BigInteger m) {
964         if (m.signum() <= 0) {
965             throw new ArithmeticException("m.signum() <= 0");
966         }
967         BigInteger base = exponent.signum() < 0 ? modInverse(m) : this;
968         return new BigInteger(BigInt.modExp(base.getBigInt(), exponent.getBigInt(), m.getBigInt()));
969     }
970 
971     /**
972      * Returns a {@code BigInteger} whose value is {@code this mod m}. The
973      * modulus {@code m} must be positive. The result is guaranteed to be in the
974      * interval {@code [0, m)} (0 inclusive, m exclusive). The behavior of this
975      * function is not equivalent to the behavior of the % operator defined for
976      * the built-in {@code int}'s.
977      *
978      * @param m the modulus.
979      * @return {@code this mod m}.
980      * @throws NullPointerException if {@code m == null}.
981      * @throws ArithmeticException if {@code m < 0}.
982      */
983     public BigInteger mod(BigInteger m) {
984         if (m.signum() <= 0) {
985             throw new ArithmeticException("m.signum() <= 0");
986         }
987         return new BigInteger(BigInt.modulus(getBigInt(), m.getBigInt()));
988     }
989 
990     /**
991      * Tests whether this {@code BigInteger} is probably prime. If {@code true}
992      * is returned, then this is prime with a probability beyond
993      * {@code 1 - 1/pow(2, certainty)}. If {@code false} is returned, then this
994      * is definitely composite. If the argument {@code certainty} <= 0, then
995      * this method returns true.
996      *
997      * @param certainty tolerated primality uncertainty.
998      * @return {@code true}, if {@code this} is probably prime, {@code false}
999      *     otherwise.
1000      */
1001     public boolean isProbablePrime(int certainty) {
1002         if (certainty <= 0) {
1003             return true;
1004         }
1005         return getBigInt().isPrime(certainty);
1006     }
1007 
1008     /**
1009      * Returns the smallest integer x > {@code this} which is probably prime as
1010      * a {@code BigInteger} instance. The probability that the returned {@code
1011      * BigInteger} is prime is beyond {@code 1 - 1/pow(2, 80)}.
1012      *
1013      * @return smallest integer > {@code this} which is probably prime.
1014      * @throws ArithmeticException if {@code this < 0}.
1015      */
1016     public BigInteger nextProbablePrime() {
1017         if (sign < 0) {
1018             throw new ArithmeticException("sign < 0");
1019         }
1020         return Primality.nextProbablePrime(this);
1021     }
1022 
1023     /**
1024      * Returns a random positive {@code BigInteger} instance in the range {@code
1025      * [0, pow(2, bitLength)-1]} which is probably prime. The probability that
1026      * the returned {@code BigInteger} is prime is beyond {@code
1027      * 1 - 1/pow(2, 80)}.
1028      *
1029      * <p><b>Implementation Note:</b> Currently {@code random} is ignored.
1030      *
1031      * @param bitLength length of the new {@code BigInteger} in bits.
1032      * @return probably prime random {@code BigInteger} instance.
1033      * @throws IllegalArgumentException if {@code bitLength < 2}.
1034      */
1035     public static BigInteger probablePrime(int bitLength, Random unused) {
1036         return new BigInteger(bitLength, 100, unused);
1037     }
1038 
1039     /* Private Methods */
1040 
1041     /**
1042      * Returns the two's complement representation of this BigInteger in a byte
1043      * array.
1044      *
1045      * @return two's complement representation of {@code this}
1046      */
1047     private byte[] twosComplement() {
1048         prepareJavaRepresentation();
1049         if (this.sign == 0) {
1050             return new byte[] { 0 };
1051         }
1052         BigInteger temp = this;
1053         int bitLen = bitLength();
1054         int iThis = getFirstNonzeroDigit();
1055         int bytesLen = (bitLen >> 3) + 1;
1056         /* Puts the little-endian int array representing the magnitude
1057          * of this BigInteger into the big-endian byte array. */
1058         byte[] bytes = new byte[bytesLen];
1059         int firstByteNumber = 0;
1060         int highBytes;
1061         int bytesInInteger = 4;
1062         int hB;
1063 
1064         if (bytesLen - (numberLength << 2) == 1) {
1065             bytes[0] = (byte) ((sign < 0) ? -1 : 0);
1066             highBytes = 4;
1067             firstByteNumber++;
1068         } else {
1069             hB = bytesLen & 3;
1070             highBytes = (hB == 0) ? 4 : hB;
1071         }
1072 
1073         int digitIndex = iThis;
1074         bytesLen -= iThis << 2;
1075 
1076         if (sign < 0) {
1077             int digit = -temp.digits[digitIndex];
1078             digitIndex++;
1079             if (digitIndex == numberLength) {
1080                 bytesInInteger = highBytes;
1081             }
1082             for (int i = 0; i < bytesInInteger; i++, digit >>= 8) {
1083                 bytes[--bytesLen] = (byte) digit;
1084             }
1085             while (bytesLen > firstByteNumber) {
1086                 digit = ~temp.digits[digitIndex];
1087                 digitIndex++;
1088                 if (digitIndex == numberLength) {
1089                     bytesInInteger = highBytes;
1090                 }
1091                 for (int i = 0; i < bytesInInteger; i++, digit >>= 8) {
1092                     bytes[--bytesLen] = (byte) digit;
1093                 }
1094             }
1095         } else {
1096             while (bytesLen > firstByteNumber) {
1097                 int digit = temp.digits[digitIndex];
1098                 digitIndex++;
1099                 if (digitIndex == numberLength) {
1100                     bytesInInteger = highBytes;
1101                 }
1102                 for (int i = 0; i < bytesInInteger; i++, digit >>= 8) {
1103                     bytes[--bytesLen] = (byte) digit;
1104                 }
1105             }
1106         }
1107         return bytes;
1108     }
1109 
1110 
1111     static int multiplyByInt(int[] res, int[] a, int aSize, int factor) {
1112         long carry = 0;
1113 
1114         for (int i = 0; i < aSize; i++) {
1115             carry += (a[i] & 0xFFFFFFFFL) * (factor & 0xFFFFFFFFL);
1116             res[i] = (int) carry;
1117             carry >>>= 32;
1118         }
1119         return (int) carry;
1120     }
1121 
1122     static int inplaceAdd(int[] a, int aSize, int addend) {
1123         long carry = addend & 0xFFFFFFFFL;
1124 
1125         for (int i = 0; (carry != 0) && (i < aSize); i++) {
1126             carry += a[i] & 0xFFFFFFFFL;
1127             a[i] = (int) carry;
1128             carry >>= 32;
1129         }
1130         return (int) carry;
1131     }
1132 
1133     /** @see BigInteger#BigInteger(String, int) */
parseFromString(BigInteger bi, String value, int radix)1134     private static void parseFromString(BigInteger bi, String value, int radix) {
1135         int stringLength = value.length();
1136         int endChar = stringLength;
1137 
1138         int sign;
1139         int startChar;
1140         if (value.charAt(0) == '-') {
1141             sign = -1;
1142             startChar = 1;
1143             stringLength--;
1144         } else {
1145             sign = 1;
1146             startChar = 0;
1147         }
1148 
1149         /*
1150          * We use the following algorithm: split a string into portions of n
1151          * characters and convert each portion to an integer according to the
1152          * radix. Then convert an pow(radix, n) based number to binary using the
1153          * multiplication method. See D. Knuth, The Art of Computer Programming,
1154          * vol. 2.
1155          */
1156 
1157         int charsPerInt = Conversion.digitFitInInt[radix];
1158         int bigRadixDigitsLength = stringLength / charsPerInt;
1159         int topChars = stringLength % charsPerInt;
1160 
1161         if (topChars != 0) {
1162             bigRadixDigitsLength++;
1163         }
1164         int[] digits = new int[bigRadixDigitsLength];
1165         // Get the maximal power of radix that fits in int
1166         int bigRadix = Conversion.bigRadices[radix - 2];
1167         // Parse an input string and accumulate the BigInteger's magnitude
1168         int digitIndex = 0; // index of digits array
1169         int substrEnd = startChar + ((topChars == 0) ? charsPerInt : topChars);
1170 
1171         for (int substrStart = startChar; substrStart < endChar;
1172                 substrStart = substrEnd, substrEnd = substrStart + charsPerInt) {
1173             int bigRadixDigit = Integer.parseInt(value.substring(substrStart, substrEnd), radix);
1174             int newDigit = multiplyByInt(digits, digits, digitIndex, bigRadix);
1175             newDigit += inplaceAdd(digits, digitIndex, bigRadixDigit);
1176             digits[digitIndex++] = newDigit;
1177         }
1178         int numberLength = digitIndex;
1179         bi.setJavaRepresentation(sign, numberLength, digits);
1180     }
1181 
getFirstNonzeroDigit()1182     int getFirstNonzeroDigit() {
1183         if (firstNonzeroDigit == -2) {
1184             int i;
1185             if (this.sign == 0) {
1186                 i = -1;
1187             } else {
1188                 for (i = 0; digits[i] == 0; i++) {
1189                     ;
1190                 }
1191             }
1192             firstNonzeroDigit = i;
1193         }
1194         return firstNonzeroDigit;
1195     }
1196 
1197     /**
1198      * Returns a copy of the current instance to achieve immutability
1199      */
copy()1200     BigInteger copy() {
1201         prepareJavaRepresentation();
1202         int[] copyDigits = new int[numberLength];
1203         System.arraycopy(digits, 0, copyDigits, 0, numberLength);
1204         return new BigInteger(sign, numberLength, copyDigits);
1205     }
1206 
1207     /**
1208      * Assigns all transient fields upon deserialization of a {@code BigInteger}
1209      * instance.
1210      */
readObject(ObjectInputStream in)1211     private void readObject(ObjectInputStream in)
1212             throws IOException, ClassNotFoundException {
1213         in.defaultReadObject();
1214         BigInt bigInt = new BigInt();
1215         bigInt.putBigEndian(magnitude, signum < 0);
1216         setBigInt(bigInt);
1217     }
1218 
1219     /**
1220      * Prepares this {@code BigInteger} for serialization, i.e. the
1221      * non-transient fields {@code signum} and {@code magnitude} are assigned.
1222      */
writeObject(ObjectOutputStream out)1223     private void writeObject(ObjectOutputStream out) throws IOException {
1224         BigInt bigInt = getBigInt();
1225         signum = bigInt.sign();
1226         magnitude = bigInt.bigEndianMagnitude();
1227         out.defaultWriteObject();
1228     }
1229 }
1230