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