java大数运算详解【其二】大数乘法

14 篇文章 0 订阅
10 篇文章 0 订阅

目录

java大数运算详解【其一】大数加减法

java大数运算详解【其二】大数乘法

java大数运算详解【其三】大数乘法之平方算法之按位二次展开式算法

java大数运算详解【其四】大数乘法之平方算法之Karatsuba平方算法

java大数运算详解【其五】大数乘法之平方算法之ToomCook3平方算法

java大数运算详解【其六】大数乘法之单位乘法和经典乘法

java大数运算详解【其七】大数乘法之Karatsuba乘法和ToomCook3乘法

java大数运算详解【其八】大数除法

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自乘
            }
        }
    }

平方算法的子实现接下来继续讲。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值