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 }