摘要gydF4y2Ba
Karatsuba方法是首次发表的加速两个数字[1]乘法的尝试。它的复杂性是众所周知的gydF4y2Ba.目前已有改进的数学算法在复杂度上超过了该算法[2-7]。gydF4y2Ba
虽然似乎不可能改进Karatsuba技术的基本机制,我们也演示了为什么它是这类技术中最有效的,但有可能改进它对特定十分位数范围的实现。本文提出了一种利用额外的记忆来补充原来的方法来加快卡拉苏巴技术的实施的方法。虽然这种方法在概念上类似于用于加速矩阵乘法的“四俄罗斯法”技术,但它将这一概念应用于不同的领域。gydF4y2Ba
Karatsuba算法[1,2],一个gydF4y2BaO(n×log n×log log n)[3-7]和O(n×log n)[8]。然而,算法的简便性允许易于实现的改进,可以减少乘法,并辅以查找。gydF4y2Ba
关键词gydF4y2Ba
Karatsuba算法,四种俄语方法,矩阵乘法,复杂性。gydF4y2Ba
Karatsuba算法gydF4y2Ba
为简单起见,请考虑将两个n位数字x和y乘以编写为gydF4y2Ba
在哪里简单,我们使用gydF4y2Ba,gydF4y2Ba并在基地10工作。产品可以简化到gydF4y2Ba
因此,可以将n位数字的乘积减少到三个独立的M-digit(和偶尔M + 1位)数字的乘法,而不是四个M位数字。请注意,在复杂性计算中忽略乘法10,因为它们可以在添加之前减少到小数点班次。此外,作为一般原则,复杂性计算忽略了添加的数量,因为它们是复杂性的亚主导地位。单独乘法数量乘以这两个数字的数量级(“复杂性”)可以减少到关系gydF4y2Ba
Karatsuba技术有时被称为“逐个征服”方法。gydF4y2Ba
计算上述复杂性的另一种方法如下所示。在每一步,开始的数字(最初n = 2gydF4y2Ba年代gydF4y2Ba数字长)被分成两个数字的一半。在s步骤之后,很容易看到需要执行个位数的3s乘法。这个数,需要乘法的次数,可以写成gydF4y2Ba;因此产生了上述复杂性的结果。这个计算是精确的(如上所述),对于一个以2为幂的数字作为位数。gydF4y2Ba
改进后的版本gydF4y2Ba
我们将Karatsuba分治算法推广如下,并写入(以b为基数)gydF4y2Ba
正如可以快速核对的,每一个数字xgydF4y2Ba0gydF4y2Ba, ..., xgydF4y2BaNgydF4y2BaygydF4y2Ba0gydF4y2Ba, ...ygydF4y2BaNgydF4y2Ba(N + 1)m = N,其中N是x和y的总位数。gydF4y2Ba
乘以x和y所需的乘法数,即复杂性的顺序是gydF4y2BaM-Digit(偶尔M + 1位)数字的个别产品。例如,如果n = 1,如在通常的Karatsuba技术中,ℳ= 2 + 1 = 3,这是我们在等式(3)中的顺序估计中使用的。gydF4y2Ba
在Karatsuba技术中,M(= 2)数字数字进一步乘以相同的技术,递归载流,直到我们减少到单位数乘法。这导致等式(3)中所述的递归复杂性计算。gydF4y2Ba
但请注意,如果我们简单地预先计算了单独的M位乘法并查找单独的乘法,我们基本上最终gydF4y2Ba查找而不是实际的乘法。实际上,查找所花费的时间平均是单位数乘法的1/5(然后我们必须乘以执行查找所需的操作的数量L),因此添加查找时的复杂性是gydF4y2Ba与Karatsuba方法相比。正如我们将在下面展示,L〜6M,使算法的总复杂性是gydF4y2Ba.如果m被选择为n的一部分,即,gydF4y2Ba,复杂性是〜(n + 1)n。与Karatsuba技术相比,这比N更快gydF4y2Ba1.58gydF4y2Ba.这是这篇短文的主要结果。gydF4y2Ba
需要针对尺寸B表执行M-Digit乘法的查找gydF4y2Ba米gydF4y2Ba×BgydF4y2Ba米gydF4y2Ba.此查找,可以通过标准二进制搜索技术验证,是(对于B = 10)的复杂性gydF4y2Ba.还有一些额外的增加和减少,这增加了额外的(虽然是次要的)复杂性gydF4y2Ba可以容易地检查,并在下面的示例中详述。gydF4y2Ba
进一步分析这一点,我们可以选择以两种不同的方式混合和匹配,即,gydF4y2Ba
- 1.我们可以使用k karatsuba风格的分治步骤,然后使用查找方法查找3gydF4y2BakgydF4y2Ba预先计算的产品gydF4y2Ba数字或gydF4y2Ba
- 2.我们可以用(N + 1) = 2gydF4y2BakgydF4y2Ba使用-block技术(分成m个数字块)gydF4y2Ba,我们必须查找2gydF4y2BakgydF4y2Ba+ c(2gydF4y2BakgydF4y2Ba2)产品。gydF4y2Ba
很明显3gydF4y2BakgydF4y2Ba<2gydF4y2BakgydF4y2Ba+ c(2gydF4y2BakgydF4y2Ba, 2),所以用分治策略产生更少的查找量——这是加快计算速度的最快方法。简化后的图(本质上)gydF4y2Ba)通过这种方式绘制在图1中 - 清楚地,早期切断递归是有利的。gydF4y2Ba
一点反思将显示为什么第2次划分为k次,然后查找是执行上述过程的最有效的方法,实际上它是说明性的,为什么Karatsuba技术是鸿沟最有效的- 征服技术。每次将n位数字划分为n + 1个m数字的块,我们必须(递归)执行(n + 1)+ c(n + 1,2)乘法。k这样的递归后,我们留下了(n + 1)gydF4y2BakgydF4y2Ba块gydF4y2Ba(n + 1) + C(n + 1,2)gydF4y2BakgydF4y2Ba乘法。在这一点上,如果我们查找这种类型的数字的预先计算的乘积,这是一个复杂因素gydF4y2Ba.操作的总数是gydF4y2Ba
最小的N,即,n = 1最小。然后复杂性然后恰好匹配Karatsuba算法的复杂性。gydF4y2Ba
数值例子gydF4y2Ba
在下面的情况下对上述算法进行说明,用于n = 4,其中我们使用n = 5m,gydF4y2Ba
是什么导致了这个产品gydF4y2Ba
可以看出,这个表达式有5 + C(5,2) = 15个可以预算的独立乘积,即。, 5个简单乘积xgydF4y2Ba0gydF4y2BaygydF4y2Ba0gydF4y2Ba, xgydF4y2Ba1gydF4y2BaygydF4y2Ba1gydF4y2Ba, xgydF4y2Ba2gydF4y2BaygydF4y2Ba2gydF4y2Ba, xgydF4y2Ba3.gydF4y2BaygydF4y2Ba3.gydF4y2Ba, xgydF4y2Ba4gydF4y2BaygydF4y2Ba4gydF4y2Ba和gydF4y2Ba1gydF4y2Ba0gydF4y2Ba组合产品(xgydF4y2Ba0gydF4y2Ba+ X.gydF4y2Ba1gydF4y2Ba)(Y.gydF4y2Ba0gydF4y2Ba+ Y.gydF4y2Ba1gydF4y2Ba),(xgydF4y2Ba0gydF4y2Ba+ X.gydF4y2Ba2gydF4y2Ba)(Y.gydF4y2Ba0gydF4y2Ba+ Y.gydF4y2Ba2gydF4y2Ba),(xgydF4y2Ba0gydF4y2Ba+ X.gydF4y2Ba3.gydF4y2Ba)(Y.gydF4y2Ba0gydF4y2Ba+ Y.gydF4y2Ba3.gydF4y2Ba),(xgydF4y2Ba0gydF4y2Ba+ X.gydF4y2Ba4gydF4y2Ba)(Y.gydF4y2Ba0gydF4y2Ba+ Y.gydF4y2Ba4gydF4y2Ba),(xgydF4y2Ba1gydF4y2Ba+ X.gydF4y2Ba2gydF4y2Ba)(Y.gydF4y2Ba1gydF4y2Ba+ Y.gydF4y2Ba2gydF4y2Ba),(xgydF4y2Ba1gydF4y2Ba+ X.gydF4y2Ba3.gydF4y2Ba)(Y.gydF4y2Ba1gydF4y2Ba+ Y.gydF4y2Ba3.gydF4y2Ba),(xgydF4y2Ba1gydF4y2Ba+ X.gydF4y2Ba4gydF4y2Ba)(Y.gydF4y2Ba1gydF4y2Ba+ Y.gydF4y2Ba4gydF4y2Ba),(xgydF4y2Ba2gydF4y2Ba+ X.gydF4y2Ba3.gydF4y2Ba)(Y.gydF4y2Ba2gydF4y2Ba+ Y.gydF4y2Ba3.gydF4y2Ba),(xgydF4y2Ba2gydF4y2Ba+ X.gydF4y2Ba4gydF4y2Ba)(Y.gydF4y2Ba2gydF4y2Ba+ Y.gydF4y2Ba4gydF4y2Ba),(xgydF4y2Ba3.gydF4y2Ba+ X.gydF4y2Ba4gydF4y2Ba)(Y.gydF4y2Ba3.gydF4y2Ba+ Y.gydF4y2Ba4gydF4y2Ba)。gydF4y2Ba
如果在M和(M + 1)的预计表中找到了这些产品,我们根本不需要任何乘法,只需15个查找,对于任何M,具有n = 5m。gydF4y2Ba
当然,我们需要执行加法和减法,上面的例子中有34个加法和减法——这些基本运算的数量只取决于gydF4y2Ba.gydF4y2Ba
内存要求gydF4y2Ba
典型的RSA加密算法使用〜1000位BASE-10复合数字,该数字是五百位素数的乘积。如果是通过预计算键来攻击问题,即五百位素线的预乘法对(n = 500〜2gydF4y2Ba9gydF4y2Ba)并存储乘以所有可能的6位数字的结果(m = 6〜2gydF4y2Ba3.gydF4y2Ba),一个有复杂性gydF4y2Ba,这比新的~ n log更糟糕gydF4y2Ba2gydF4y2Ban〜4500复杂性[8],尽管较新方法也有乘数,但我们没有占用。如果我们使用混合方法(Karatsuba,然后是6位产品的查找),复杂性是〜3gydF4y2Ba6gydF4y2Ba×6〜4200,可以比N日志更好地更好地更好地(没有丢失的丢失)gydF4y2Ba2gydF4y2Ban算法。我们需要储存〜10gydF4y2Ba12gydF4y2Ba12位数字,大约20 TB的内存,这是一个合理的大小。gydF4y2Ba
结论gydF4y2Ba
本文提出了一种快速预计算加速乘法运算的方法。虽然需要预先计算和存储所有可能的m位数乘法,但可以计算两个整数的乘积,其数字的个数等于任意整数乘以m,时间与数字的个数成比例(乘以前面提到的整数)。内存比cpu速度更便宜,因此这种方法也可以在其他情况(例如信号处理)中使用,以提高密集型计算的速度。gydF4y2Ba
有用的对话与B. Kumar博士承认。正如本文正在制备的那样,释放关于使用预先储存的计算的文章,其中埃特多斯筛筛地在计算复杂性[9,10]中。gydF4y2Ba