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