From 997e4bbc8b8f32eb7bc3e3e8e114454bb7c3fa12 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Fri, 13 Dec 2013 16:15:58 -0800 Subject: [PATCH] 4891331: BigInteger a.multiply(a) should use squaring code Change multiply(BigInteger a) to return square() if a == this and the number of ints in the magnitude is over a threshold. Reviewed-by: darcy, shade --- .../share/classes/java/math/BigInteger.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/classes/java/math/BigInteger.java b/jdk/src/share/classes/java/math/BigInteger.java index 79291ee34d2..6fa5d4214f1 100644 --- a/jdk/src/share/classes/java/math/BigInteger.java +++ b/jdk/src/share/classes/java/math/BigInteger.java @@ -268,7 +268,15 @@ public class BigInteger extends Number implements Comparable { */ private static final int SCHOENHAGE_BASE_CONVERSION_THRESHOLD = 20; - //Constructors + /** + * The threshold value for using squaring code to perform multiplication + * of a {@code BigInteger} instance by itself. If the number of ints in + * the number are larger than this value, {@code multiply(this)} will + * return {@code square()}. + */ + private static final int MULTIPLY_SQUARE_THRESHOLD = 20; + + // Constructors /** * Translates a byte array containing the two's-complement binary @@ -1458,6 +1466,9 @@ public class BigInteger extends Number implements Comparable { /** * Returns a BigInteger whose value is {@code (this * val)}. * + * @implNote An implementation may offer better algorithmic + * performance when {@code val == this}. + * * @param val value to be multiplied by this BigInteger. * @return {@code this * val} */ @@ -1466,6 +1477,11 @@ public class BigInteger extends Number implements Comparable { return ZERO; int xlen = mag.length; + + if (val == this && xlen > MULTIPLY_SQUARE_THRESHOLD) { + return square(); + } + int ylen = val.mag.length; if ((xlen < KARATSUBA_THRESHOLD) || (ylen < KARATSUBA_THRESHOLD)) {