Review Request: BigInteger patch for efficient multiplication and division (#4837946)
Weijun Wang
weijun.wang at oracle.com
Thu May 9 09:45:03 UTC 2013
Out of curiosity (my major was math back in university), I take a look
at BigInteger.java.phase1:
First you have:
/**
* The threshold value for using 3-way Toom-Cook multiplication.
* If the number of ints in both mag arrays are greater than this
number,
* then Toom-Cook multiplication will be used. This value is found
* experimentally to work well.
*/
private static final int TOOM_COOK_THRESHOLD = 75;
but then:
public BigInteger multiply(BigInteger val) {
if (val.signum == 0 || signum == 0)
return ZERO;
int xlen = mag.length;
int ylen = val.mag.length;
if ((xlen < KARATSUBA_THRESHOLD) || (ylen < KARATSUBA_THRESHOLD))
{
....
}
else
if ((xlen < TOOM_COOK_THRESHOLD) && (ylen <
TOOM_COOK_THRESHOLD))
return multiplyKaratsuba(this, val);
else
return multiplyToomCook3(this, val);
}
So, is it *both* numbers or *any* of them great than the constant that
the Toom-Cook algotithm will be used?
Thanks
Max
On 5/9/13 3:11 PM, Alan Eliasen wrote:
> On 05/07/2013 12:53 PM, Brian Burkhalter wrote:
>> To recapitulate in one place, I think we agree on the following sequence:
>>
>> Phase 1: Faster multiplication and exponentiation of large integers
>> * Karatsuba and Toom-Cook multiplication and squaring; revised pow() function.
>> * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4837946 (update synopsis/description)
>> * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4646474
>>
>> Phase 2: Faster string conversion of large integers
>> * Recursive Schoenhage toString() routines.
>> * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4641897
>>
>> Phase 3: Faster division of large integers
>> * Burnickel-Ziegler division routines.
>> * Issue to be filed.
>>
>> Phase 4: Faster multiplication and division of very large integers
>> * Barrett division and Schoenhage-Strassen multiplication.
>> * Issue to be filed.
>
> Okay, I've created a set of patches that implement these 4 phases.
> (They're not actually patches, but the entire source file for each
> phase, as Brian requested.)
>
> These are available at:
> http://futureboy.us/temp/BigIntegerPatch.zip
>
> In this zipfile, the file(s) to use for each phase are marked with
> the ".phaseX" suffix. If there is no change in a file for a given
> phase, there is no file included for that phase, but you should make
> sure that you are still using the BigDecimal and MutableBigInteger
> file(s) applied in the previous phases.
>
> So, to be very clear, the files that make up each phase are:
>
> Phase 1:
> BigInteger.java.phase1
> BigDecimal.java.phase1 (since BigInteger.pow is accelerated, the
> workaround in BigDecimal is removed.)
>
> Phase 2:
> BigInteger.java.phase2
>
> Phase 3:
> BigInteger.java.phase3
> MutableBigInteger.java.phase3 (to use Burnikel-Ziegler divide)
>
> Phase 4:
> BigInteger.java.phase4
>
> For your reference, the final versions of each file are contained
> with the ".final" suffix. These will be identical to previous phases
> applied, and you don't have to apply them, but if someone wants to
> quickly drop in the best improvements to their own JDK, just use the 3
> files with the ".final" suffix.
>
> Let me know if you have any issues with these.
>
> Tim and Brian, you might decide amongst yourselves who wants to file
> the issues for phases 3 and 4. I don't know if Brian has any magical
> powers to make the issues skip the QA process.
>
More information about the core-libs-dev
mailing list