View Javadoc
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  package org.apache.commons.numbers.fraction;
18  
19  import java.io.Serializable;
20  import java.math.BigDecimal;
21  import java.math.BigInteger;
22  import java.math.RoundingMode;
23  import java.util.Objects;
24  import org.apache.commons.numbers.core.NativeOperators;
25  
26  /**
27   * Representation of a rational number using arbitrary precision.
28   *
29   * <p>The number is expressed as the quotient {@code p/q} of two {@link BigInteger}s,
30   * a numerator {@code p} and a non-zero denominator {@code q}.
31   *
32   * <p>This class is immutable.
33   *
34   * <a href="https://en.wikipedia.org/wiki/Rational_number">Rational number</a>
35   */
36  public final class BigFraction
37      extends Number
38      implements Comparable<BigFraction>,
39                 NativeOperators<BigFraction>,
40                 Serializable {
41      /** A fraction representing "0". */
42      public static final BigFraction ZERO = new BigFraction(BigInteger.ZERO);
43  
44      /** A fraction representing "1". */
45      public static final BigFraction ONE = new BigFraction(BigInteger.ONE);
46  
47      /** Serializable version identifier. */
48      private static final long serialVersionUID = 20190701L;
49  
50      /** The default iterations used for convergence. */
51      private static final int DEFAULT_MAX_ITERATIONS = 100;
52  
53      /** Message for non-finite input double argument to factory constructors. */
54      private static final String NOT_FINITE = "Not finite: ";
55  
56      /** The overflow limit for conversion from a double (2^31). */
57      private static final long OVERFLOW = 1L << 31;
58  
59      /** The numerator of this fraction reduced to lowest terms. */
60      private final BigInteger numerator;
61  
62      /** The denominator of this fraction reduced to lowest terms. */
63      private final BigInteger denominator;
64  
65      /**
66       * Private constructor: Instances are created using factory methods.
67       *
68       * <p>This constructor should only be invoked when the fraction is known
69       * to be non-zero; otherwise use {@link #ZERO}. This avoids creating
70       * the zero representation {@code 0 / -1}.
71       *
72       * @param num Numerator, must not be {@code null}.
73       * @param den Denominator, must not be {@code null}.
74       * @throws ArithmeticException if the denominator is zero.
75       */
76      private BigFraction(BigInteger num, BigInteger den) {
77          if (den.signum() == 0) {
78              throw new FractionException(FractionException.ERROR_ZERO_DENOMINATOR);
79          }
80  
81          // reduce numerator and denominator by greatest common denominator
82          final BigInteger gcd = num.gcd(den);
83          if (BigInteger.ONE.compareTo(gcd) < 0) {
84              numerator = num.divide(gcd);
85              denominator = den.divide(gcd);
86          } else {
87              numerator = num;
88              denominator = den;
89          }
90      }
91  
92      /**
93       * Private constructor: Instances are created using factory methods.
94       *
95       * <p>This sets the denominator to 1.
96       *
97       * @param num Numerator (must not be null).
98       */
99      private BigFraction(BigInteger num) {
100         numerator = num;
101         denominator = BigInteger.ONE;
102     }
103 
104     /**
105      * Create a fraction given the double value and either the maximum
106      * error allowed or the maximum number of denominator digits.
107      *
108      * <p>
109      * NOTE: This method is called with:
110      * </p>
111      * <ul>
112      *  <li>EITHER a valid epsilon value and the maxDenominator set to
113      *      Integer.MAX_VALUE (that way the maxDenominator has no effect)</li>
114      *  <li>OR a valid maxDenominator value and the epsilon value set to
115      *      zero (that way epsilon only has effect if there is an exact
116      *      match before the maxDenominator value is reached).</li>
117      * </ul>
118      * <p>
119      * It has been done this way so that the same code can be reused for
120      * both scenarios. However this could be confusing to users if it
121      * were part of the public API and this method should therefore remain
122      * PRIVATE.
123      * </p>
124      *
125      * <p>
126      * See JIRA issue ticket MATH-181 for more details:
127      *     https://issues.apache.org/jira/browse/MATH-181
128      * </p>
129      *
130      * @param value Value to convert to a fraction.
131      * @param epsilon Maximum error allowed.
132      * The resulting fraction is within {@code epsilon} of {@code value},
133      * in absolute terms.
134      * @param maxDenominator Maximum denominator value allowed.
135      * @param maxIterations Maximum number of convergents.
136      * @return a new instance.
137      * @throws IllegalArgumentException if the given {@code value} is NaN or infinite.
138      * @throws ArithmeticException if the continued fraction failed to converge.
139      */
140     private static BigFraction from(final double value,
141                                     final double epsilon,
142                                     final int maxDenominator,
143                                     final int maxIterations) {
144         if (!Double.isFinite(value)) {
145             throw new IllegalArgumentException(NOT_FINITE + value);
146         }
147         if (value == 0) {
148             return ZERO;
149         }
150 
151         // Remove sign, this is restored at the end.
152         // (Assumes the value is not zero and thus signum(value) is not zero).
153         final double absValue = Math.abs(value);
154         double r0 = absValue;
155         long a0 = (long) Math.floor(r0);
156         if (a0 > OVERFLOW) {
157             throw new FractionException(FractionException.ERROR_CONVERSION_OVERFLOW, value, a0, 1);
158         }
159 
160         // check for (almost) integer arguments, which should not go to iterations.
161         if (r0 - a0 <= epsilon) {
162             // Restore the sign.
163             if (value < 0) {
164                 a0 = -a0;
165             }
166             return new BigFraction(BigInteger.valueOf(a0));
167         }
168 
169         // Support 2^31 as maximum denominator.
170         // This is negative as an integer so convert to long.
171         final long maxDen = Math.abs((long) maxDenominator);
172 
173         long p0 = 1;
174         long q0 = 0;
175         long p1 = a0;
176         long q1 = 1;
177 
178         long p2;
179         long q2;
180 
181         int n = 0;
182         boolean stop = false;
183         do {
184             ++n;
185             final double r1 = 1.0 / (r0 - a0);
186             final long a1 = (long) Math.floor(r1);
187             p2 = (a1 * p1) + p0;
188             q2 = (a1 * q1) + q0;
189             if (Long.compareUnsigned(p2, OVERFLOW) > 0 ||
190                 Long.compareUnsigned(q2, OVERFLOW) > 0) {
191                 // In maxDenominator mode, fall-back to the previous valid fraction.
192                 if (epsilon == 0) {
193                     p2 = p1;
194                     q2 = q1;
195                     break;
196                 }
197                 throw new FractionException(FractionException.ERROR_CONVERSION_OVERFLOW, value, p2, q2);
198             }
199 
200             final double convergent = (double) p2 / q2;
201             if (n < maxIterations &&
202                 Math.abs(convergent - absValue) > epsilon &&
203                 q2 < maxDen) {
204                 p0 = p1;
205                 p1 = p2;
206                 q0 = q1;
207                 q1 = q2;
208                 a0 = a1;
209                 r0 = r1;
210             } else {
211                 stop = true;
212             }
213         } while (!stop);
214 
215         if (n >= maxIterations) {
216             throw new FractionException(FractionException.ERROR_CONVERSION, value, maxIterations);
217         }
218 
219         // Use p2 / q2 or p1 / q1 if q2 has grown too large in maxDenominator mode
220         long num;
221         final long den;
222         if (q2 <= maxDen) {
223             num = p2;
224             den = q2;
225         } else {
226             num = p1;
227             den = q1;
228         }
229 
230         // Restore the sign.
231         if (Math.signum(num) * Math.signum(den) != Math.signum(value)) {
232             num = -num;
233         }
234 
235         return new BigFraction(BigInteger.valueOf(num),
236                                BigInteger.valueOf(den));
237     }
238 
239     /**
240      * Create a fraction given the double value.
241      * <p>
242      * This factory method behaves <em>differently</em> to the method
243      * {@link #from(double, double, int)}. It converts the double value
244      * exactly, considering its internal bits representation. This works for all
245      * values except NaN and infinities and does not requires any loop or
246      * convergence threshold.
247      * </p>
248      * <p>
249      * Since this conversion is exact and since double numbers are sometimes
250      * approximated, the fraction created may seem strange in some cases. For example,
251      * calling {@code from(1.0 / 3.0)} does <em>not</em> create
252      * the fraction \( \frac{1}{3} \), but the fraction \( \frac{6004799503160661}{18014398509481984} \)
253      * because the double number passed to the method is not exactly \( \frac{1}{3} \)
254      * (which cannot be represented exactly in IEEE754).
255      * </p>
256      *
257      * @param value Value to convert to a fraction.
258      * @throws IllegalArgumentException if the given {@code value} is NaN or infinite.
259      * @return a new instance.
260      *
261      * @see #from(double,double,int)
262      */
263     public static BigFraction from(final double value) {
264         if (!Double.isFinite(value)) {
265             throw new IllegalArgumentException(NOT_FINITE + value);
266         }
267         if (value == 0) {
268             return ZERO;
269         }
270 
271         final long bits = Double.doubleToLongBits(value);
272         final long sign = bits & 0x8000000000000000L;
273         final long exponent = bits & 0x7ff0000000000000L;
274         final long mantissa = bits & 0x000fffffffffffffL;
275 
276         // Compute m and k such that value = m * 2^k
277         long m;
278         int k;
279 
280         if (exponent == 0) {
281             // Subnormal number, the effective exponent bias is 1022, not 1023.
282             // Note: mantissa is never zero as that case has been eliminated.
283             m = mantissa;
284             k = -1074;
285         } else {
286             // Normalized number: Add the implicit most significant bit.
287             m = mantissa | 0x0010000000000000L;
288             k = ((int) (exponent >> 52)) - 1075; // Exponent bias is 1023.
289         }
290         if (sign != 0) {
291             m = -m;
292         }
293         while ((m & 0x001ffffffffffffeL) != 0 &&
294                (m & 0x1) == 0) {
295             m >>= 1;
296             ++k;
297         }
298 
299         return k < 0 ?
300             new BigFraction(BigInteger.valueOf(m),
301                             BigInteger.ZERO.flipBit(-k)) :
302             new BigFraction(BigInteger.valueOf(m).multiply(BigInteger.ZERO.flipBit(k)),
303                             BigInteger.ONE);
304     }
305 
306     /**
307      * Create a fraction given the double value and maximum error allowed.
308      * <p>
309      * References:
310      * <ul>
311      * <li><a href="https://mathworld.wolfram.com/ContinuedFraction.html">
312      * Continued Fraction</a> equations (11) and (22)-(26)</li>
313      * </ul>
314      *
315      * @param value Value to convert to a fraction.
316      * @param epsilon Maximum error allowed. The resulting fraction is within
317      * {@code epsilon} of {@code value}, in absolute terms.
318      * @param maxIterations Maximum number of convergents.
319      * @throws IllegalArgumentException if the given {@code value} is NaN or infinite;
320      * {@code epsilon} is not positive; or {@code maxIterations < 1}.
321      * @throws ArithmeticException if the continued fraction failed to converge.
322      * @return a new instance.
323      */
324     public static BigFraction from(final double value,
325                                    final double epsilon,
326                                    final int maxIterations) {
327         if (maxIterations < 1) {
328             throw new IllegalArgumentException("Max iterations must be strictly positive: " + maxIterations);
329         }
330         if (epsilon >= 0) {
331             return from(value, epsilon, Integer.MIN_VALUE, maxIterations);
332         }
333         throw new IllegalArgumentException("Epsilon must be positive: " + maxIterations);
334     }
335 
336     /**
337      * Create a fraction given the double value and maximum denominator.
338      *
339      * <p>
340      * References:
341      * <ul>
342      * <li><a href="https://mathworld.wolfram.com/ContinuedFraction.html">
343      * Continued Fraction</a> equations (11) and (22)-(26)</li>
344      * </ul>
345      *
346      * <p>Note: The magnitude of the {@code maxDenominator} is used allowing use of
347      * {@link Integer#MIN_VALUE} for a supported maximum denominator of 2<sup>31</sup>.
348      *
349      * @param value Value to convert to a fraction.
350      * @param maxDenominator Maximum allowed value for denominator.
351      * @throws IllegalArgumentException if the given {@code value} is NaN or infinite
352      * or {@code maxDenominator} is zero.
353      * @throws ArithmeticException if the continued fraction failed to converge.
354      * @return a new instance.
355      */
356     public static BigFraction from(final double value,
357                                    final int maxDenominator) {
358         if (maxDenominator == 0) {
359             // Re-use the zero denominator message
360             throw new IllegalArgumentException(FractionException.ERROR_ZERO_DENOMINATOR);
361         }
362         return from(value, 0, maxDenominator, DEFAULT_MAX_ITERATIONS);
363     }
364 
365     /**
366      * Create a fraction given the numerator. The denominator is {@code 1}.
367      *
368      * @param num
369      *            the numerator.
370      * @return a new instance.
371      */
372     public static BigFraction of(final int num) {
373         if (num == 0) {
374             return ZERO;
375         }
376         return new BigFraction(BigInteger.valueOf(num));
377     }
378 
379     /**
380      * Create a fraction given the numerator. The denominator is {@code 1}.
381      *
382      * @param num Numerator.
383      * @return a new instance.
384      */
385     public static BigFraction of(final long num) {
386         if (num == 0) {
387             return ZERO;
388         }
389         return new BigFraction(BigInteger.valueOf(num));
390     }
391 
392     /**
393      * Create a fraction given the numerator. The denominator is {@code 1}.
394      *
395      * @param num Numerator.
396      * @return a new instance.
397      * @throws NullPointerException if numerator is null.
398      */
399     public static BigFraction of(final BigInteger num) {
400         Objects.requireNonNull(num, "numerator");
401         if (num.signum() == 0) {
402             return ZERO;
403         }
404         return new BigFraction(num);
405     }
406 
407     /**
408      * Create a fraction given the numerator and denominator.
409      * The fraction is reduced to lowest terms.
410      *
411      * @param num Numerator.
412      * @param den Denominator.
413      * @return a new instance.
414      * @throws ArithmeticException if {@code den} is zero.
415      */
416     public static BigFraction of(final int num, final int den) {
417         if (num == 0) {
418             return ZERO;
419         }
420         return new BigFraction(BigInteger.valueOf(num), BigInteger.valueOf(den));
421     }
422 
423     /**
424      * Create a fraction given the numerator and denominator.
425      * The fraction is reduced to lowest terms.
426      *
427      * @param num Numerator.
428      * @param den Denominator.
429      * @return a new instance.
430      * @throws ArithmeticException if {@code den} is zero.
431      */
432     public static BigFraction of(final long num, final long den) {
433         if (num == 0) {
434             return ZERO;
435         }
436         return new BigFraction(BigInteger.valueOf(num), BigInteger.valueOf(den));
437     }
438 
439     /**
440      * Create a fraction given the numerator and denominator.
441      * The fraction is reduced to lowest terms.
442      *
443      * @param num Numerator.
444      * @param den Denominator.
445      * @return a new instance.
446      * @throws NullPointerException if numerator or denominator are null.
447      * @throws ArithmeticException if the denominator is zero.
448      */
449     public static BigFraction of(final BigInteger num, final BigInteger den) {
450         if (num.signum() == 0) {
451             return ZERO;
452         }
453         return new BigFraction(num, den);
454     }
455 
456     /**
457      * Returns a {@code BigFraction} instance representing the specified string {@code s}.
458      *
459      * <p>If {@code s} is {@code null}, then a {@code NullPointerException} is thrown.
460      *
461      * <p>The string must be in a format compatible with that produced by
462      * {@link #toString() BigFraction.toString()}.
463      * The format expects an integer optionally followed by a {@code '/'} character and
464      * and second integer. Leading and trailing spaces are allowed around each numeric part.
465      * Each numeric part is parsed using {@link BigInteger#BigInteger(String)}. The parts
466      * are interpreted as the numerator and optional denominator of the fraction. If absent
467      * the denominator is assumed to be "1".
468      *
469      * <p>Examples of valid strings and the equivalent {@code BigFraction} are shown below:
470      *
471      * <pre>
472      * "0"                 = BigFraction.of(0)
473      * "42"                = BigFraction.of(42)
474      * "0 / 1"             = BigFraction.of(0, 1)
475      * "1 / 3"             = BigFraction.of(1, 3)
476      * "-4 / 13"           = BigFraction.of(-4, 13)</pre>
477      *
478      * <p>Note: The fraction is returned in reduced form and the numerator and denominator
479      * may not match the values in the input string. For this reason the result of
480      * {@code BigFraction.parse(s).toString().equals(s)} may not be {@code true}.
481      *
482      * @param s String representation.
483      * @return an instance.
484      * @throws NullPointerException if the string is null.
485      * @throws NumberFormatException if the string does not contain a parsable fraction.
486      * @see BigInteger#BigInteger(String)
487      * @see #toString()
488      */
489     public static BigFraction parse(String s) {
490         final String stripped = s.replace(",", "");
491         final int slashLoc = stripped.indexOf('/');
492         // if no slash, parse as single number
493         if (slashLoc == -1) {
494             return of(new BigInteger(stripped.trim()));
495         }
496         final BigInteger num = new BigInteger(stripped.substring(0, slashLoc).trim());
497         final BigInteger denom = new BigInteger(stripped.substring(slashLoc + 1).trim());
498         return of(num, denom);
499     }
500 
501     @Override
502     public BigFraction zero() {
503         return ZERO;
504     }
505 
506     /**
507      * {@inheritDoc}
508      *
509      * @since 1.2
510      */
511     @Override
512     public boolean isZero() {
513         return numerator.signum() == 0;
514     }
515 
516     @Override
517     public BigFraction one() {
518         return ONE;
519     }
520 
521     /**
522      * {@inheritDoc}
523      *
524      * @since 1.2
525      */
526     @Override
527     public boolean isOne() {
528         return numerator.equals(denominator);
529     }
530 
531     /**
532      * Access the numerator as a {@code BigInteger}.
533      *
534      * @return the numerator as a {@code BigInteger}.
535      */
536     public BigInteger getNumerator() {
537         return numerator;
538     }
539 
540     /**
541      * Access the numerator as an {@code int}.
542      *
543      * @return the numerator as an {@code int}.
544      */
545     public int getNumeratorAsInt() {
546         return numerator.intValue();
547     }
548 
549     /**
550      * Access the numerator as a {@code long}.
551      *
552      * @return the numerator as a {@code long}.
553      */
554     public long getNumeratorAsLong() {
555         return numerator.longValue();
556     }
557 
558     /**
559      * Access the denominator as a {@code BigInteger}.
560      *
561      * @return the denominator as a {@code BigInteger}.
562      */
563     public BigInteger getDenominator() {
564         return denominator;
565     }
566 
567     /**
568      * Access the denominator as an {@code int}.
569      *
570      * @return the denominator as an {@code int}.
571      */
572     public int getDenominatorAsInt() {
573         return denominator.intValue();
574     }
575 
576     /**
577      * Access the denominator as a {@code long}.
578      *
579      * @return the denominator as a {@code long}.
580      */
581     public long getDenominatorAsLong() {
582         return denominator.longValue();
583     }
584 
585     /**
586      * Retrieves the sign of this fraction.
587      *
588      * @return -1 if the value is strictly negative, 1 if it is strictly
589      * positive, 0 if it is 0.
590      */
591     public int signum() {
592         return numerator.signum() * denominator.signum();
593     }
594 
595     /**
596      * Returns the absolute value of this fraction.
597      *
598      * @return the absolute value.
599      */
600     public BigFraction abs() {
601         return signum() >= 0 ?
602             this :
603             negate();
604     }
605 
606     @Override
607     public BigFraction negate() {
608         return new BigFraction(numerator.negate(), denominator);
609     }
610 
611     /**
612      * {@inheritDoc}
613      *
614      * <p>Raises an exception if the fraction is equal to zero.
615      *
616      * @throws ArithmeticException if the current numerator is {@code zero}
617      */
618     @Override
619     public BigFraction reciprocal() {
620         return new BigFraction(denominator, numerator);
621     }
622 
623     /**
624      * Returns the {@code double} value closest to this fraction.
625      *
626      * @return the fraction as a {@code double}.
627      */
628     @Override
629     public double doubleValue() {
630         return Double.longBitsToDouble(toFloatingPointBits(11, 52));
631     }
632 
633     /**
634      * Returns the {@code float} value closest to this fraction.
635      *
636      * @return the fraction as a {@code double}.
637      */
638     @Override
639     public float floatValue() {
640         return Float.intBitsToFloat((int) toFloatingPointBits(8, 23));
641     }
642 
643     /**
644      * Returns the whole number part of the fraction.
645      *
646      * @return the largest {@code int} value that is not larger than this fraction.
647      */
648     @Override
649     public int intValue() {
650         return numerator.divide(denominator).intValue();
651     }
652 
653     /**
654      * Returns the whole number part of the fraction.
655      *
656      * @return the largest {@code long} value that is not larger than this fraction.
657      */
658     @Override
659     public long longValue() {
660         return numerator.divide(denominator).longValue();
661     }
662 
663     /**
664      * Returns the {@code BigDecimal} representation of this fraction.
665      * This calculates the fraction as numerator divided by denominator.
666      *
667      * @return the fraction as a {@code BigDecimal}.
668      * @throws ArithmeticException
669      *             if the exact quotient does not have a terminating decimal
670      *             expansion.
671      * @see BigDecimal
672      */
673     public BigDecimal bigDecimalValue() {
674         return new BigDecimal(numerator).divide(new BigDecimal(denominator));
675     }
676 
677     /**
678      * Returns the {@code BigDecimal} representation of this fraction.
679      * This calculates the fraction as numerator divided by denominator
680      * following the passed rounding mode.
681      *
682      * @param roundingMode Rounding mode to apply.
683      * @return the fraction as a {@code BigDecimal}.
684      * @see BigDecimal
685      */
686     public BigDecimal bigDecimalValue(RoundingMode roundingMode) {
687         return new BigDecimal(numerator).divide(new BigDecimal(denominator), roundingMode);
688     }
689 
690     /**
691      * Returns the {@code BigDecimal} representation of this fraction.
692      * This calculates the fraction as numerator divided by denominator
693      * following the passed scale and rounding mode.
694      *
695      * @param scale
696      *            scale of the {@code BigDecimal} quotient to be returned.
697      *            see {@link BigDecimal} for more information.
698      * @param roundingMode Rounding mode to apply.
699      * @return the fraction as a {@code BigDecimal}.
700      * @throws ArithmeticException if {@code roundingMode} == {@link RoundingMode#UNNECESSARY} and
701      *      the specified scale is insufficient to represent the result of the division exactly.
702      * @see BigDecimal
703      */
704     public BigDecimal bigDecimalValue(final int scale, RoundingMode roundingMode) {
705         return new BigDecimal(numerator).divide(new BigDecimal(denominator), scale, roundingMode);
706     }
707 
708     /**
709      * Adds the specified {@code value} to this fraction, returning
710      * the result in reduced form.
711      *
712      * @param value Value to add.
713      * @return {@code this + value}.
714      */
715     public BigFraction add(final int value) {
716         return add(BigInteger.valueOf(value));
717     }
718 
719     /**
720      * Adds the specified {@code value} to this fraction, returning
721      * the result in reduced form.
722      *
723      * @param value Value to add.
724      * @return {@code this + value}.
725      */
726     public BigFraction add(final long value) {
727         return add(BigInteger.valueOf(value));
728     }
729 
730     /**
731      * Adds the specified {@code value} to this fraction, returning
732      * the result in reduced form.
733      *
734      * @param value Value to add.
735      * @return {@code this + value}.
736      */
737     public BigFraction add(final BigInteger value) {
738         if (value.signum() == 0) {
739             return this;
740         }
741         if (isZero()) {
742             return of(value);
743         }
744 
745         return of(numerator.add(denominator.multiply(value)), denominator);
746     }
747 
748     /**
749      * Adds the specified {@code value} to this fraction, returning
750      * the result in reduced form.
751      *
752      * @param value Value to add.
753      * @return {@code this + value}.
754      */
755     @Override
756     public BigFraction add(final BigFraction value) {
757         if (value.isZero()) {
758             return this;
759         }
760         if (isZero()) {
761             return value;
762         }
763 
764         final BigInteger num;
765         final BigInteger den;
766 
767         if (denominator.equals(value.denominator)) {
768             num = numerator.add(value.numerator);
769             den = denominator;
770         } else {
771             num = (numerator.multiply(value.denominator)).add((value.numerator).multiply(denominator));
772             den = denominator.multiply(value.denominator);
773         }
774 
775         if (num.signum() == 0) {
776             return ZERO;
777         }
778 
779         return new BigFraction(num, den);
780     }
781 
782     /**
783      * Subtracts the specified {@code value} from this fraction, returning
784      * the result in reduced form.
785      *
786      * @param value Value to subtract.
787      * @return {@code this - value}.
788      */
789     public BigFraction subtract(final int value) {
790         return subtract(BigInteger.valueOf(value));
791     }
792 
793     /**
794      * Subtracts the specified {@code value} from this fraction, returning
795      * the result in reduced form.
796      *
797      * @param value Value to subtract.
798      * @return {@code this - value}.
799      */
800     public BigFraction subtract(final long value) {
801         return subtract(BigInteger.valueOf(value));
802     }
803 
804     /**
805      * Subtracts the specified {@code value} from this fraction, returning
806      * the result in reduced form.
807      *
808      * @param value Value to subtract.
809      * @return {@code this - value}.
810      */
811     public BigFraction subtract(final BigInteger value) {
812         if (value.signum() == 0) {
813             return this;
814         }
815         if (isZero()) {
816             return of(value.negate());
817         }
818 
819         return of(numerator.subtract(denominator.multiply(value)), denominator);
820     }
821 
822     /**
823      * Subtracts the specified {@code value} from this fraction, returning
824      * the result in reduced form.
825      *
826      * @param value Value to subtract.
827      * @return {@code this - value}.
828      */
829     @Override
830     public BigFraction subtract(final BigFraction value) {
831         if (value.isZero()) {
832             return this;
833         }
834         if (isZero()) {
835             return value.negate();
836         }
837 
838         final BigInteger num;
839         final BigInteger den;
840         if (denominator.equals(value.denominator)) {
841             num = numerator.subtract(value.numerator);
842             den = denominator;
843         } else {
844             num = (numerator.multiply(value.denominator)).subtract((value.numerator).multiply(denominator));
845             den = denominator.multiply(value.denominator);
846         }
847 
848         if (num.signum() == 0) {
849             return ZERO;
850         }
851 
852         return new BigFraction(num, den);
853     }
854 
855     /**
856      * Multiply this fraction by the passed {@code value}, returning
857      * the result in reduced form.
858      *
859      * @param value Value to multiply by.
860      * @return {@code this * value}.
861      */
862     @Override
863     public BigFraction multiply(final int value) {
864         if (value == 0 || isZero()) {
865             return ZERO;
866         }
867 
868         return multiply(BigInteger.valueOf(value));
869     }
870 
871     /**
872      * Multiply this fraction by the passed {@code value}, returning
873      * the result in reduced form.
874      *
875      * @param value Value to multiply by.
876      * @return {@code this * value}.
877      */
878     public BigFraction multiply(final long value) {
879         if (value == 0 || isZero()) {
880             return ZERO;
881         }
882 
883         return multiply(BigInteger.valueOf(value));
884     }
885 
886     /**
887      * Multiply this fraction by the passed {@code value}, returning
888      * the result in reduced form.
889      *
890      * @param value Value to multiply by.
891      * @return {@code this * value}.
892      */
893     public BigFraction multiply(final BigInteger value) {
894         if (value.signum() == 0 || isZero()) {
895             return ZERO;
896         }
897         return new BigFraction(value.multiply(numerator), denominator);
898     }
899 
900     /**
901      * Multiply this fraction by the passed {@code value}, returning
902      * the result in reduced form.
903      *
904      * @param value Value to multiply by.
905      * @return {@code this * value}.
906      */
907     @Override
908     public BigFraction multiply(final BigFraction value) {
909         if (value.isZero() || isZero()) {
910             return ZERO;
911         }
912         return new BigFraction(numerator.multiply(value.numerator),
913                                denominator.multiply(value.denominator));
914     }
915 
916     /**
917      * Divide this fraction by the passed {@code value}, returning
918      * the result in reduced form.
919      *
920      * @param value Value to divide by
921      * @return {@code this / value}.
922      * @throws ArithmeticException if the value to divide by is zero
923      */
924     public BigFraction divide(final int value) {
925         return divide(BigInteger.valueOf(value));
926     }
927 
928     /**
929      * Divide this fraction by the passed {@code value}, returning
930      * the result in reduced form.
931      *
932      * @param value Value to divide by
933      * @return {@code this / value}.
934      * @throws ArithmeticException if the value to divide by is zero
935      */
936     public BigFraction divide(final long value) {
937         return divide(BigInteger.valueOf(value));
938     }
939 
940     /**
941      * Divide this fraction by the passed {@code value}, returning
942      * the result in reduced form.
943      *
944      * @param value Value to divide by
945      * @return {@code this / value}.
946      * @throws ArithmeticException if the value to divide by is zero
947      */
948     public BigFraction divide(final BigInteger value) {
949         if (value.signum() == 0) {
950             throw new FractionException(FractionException.ERROR_DIVIDE_BY_ZERO);
951         }
952         if (isZero()) {
953             return ZERO;
954         }
955         return new BigFraction(numerator, denominator.multiply(value));
956     }
957 
958     /**
959      * Divide this fraction by the passed {@code value}, returning
960      * the result in reduced form.
961      *
962      * @param value Value to divide by
963      * @return {@code this / value}.
964      * @throws ArithmeticException if the value to divide by is zero
965      */
966     @Override
967     public BigFraction divide(final BigFraction value) {
968         if (value.isZero()) {
969             throw new FractionException(FractionException.ERROR_DIVIDE_BY_ZERO);
970         }
971         if (isZero()) {
972             return ZERO;
973         }
974         // Multiply by reciprocal
975         return new BigFraction(numerator.multiply(value.denominator),
976                                denominator.multiply(value.numerator));
977     }
978 
979     /**
980      * Returns a {@code BigFraction} whose value is
981      * <code>this<sup>exponent</sup></code>, returning the result in reduced form.
982      *
983      * @param exponent exponent to which this {@code BigFraction} is to be raised.
984      * @return <code>this<sup>exponent</sup></code>.
985      * @throws ArithmeticException if the intermediate result would overflow.
986      */
987     @Override
988     public BigFraction pow(final int exponent) {
989         if (exponent == 1) {
990             return this;
991         }
992         if (exponent == 0) {
993             return ONE;
994         }
995         if (isZero()) {
996             if (exponent < 0) {
997                 throw new FractionException(FractionException.ERROR_ZERO_DENOMINATOR);
998             }
999             return ZERO;
1000         }
1001         if (exponent > 0) {
1002             return new BigFraction(numerator.pow(exponent),
1003                                    denominator.pow(exponent));
1004         }
1005         if (exponent == -1) {
1006             return this.reciprocal();
1007         }
1008         if (exponent == Integer.MIN_VALUE) {
1009             // MIN_VALUE can't be negated
1010             return new BigFraction(denominator.pow(Integer.MAX_VALUE).multiply(denominator),
1011                                    numerator.pow(Integer.MAX_VALUE).multiply(numerator));
1012         }
1013         // Note: Raise the BigIntegers to the power and then reduce.
1014         // The supported range for BigInteger is currently
1015         // +/-2^(Integer.MAX_VALUE) exclusive thus larger
1016         // exponents (long, BigInteger) are currently not supported.
1017         return new BigFraction(denominator.pow(-exponent),
1018                                numerator.pow(-exponent));
1019     }
1020 
1021     /**
1022      * Returns the {@code String} representing this fraction.
1023      * Uses:
1024      * <ul>
1025      *  <li>{@code "0"} if {@code numerator} is zero.</li>
1026      *  <li>{@code "numerator"} if {@code denominator} is one.</li>
1027      *  <li>{@code "numerator / denominator"} for all other cases.</li>
1028      * </ul>
1029      *
1030      * @return a string representation of the fraction.
1031      */
1032     @Override
1033     public String toString() {
1034         final String str;
1035         if (isZero()) {
1036             str = "0";
1037         } else if (BigInteger.ONE.equals(denominator)) {
1038             str = numerator.toString();
1039         } else {
1040             str = numerator + " / " + denominator;
1041         }
1042         return str;
1043     }
1044 
1045     /**
1046      * Compares this object with the specified object for order using the signed magnitude.
1047      *
1048      * @param other {@inheritDoc}
1049      * @return {@inheritDoc}
1050      */
1051     @Override
1052     public int compareTo(final BigFraction other) {
1053         final int lhsSigNum = signum();
1054         final int rhsSigNum = other.signum();
1055 
1056         if (lhsSigNum != rhsSigNum) {
1057             return (lhsSigNum > rhsSigNum) ? 1 : -1;
1058         }
1059         // Same sign.
1060         // Avoid a multiply if both fractions are zero
1061         if (lhsSigNum == 0) {
1062             return 0;
1063         }
1064         // Compare absolute magnitude
1065         final BigInteger nOd = numerator.abs().multiply(other.denominator.abs());
1066         final BigInteger dOn = denominator.abs().multiply(other.numerator.abs());
1067         return lhsSigNum > 0 ?
1068             nOd.compareTo(dOn) :
1069             dOn.compareTo(nOd);
1070     }
1071 
1072     /**
1073      * Test for equality with another object. If the other object is a {@code Fraction} then a
1074      * comparison is made of the sign and magnitude; otherwise {@code false} is returned.
1075      *
1076      * @param other {@inheritDoc}
1077      * @return {@inheritDoc}
1078      */
1079     @Override
1080     public boolean equals(final Object other) {
1081         if (this == other) {
1082             return true;
1083         }
1084 
1085         if (other instanceof BigFraction) {
1086             // Since fractions are always in lowest terms, numerators and
1087             // denominators can be compared directly for equality.
1088             final BigFraction rhs = (BigFraction) other;
1089             if (signum() == rhs.signum()) {
1090                 return numerator.abs().equals(rhs.numerator.abs()) &&
1091                        denominator.abs().equals(rhs.denominator.abs());
1092             }
1093         }
1094 
1095         return false;
1096     }
1097 
1098     @Override
1099     public int hashCode() {
1100         // Incorporate the sign and absolute values of the numerator and denominator.
1101         // Equivalent to:
1102         // int hash = 1;
1103         // hash = 31 * hash + numerator.abs().hashCode();
1104         // hash = 31 * hash + denominator.abs().hashCode();
1105         // hash = hash * signum()
1106         // Note: BigInteger.hashCode() * BigInteger.signum() == BigInteger.abs().hashCode().
1107         final int numS = numerator.signum();
1108         final int denS = denominator.signum();
1109         return (31 * (31 + numerator.hashCode() * numS) + denominator.hashCode() * denS) * numS * denS;
1110     }
1111 
1112     /**
1113      * Calculates the sign bit, the biased exponent and the significand for a
1114      * binary floating-point representation of this {@code BigFraction}
1115      * according to the IEEE 754 standard, and encodes these values into a {@code long}
1116      * variable. The representative bits are arranged adjacent to each other and
1117      * placed at the low-order end of the returned {@code long} value, with the
1118      * least significant bits used for the significand, the next more
1119      * significant bits for the exponent, and next more significant bit for the
1120      * sign.
1121      *
1122      * <p>Warning: The arguments are not validated.
1123      *
1124      * @param exponentLength the number of bits allowed for the exponent; must be
1125      *                       between 1 and 32 (inclusive), and must not be greater
1126      *                       than {@code 63 - significandLength}
1127      * @param significandLength the number of bits allowed for the significand
1128      *                          (excluding the implicit leading 1-bit in
1129      *                          normalized numbers, e.g. 52 for a double-precision
1130      *                          floating-point number); must be between 1 and
1131      *                          {@code 63 - exponentLength} (inclusive)
1132      * @return the bits of an IEEE 754 binary floating-point representation of
1133      * this fraction encoded in a {@code long}, as described above.
1134      */
1135     private long toFloatingPointBits(int exponentLength, int significandLength) {
1136         // Assume the following conditions:
1137         //assert exponentLength >= 1;
1138         //assert exponentLength <= 32;
1139         //assert significandLength >= 1;
1140         //assert significandLength <= 63 - exponentLength;
1141 
1142         if (isZero()) {
1143             return 0L;
1144         }
1145 
1146         final long sign = (numerator.signum() * denominator.signum()) == -1 ? 1L : 0L;
1147         final BigInteger positiveNumerator = numerator.abs();
1148         final BigInteger positiveDenominator = denominator.abs();
1149 
1150         /*
1151          * The most significant 1-bit of a non-zero number is not explicitly
1152          * stored in the significand of an IEEE 754 normalized binary
1153          * floating-point number, so we need to round the value of this fraction
1154          * to (significandLength + 1) bits. In order to do this, we calculate
1155          * the most significant (significandLength + 2) bits, and then, based on
1156          * the least significant of those bits, find out whether we need to
1157          * round up or down.
1158          *
1159          * First, we'll remove all powers of 2 from the denominator because they
1160          * are not relevant for the significand of the prospective binary
1161          * floating-point value.
1162          */
1163         final int denRightShift = positiveDenominator.getLowestSetBit();
1164         final BigInteger divisor = positiveDenominator.shiftRight(denRightShift);
1165 
1166         /*
1167          * Now, we're going to calculate the (significandLength + 2) most
1168          * significant bits of the fraction's value using integer division. To
1169          * guarantee that the quotient of the division has at least
1170          * (significandLength + 2) bits, the bit length of the dividend must
1171          * exceed that of the divisor by at least that amount.
1172          *
1173          * If the denominator has prime factors other than 2, i.e. if the
1174          * divisor was not reduced to 1, an excess of exactly
1175          * (significandLength + 2) bits is sufficient, because the knowledge
1176          * that the fractional part of the precise quotient's binary
1177          * representation does not terminate is enough information to resolve
1178          * cases where the most significant (significandLength + 2) bits alone
1179          * are not conclusive.
1180          *
1181          * Otherwise, the quotient must be calculated exactly and the bit length
1182          * of the numerator can only be reduced as long as no precision is lost
1183          * in the process (meaning it can have powers of 2 removed, like the
1184          * denominator).
1185          */
1186         int numRightShift = positiveNumerator.bitLength() - divisor.bitLength() - (significandLength + 2);
1187         if (numRightShift > 0 &&
1188             divisor.equals(BigInteger.ONE)) {
1189             numRightShift = Math.min(numRightShift, positiveNumerator.getLowestSetBit());
1190         }
1191         final BigInteger dividend = positiveNumerator.shiftRight(numRightShift);
1192 
1193         final BigInteger quotient = dividend.divide(divisor);
1194 
1195         int quotRightShift = quotient.bitLength() - (significandLength + 1);
1196         long significand = roundAndRightShift(
1197                 quotient,
1198                 quotRightShift,
1199                 !divisor.equals(BigInteger.ONE)
1200         ).longValue();
1201 
1202         /*
1203          * If the significand had to be rounded up, this could have caused the
1204          * bit length of the significand to increase by one.
1205          */
1206         if ((significand & (1L << (significandLength + 1))) != 0) {
1207             significand >>= 1;
1208             quotRightShift++;
1209         }
1210 
1211         /*
1212          * Now comes the exponent. The absolute value of this fraction based on
1213          * the current local variables is:
1214          *
1215          * significand * 2^(numRightShift - denRightShift + quotRightShift)
1216          *
1217          * To get the unbiased exponent for the floating-point value, we need to
1218          * add (significandLength) to the above exponent, because all but the
1219          * most significant bit of the significand will be treated as a
1220          * fractional part. To convert the unbiased exponent to a biased
1221          * exponent, we also need to add the exponent bias.
1222          */
1223         final int exponentBias = (1 << (exponentLength - 1)) - 1;
1224         long exponent = (long) numRightShift - denRightShift + quotRightShift + significandLength + exponentBias;
1225         final long maxExponent = (1L << exponentLength) - 1L; //special exponent for infinities and NaN
1226 
1227         if (exponent >= maxExponent) { //infinity
1228             exponent = maxExponent;
1229             significand = 0L;
1230         } else if (exponent > 0) { //normalized number
1231             significand &= -1L >>> (64 - significandLength); //remove implicit leading 1-bit
1232         } else { //smaller than the smallest normalized number
1233             /*
1234              * We need to round the quotient to fewer than
1235              * (significandLength + 1) bits. This must be done with the original
1236              * quotient and not with the current significand, because the loss
1237              * of precision in the previous rounding might cause a rounding of
1238              * the current significand's value to produce a different result
1239              * than a rounding of the original quotient.
1240              *
1241              * So we find out how many high-order bits from the quotient we can
1242              * transfer into the significand. The absolute value of the fraction
1243              * is:
1244              *
1245              * quotient * 2^(numRightShift - denRightShift)
1246              *
1247              * To get the significand, we need to right shift the quotient so
1248              * that the above exponent becomes (1 - exponentBias - significandLength)
1249              * (the unbiased exponent of a subnormal floating-point number is
1250              * defined as equivalent to the minimum unbiased exponent of a
1251              * normalized floating-point number, and (- significandLength)
1252              * because the significand will be treated as the fractional part).
1253              */
1254             significand = roundAndRightShift(quotient,
1255                                              (1 - exponentBias - significandLength) - (numRightShift - denRightShift),
1256                                              !divisor.equals(BigInteger.ONE)).longValue();
1257             exponent = 0L;
1258 
1259             /*
1260              * Note: It is possible that an otherwise subnormal number will
1261              * round up to the smallest normal number. However, this special
1262              * case does not need to be treated separately, because the
1263              * overflowing highest-order bit of the significand will then simply
1264              * become the lowest-order bit of the exponent, increasing the
1265              * exponent from 0 to 1 and thus establishing the implicity of the
1266              * leading 1-bit.
1267              */
1268         }
1269 
1270         return (sign << (significandLength + exponentLength)) |
1271             (exponent << significandLength) |
1272             significand;
1273     }
1274 
1275     /**
1276      * Rounds an integer to the specified power of two (i.e. the minimum number of
1277      * low-order bits that must be zero) and performs a right-shift by this
1278      * amount. The rounding mode applied is round to nearest, with ties rounding
1279      * to even (meaning the prospective least significant bit must be zero). The
1280      * number can optionally be treated as though it contained at
1281      * least one 0-bit and one 1-bit in its fractional part, to influence the result in cases
1282      * that would otherwise be a tie.
1283      * @param value the number to round and right-shift
1284      * @param bits the power of two to which to round; must be positive
1285      * @param hasFractionalBits whether the number should be treated as though
1286      *                          it contained a non-zero fractional part
1287      * @return a {@code BigInteger} as described above
1288      */
1289     private static BigInteger roundAndRightShift(BigInteger value, int bits, boolean hasFractionalBits) {
1290         // Assumptions:
1291         // assert bits > 0
1292 
1293         BigInteger result = value.shiftRight(bits);
1294         if (value.testBit(bits - 1) &&
1295             (hasFractionalBits ||
1296              value.getLowestSetBit() < bits - 1 ||
1297              value.testBit(bits))) {
1298             result = result.add(BigInteger.ONE); //round up
1299         }
1300 
1301         return result;
1302     }
1303 }