大数的相乘Karatsuba算法

Karatsuba算法主要应用于两个大数的相乘,原理是将大数分成两段后变成较小的数位,然后做3次乘法,并附带少量的加法操作和移位操作。
现有两个大数,x,y。
首先将x,y分别拆开成为两部分,可得a,b,c,d。他们的关系如下:
x = a * 10m + b;
y = c * 10m + d。其中m为正整数,m < n,且a,c 小于 10m。
那么

xy = (a * 10^m + b)(c * 10^m + d)
xy = (10^m * a + b)(10^m * c + d)
xy = 10^2m * ac + 10^m * ad + 10^m * bc + bd
xy = 10^2m * ac + 10^m * (ad + bc) + bd
设:
z0 = ac
z1 = ad + bc
z2 = bd
利用(a + b)(c + d) = ac + ad + dc + bd 可以求得 z1
z1 = ad + bc = (a + b)(c + d) - ac - bd
最终
xy = 10^2m * ac + 10^m * ((a + b)(c + d) - ac - bd) + bd

实例展示
设x = 12345,y=6789,令m=3。那么有:
12345 = 12 * 1000 + 345;
6789 = 6 * 1000 + 789。
下面计算:
z2 = 12 * 6 = 72;
z0 = 345 * 789 = 272205;
z1 = (12 + 345) * (6 + 789) - z2 - z0 = 11538。
然后我们按照移位公式(xy = z2 * 10^(2m) + z1 * 10^(m) + z0)可得:
xy = 72 * 1000000 + 11538 * 1000 + 272205 = 83810205。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值