Review Request: BigInteger patch for efficient multiplication and division (#4837946)
Brian Burkhalter
brian.burkhalter at oracle.com
Thu May 9 21:02:31 UTC 2013
Hi Max,
On May 9, 2013, at 2:45 AM, Weijun Wang wrote:
> Out of curiosity (my major was math back in university), I take a look at BigInteger.java.phase1:
All useful comments are welcome, for whatever reason!
> 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?
Indeed the javadoc and the code appear to be contradictory. If the comments are accurate then one would expect the logic to be
if ((xlen < TOOM_COOK_THRESHOLD) || (ylen < TOOM_COOK_THRESHOLD))
return multiplyKaratsuba(this, val);
I can understand in the case of Karatsuba versus the base algorithm why one would require both numbers to be below the threshold, but I don't know enough about the Toom-3 algorithm yet to comment on your question. I imagine Alan or Tim might have something more useful to say on this point.
Thanks,
Brian
More information about the core-libs-dev
mailing list