用于三位数乘法的Karatsuba和Toom-3算法

西蒙

我想知道有关Katatsuba算法的问题。当你申请Karatsuba你基本上做到每循环其中的一个运行3次乘法(假设abcd与数字2位数分别为a, b, c and d):

X = bd
Y = ac
Z = (a+c)(c+d) 

然后我们要寻找的总和是:

bd = X 
ac = Y 
(bc + ad) = Z - X - Y

我的问题是:假设我们有两个3位数字:abc, def我发现我们只需执行5次乘法即可。我也找到了这个Toom-3算法,但是它使用了我无法完全理解的多项式。有人可以写下这些乘法以及如何计算有趣的总和bd + ae, ce+ bf, cd + be + af

杰弗里·萨克斯(Jeffrey Sax)

基本思想是:数字237是在点x = 10求出的多项式p(x)= 2x 2 + 3x + 7。因此,我们可以想到每个与一个多项式相对应的整数,该多项式的系数是数字的位数。当我们在x = 10处评估多项式时,我们得到了数字。

有趣的是,要完全指定2次多项式,我们仅需要3个不同点的值即可。我们需要5个值来完全指定4级的多项式。

因此,如果我们想将两个3位数相乘,可以通过以下方式进行:

  1. 在5个不同的点上评估相应的多项式。
  2. 将5个值相乘。现在,我们有5个乘积多项式的函数值。
  3. 从我们在步骤2中计算出的五个值中找到该多项式的系数。

Karatsuba乘法的工作方式相同,只是我们只需要3个不同的点。而不是在10处,我们在0、1和“无穷大”处评估多项式,这将给我们带来乘积b,a+b,ad,d+c,c然后相乘得出您的X,Z,Y

现在,将所有内容写成abcdef相当复杂。Wikipedia文章中,它实际上做得很好:

  1. 在“评估”部分中,对多项式进行评估,以给出例如c,a+b+c,a-b+c,4a+2b+c,a第一个数字。
  2. Pointwise产品中,每个数字的对应值相乘,得出:
X = cf
Y = (a+b+c)(d+e+f)
Z = (a+b-c)(d-e+f)
U = (4a+2b+c)(4d+2e+f)
V = ad
  1. 在“插值”部分中,这些值组合在一起即可为您提供产品中的数字。这涉及求解线性方程组的5x5系统,因此,它再次比Karatsuba情况更为复杂。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

格式化JTextField最多接受三位数字,但是最多可以输入1-3位数字

来自分类Dev

如何用grep匹配三位数?

来自分类Dev

OBD II中的三位数PID

来自分类Dev

获取每个间隙的前三位数

来自分类Dev

输入列表-双/三位数

来自分类Dev

获取每个间隙的前三位数

来自分类Dev

如何连接字符串和整数以获得三位数

来自分类Dev

三位数和四位数的文件权限之间的区别?

来自分类Dev

三位数和四位数的文件权限之间的区别?

来自分类Dev

如何解析逗号后的三位数浮点数?

来自分类Dev

带有三位数小时的Python时间格式

来自分类Dev

输出浮点数为三位数或更多以避免指数

来自分类Dev

对于三位数的指数,Fortran在输出中删除“ E”

来自分类Dev

如何在Python中获得真正的三位数的微秒?

来自分类Dev

XSL:如何对三位数的连字符分隔值进行排序?

来自分类Dev

小数点前如何显示三位数?

来自分类Dev

快速将三位数的Base64数字转换为Int

来自分类Dev

Postgres将毫秒部分从三位数截断

来自分类Dev

给定一个三位数的数字,找到其数字的总和。蟒蛇

来自分类Dev

将div中的数字更改为三位数逗号

来自分类Dev

输出浮点数为三位数或更多以避免指数

来自分类Dev

如何打印浮点数小数点后的前三位数?

来自分类Dev

对于三位数的指数,Fortran在输出中删除“ E”

来自分类Dev

Excel-以27为基数的三位数序列表

来自分类Dev

重击:显示带有三位数输出的wc?

来自分类Dev

根据Excel中的条件删除三位数?

来自分类Dev

从数组中获取所有三位数并存储在新数组中

来自分类Dev

如何将json十进制舍入为三位数

来自分类Dev

如何在角度js的三位数后添加点

Related 相关文章

热门标签

归档