首发于算了吧
Day 10: Karatsuba乘法

Day 10: Karatsuba乘法

乘法是我们从小学就开始学的基本运算之一,据说9*9乘法表还被推广到了英国在小学教育中进行普及。对于计算机来说,两个数相乘是最普通的操作之一,但是当两个乘数规模逐渐扩大时,计算其乘积的算法复杂度也会随之急剧增大。今天为大家介绍的就是如何在大整数之间进行相乘计算。


Karatsuba乘法

在介绍今天的算法之前,我们先来回顾一下传统的乘法是怎样的步骤。对两个大整数X和Y(分别为n位)进行相乘,已知X=AB(这里的AB不是A和B的乘积,而是将X分割成了前后位数相等的AB两个部分),Y=CD(同理),则X乘Y可由以下方法求得:



根据主定理(Master theorem)可得,普通两个n位整数相乘的算法复杂度是O(n²),通过观察我们可以发现中间标红项AD+BC就占用了两个O(n²/4)乘法和一个O(n)加法,我们能否通过某种办法来降低其算法复杂度呢?

Karatsuba的想法是这样的:

AD+BC = AC+AD+BC+BD-AC-BD = (A+B)(C+D)-AC-BD

在这样的组合中因为AC,BD已知,我们发现仅仅通过一个O(n²/4)乘法和四个O(n)加(减)法就可以得到AD+BC的值,从而使整体的算法复杂度从O(n²)降低到了O(n^log2(3))约为O(n^1.585)(证明过程参考主定理)。看似很小的改变,但是当n足够大时,这点微小的改变将是惊人的。在这里其实体现的是分治的思想,这在算法设计中是十分重要的。


程序思路

我们给出Karatsuba乘法的具体求解步骤:

1、分解。将大整数X、Y(分别为n,m位)分别为A、B、C、D。值得注意的是如果位数n或m为奇数,则A为前n/2+1或m/2+1位,n/2或m/2向下取整;



2、计算。分别计算AC、BD,并且利用AC和BD计算AD+BC;

3、求解。根据以下公式求得X乘Y的值。



我们以98765乘4321作为示例。





问题

请大家自行研读主定理内容并完成推导。


获取今日算法和问题答案,请在公众号(Gamedge)内回复“Karatsuba乘法”。如若有更为精妙的解决方法,欢迎与我们进行讨论。

编辑于 2018-08-18

文章被以下专栏收录