### changeset 9125:4f07e4b5bf7d

4891331: BigInteger a.multiply(a) should use squaring code Summary: 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, coffeys
author bpb Wed, 05 Feb 2014 15:02:59 -0800 20620baf438e 6c587189a483 src/share/classes/java/math/BigInteger.java 1 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
```--- a/src/share/classes/java/math/BigInteger.java	Tue Feb 04 18:45:20 2014 -0800
+++ b/src/share/classes/java/math/BigInteger.java	Wed Feb 05 15:02:59 2014 -0800
@@ -268,7 +268,15 @@
*/
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 @@
/**
* 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 @@
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)) {```