目录
java大数运算详解【其三】大数乘法之平方算法之按位二次展开式算法
java大数运算详解【其四】大数乘法之平方算法之Karatsuba平方算法
java大数运算详解【其五】大数乘法之平方算法之ToomCook3平方算法
java大数运算详解【其七】大数乘法之Karatsuba乘法和ToomCook3乘法
java大数运算详解【其九】大数除法之试商法(Knuth除法)核心算法
java大数运算详解【其十】大数除法之Burnikel-Ziegler除法算法
这只是大数乘法的一部分,其支部此处不涉及,在下节再讲。
三、大数乘法
/**
* 返回值为{@code (this * val)}的大型整数。
*
* @implNote 当{@code val == this}时,实现可以提供更好的算法性能。
*
* @param 乘数。
* @return {@code this * val}.
*/
public BigInteger multiply(BigInteger val) {
if (val.signum == 0 || signum == 0)
return ZERO;
int xlen = mag.length;
if (val == this && xlen > MULTIPLY_SQUARE_THRESHOLD) {//MULTIPLY_SQUARE_THRESHOLD值20
return square();//平方
}
int ylen = val.mag.length;
if ((xlen < KARATSUBA_THRESHOLD) || (ylen < KARATSUBA_THRESHOLD)) {//KARATSUBA_THRESHOLD值80
int resultSign = signum == val.signum ? 1 : -1;
if (val.mag.length == 1) {
return multiplyByInt(mag,val.mag[0], resultSign);//乘以32位整数
}
if (mag.length == 1) {
return multiplyByInt(val.mag,mag[0], resultSign);//乘以32位整数
}
int[] result = multiplyToLen(mag, xlen,
val.mag, ylen, null);//mag数组相乘
result = trustedStripLeadingZeroInts(result);
return new BigInteger(result, resultSign);
} else {
if ((xlen < TOOM_COOK_THRESHOLD) && (ylen < TOOM_COOK_THRESHOLD)) {//TOOM_COOK_THRESHOLD值240
return multiplyKaratsuba(this, val);//Karatsuba乘法
} else {
return multiplyToomCook3(this, val);//ToomCook3乘法
}
}
}
1、平方算法
/**
* 返回值为{@code (this*this)}的大型整数。
*
* @return {@code this*this}.
*/
private BigInteger square() {
if (signum == 0) {
return ZERO;
}
int len = mag.length;
if (len < KARATSUBA_SQUARE_THRESHOLD) {//KARATSUBA_SQUARE_THRESHOLD值128
int[] z = squareToLen(mag, len, null);//mag数组自乘
return new BigInteger(trustedStripLeadingZeroInts(z), 1);
} else {
if (len < TOOM_COOK_SQUARE_THRESHOLD) {//TOOM_COOK_SQUARE_THRESHOLD值216
return squareKaratsuba();//Karatsuba自乘
} else {
return squareToomCook3();//ToomCook3自乘
}
}
}
平方算法的子实现接下来继续讲。