两个64位整数乘法

 coursera斯坦福算法的编程题

用到的知识点:

1、BigInteger  
2、BigDecimal 
3、recursive integer multiplication and/or Karatsuba's algorithm 递归整数乘法或Karatsuba算法。

Karatsuba算法是对递归整数乘法的优化,可以将4次递归调用简化为3次。

public class Multiply_64 {

    public static void main(String[] args) {
        BigInteger bigInteger1 = new BigInteger("3141592653589793238462643383279502884197169399375105820974944592");
        System.out.println(bigInteger1);
        BigInteger bigInteger2 = new BigInteger("2718281828459045235360287471352662497757247093699959574966967627");

        Multiply_64 multiply_64 = new Multiply_64();
        System.out.println(multiply_64.m(bigInteger1, bigInteger2, 64));
    }

    private BigInteger m(BigInteger x, BigInteger y, int n) {
        BigInteger b1;
        BigInteger b3;
        b1 = new BigInteger(new BigDecimal(String.valueOf(Math.pow(10, (double) n))).setScale(0, BigDecimal.ROUND_HALF_UP).toPlainString());
        b3 = new BigInteger(new BigDecimal(String.valueOf(Math.pow(10, (double) n / 2))).setScale(0, BigDecimal.ROUND_HALF_UP).toPlainString());

//        System.out.println(Math.pow(10, (double) n / 2));
//        System.out.println(String.valueOf(Math.pow(10, (double) n / 2)));
        BigInteger a = x.divide(b3);
        System.out.println(a);
        BigInteger b = x.mod(b3);
        BigInteger c = y.divide(b3);
        BigInteger d = y.mod(b3);
//        System.out.println(Math.pow(10, (double) n / 2));

        if (n < 2) {
            return new BigInteger("0");
        } else if (n == 2) {

            BigInteger b2 = a.multiply(c);//a*c

            BigInteger b4 = (((a.add(b)).multiply(c.add(d))).subtract(a.multiply(c))).subtract(b.multiply(d));//(a + b) * (c + d) - a * c - b * d
            BigInteger b5 = b.multiply(d);//b*d
            return ((b1.multiply(b2)).add(b3.multiply(b4))).add(b5);//((long) Math.pow(10, (double) n)) * a * c + ((long) Math.pow(10, (double) n / 2)) * ((a + b) * (c + d) - a * c - b * d) + b * d;
        } else {
            BigInteger part1 = b1.multiply(m(a, c, n / 2));
            BigInteger part2 = b3.multiply(m(a, d, n / 2).add(m(b, c, n / 2)));
            BigInteger part3 = m(b, d, n / 2);
            return part1.add(part2.add(part3));
            //((long) Math.pow(10, (double) n)) * m(a, c, n / 2) + ((long) Math.pow(10, (double) n / 2)) * (m(a, d, n / 2) + m(b, c, n / 2)) + m(b, d, n / 2);
        }
    }
}

java.Math.BigInteger:

BigInteger b1 = new BigInteger("123");//输入类型为数字字符串
BigInteger b2 = new BigInteger("456");
b1.add(b2);//b1+b2,返回BigInteger对象
b1.substact(b2);//b1-b2
b1.mutiply(b2);
b1.divide(b2);

java.Math.BigDecimal:

需要对BigDecimal进行截断和四舍五入使用setScale():

 public static void main(String[] args)
    {
        BigDecimal a = new BigDecimal("4.5635");

        a = a.setScale(3, RoundingMode.HALF_UP);    //保留3位小数,且四舍五入
        System.out.println(a);
    }

本算法仍使用了分治算法,4次递归调用。尝试采用Karatsuba算法进行优化,但两个数的和的位数会发生变化,需要下一步解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vivado软件中,可以通过使用Verilog或VHDL语言来设计四位整数乘法的仿真。 首先,我们需要定义输入和输出信号。对于四位整数乘法,我们需要两个4位的输入信号,分别表示乘法两个操作。我们还需要一个8位的输出信号,用于存储乘法运算的结果。 接下来,我们可以使用Vivado提供的乘法器原语或者使用组合逻辑来实现四位整数乘法。如果使用乘法器原语,需要连接输入和输出信号到乘法器的端口,并将乘法器的输出连接到输出信号。如果使用组合逻辑,可以使用适当的门电路和据流程来实现乘法运算,并将结果存储到输出信号。 完成设计后,我们可以使用Vivado的仿真功能来验证乘法器的功能。在Vivado中,可以创建一个新的仿真文件,并使用仿真向导将设计文件和仿真文件相连。然后,我们可以设置输入信号的初始值,并运行仿真以观察输出信号的变化。通过检查输出信号的值,我们可以验证乘法器的正确性。 在仿真过程中,可以使用Vivado提供的调试工具来查看信号的波形图和时序图,以便更详细地分析乘法器的运行情况。此外,在仿真过程中,可以通过更改输入信号的值,来测试乘法器在不同情况下的性能和正确性。 总之,通过在Vivado中设计乘法器的仿真,我们可以验证乘法器的功能和正确性,以确保其在实际应用中的可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值