fbpx
维基百科

图姆-库克算法

图姆-库克算法(英語:Toom–Cook),有时也被称为Toom-3算法,由安德鲁·图姆命名,他提出了这种算法的基本原理,而斯蒂芬·库克则最先用简洁的形式描述并改进了这种算法,将其作为大整数的乘法算法

图姆-库克算法的原理是:对于给定的两个大整数 ,将分成个较小的部分,每个部分的长度为 ,并对这些部分执行运算。随着的增长,可以组合许多乘法子运算,从而降低算法的整体复杂度,然后再次使用图姆-库克算法递归计算乘法子运算,依此类推。Toom-3和图姆-库克两个术语有时会被错误的混用,但事实上Toom-3只是图姆-库克算法在时的特例。

Toom-3将9次乘法降低至仅需5次,使其在的时间里运行。通常,Toom-的时间复杂度为 ,其中是在乘法子运算上花费的时间,则是花费在对小常数进行的加法和乘法运算上的时间[1]。著名的Karatsuba算法实际上是图姆-库克算法的特例,在Karatsuba算法中,原始乘数被拆分成两个较小的数,而原本的4次乘法运算缩减为3次,使之在的时间内完成运算。Toom-1等价于普通的长乘法,具有的复杂度。

尽管可以通过增加来使指数任意接近1,但函数增长速度非常快[1][2]。混合级别图姆-库克算法的增长率直到2005年仍然是一个广为研究的开放性问题[3]。根据高德纳所描述算法的一种实现,其复杂度可降低至[4]

由于工作时的开销,当乘数包括较小的数时,图姆-库克算法会比长乘法更慢,因此它适用于中等规模的乘法。对于更大规模的数据,则有渐进更快的史恩哈格·施特拉森算法(复杂度为)。

这一算法由安德鲁·图姆1963年首次描述,并在斯蒂芬·库克1966年的博士学位论文中得到渐进等效的改进[5]

细节 编辑

本节将讨论对于任意给定   值, Toom- 究竟是如何运作的,这是马可·波德拉托对图姆-库克多项式乘法的简化描述[6]。这个算法包括五个主要步骤:

  1. 拆分
  2. 求值
  3. 点乘
  4. 插值
  5. 重组

在典型的大整数实现中,每个整数都表示为 进制的数字序列( 通常取较大的数)。在此示例中, ,因此每个数字序列对应一组十进制数字(在实践中, 通常取 的幂)。设要相乘的两个大整数  分别是:

  =            
  =            

这对乘数实际上比图姆-库克算法通常要处理的数据小很多,在此使用学校里学习的普通乘法可能会更快,但这个示例仍有助于说明图姆-库克算法的工作原理。

拆分 编辑

第一步是选择基数 ,使得两个数字  可以分成 段大小不超过 的数字(例如在Toom-3算法中,拆分段数应至多为3)。 常常根据如下公式求得:

 

我们的示例将演绎Toom-3算法的运算过程,因此确定 ,接着把  拆分为3段,即  ,则有:

 

然后,我们把这些数作为 阶多项式  的系数,with the property that   and  

 
 

定义这些多项式的目的在于:如果计算出它们的乘积 ,我们的答案就会是 

如果乘数位数不同,对于  分别取不同的 值十分有用,我们将其称为  。例如,算法“Toom-2.5”是指  时的图姆-库克算法。这时 中的 通常被确定为:

 

求值 编辑

图姆-库克算法包含一种常用的方法,来计算多项式  的乘积。注意,次数为 的多项式可以通过 个空间中的点确定(例如一次多项式是一条直线,它由两个点确定)。这个方法是在各个点上求值  ,然后把这些点相乘以获得多项式乘积上的点,最后进行插值以找到其系数。

由于 ,我们将需要 个点来确定最终结果 。在Toom-3的情况下, 。无论选择什么点,该算法都可以工作(有一些小例外,请参阅插值中的矩阵可逆性约束),但为了简化算法,最好选择较小的整数值,例如    

无穷大是一个常被使用的不寻常点,其记作  。求多项式 在无穷大时的值,实际上意味着令 的上限为  且趋向无穷大。因此, 总是其高阶系数的值( 是上文中的系数)。

在我们的Toom-3示例中,我们将使用点     ,这些选择简化了求值,如下式子:

 

对于 也是如此。在示例中,我们得到的值是:

  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =   .

如上所示,这些值可以包括负值。

为了下文的阐述,把这个求值过程视作矩阵向量乘法较为有用。其中,矩阵的每一行都包含求值点之一的幂,且向量包含多项式的系数:

 

The dimensions of the matrix are    by    for    and    by    for   。除最后一列的   以外,无穷大的行总是 

更快的求值 编辑

与上述公式相比,多点求值可能会减少基本运算(加、减)的次数,更快获得需要的结果。波德拉托[6] 为Toom-3给出的序列如下所示,它是在运行示例的第一个操作数(多项式 上进行的):

      =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  

此序列需要进行五次加/减运算,比简单求值少一次,同时节省了在计算 时乘以 的开销。

点乘 编辑

与对多项式  所进行的乘法不同,将  被求出的值相乘仅涉及整数相乘——这是原始问题的较小实例。我们递归调用我们的乘法过程来使每对已求值的点相乘。在实践中,随着乘数减小,算法将逐渐过渡为教科书长乘法。令 为多项式乘积,我们将得到:

  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  
  =   =   =  

如上所示,这些值也可以是负数。对于足够大的数值,这里是最昂贵的、唯一与  大小不成线性关系的步骤。

插值 编辑

这一步最为复杂。与求值相反:给定多项式乘积 上的 点,我们需要确定其系数。换句话说,我们要在右侧求解其向量的矩阵方程:

 

此矩阵的构造与求值步骤中的矩阵相同,不过它是 的。我们可以用高斯消元法来求出方程的解,但这样非常昂贵。根据以下事实:只要求值点的选择合适,这个矩阵就是可逆的。因此我们有:

 

接下来即要求得该矩阵的向量积。尽管矩阵中包含分数,但所得的系数却是整数——因此所有这些都可以在整数算术中完成,仅仅是与小常数进行加减乘除。图姆-库克设计时面临的一个困难挑战就是找到有效的操作顺序来计算该乘积。下面是波德拉托为Toom-3找到的一组顺序,通过上面的示例演示:

      =  
      =  
      =  
=  
      =  
=  
      =  
=  
      =  
=  
      =  
=  
      =  
=  

现在我们知道多项式乘积 

 

如果我们使用不同的  或求值点,矩阵和我们的插值将改变。但是它不依赖于输入,因此可以对任何给定的参数集进行硬编码。

重组 编辑

最后,我们将求出 的值以获得最终结果。很显然,由于  的幂,因此对 的幂的乘法同样也可以应用于所有以 为底数的数值。在这个示例中,  

       
       
       
       
       

                     

这实际上是  的乘积。

在其他取值时的插值矩阵 编辑

这里我们给出了几种  取常见较小值的插值矩阵。

Toom-1 编辑

Toom-1( )需要一个求值点,这里选择 。它退化为长乘法,并且使用恒等矩阵的插值矩阵。

 

Toom-1.5 编辑

Toom-1.5( )需要两个求值点,这里选择  ,且其插值矩阵就是恒等矩阵。

 

这里亦退化为长乘法:一个因数的两个系数都乘以另一个因数的两个系数。

Toom-2 编辑

Toom-2( )需要三个求值点,这里选择   。它与 Karatsuba 算法相同,其插值矩阵为:

 

Toom-2.5 编辑

Toom-2.5( )需要四个求值点,这里选择    。它的插值矩阵为:

 

另见 编辑

参考资料 编辑

  1. ^ 1.0 1.1 Knuth, p. 296
  2. ^ Crandall & Pomerance, p. 474
  3. ^ Crandall & Pomerance, p. 536
  4. ^ Knuth, p. 302
  5. ^ [http://cr.yp.to/bib/1966/cook.html Positive Results], chapter III of Stephen A. Cook: On the Minimum Computation Time of Functions.
  6. ^ 6.0 6.1 Marco Bodrato. Towards Optimal Toom-Cook Algorithms for Univariate and Multivariate Polynomials in Characteristic 2 and 0. In WAIFI'07 proceedings, volume 4547 of LNCS, pages 116–133. June 21–22, 2007. [http://bodrato.it/papers/#WAIFI2007 author website]

引用 编辑

  • D. Knuth. The Art of Computer Programming, Volume 2. Third Edition, Addison-Wesley, 1997. Section 4.3.3.A: Digital methods, pg.294.
  • R. Crandall & C. Pomerance. Prime Numbers – A Computational Perspective. Second Edition, Springer, 2005. Section 9.5.1: Karatsuba and Toom–Cook methods, pg.473.
  • M. Bodrato. Toward Optimal Toom-Cook (页面存档备份,存于互联网档案馆. In WAIFI'07, Springer, 2007.

外部链接 编辑

图姆, 库克算法, 此條目需要精通或熟悉数学的编者参与及协助编辑, 2020年12月31日, 請邀請適合的人士改善本条目, 更多的細節與詳情請參见討論頁, 另見其他需要数学專家關注的頁面, 英語, toom, cook, 有时也被称为toom, 3算法, 由安德鲁, 图姆命名, 他提出了这种算法的基本原理, 而斯蒂芬, 库克则最先用简洁的形式描述并改进了这种算法, 将其作为大整数的乘法算法, 的原理是, 对于给定的两个大整数a, displaystyle, 和b, displaystyle, 将a, display. 此條目需要精通或熟悉数学的编者参与及协助编辑 2020年12月31日 請邀請適合的人士改善本条目 更多的細節與詳情請參见討論頁 另見其他需要数学專家關注的頁面 图姆 库克算法 英語 Toom Cook 有时也被称为Toom 3算法 由安德鲁 图姆命名 他提出了这种算法的基本原理 而斯蒂芬 库克则最先用简洁的形式描述并改进了这种算法 将其作为大整数的乘法算法 图姆 库克算法的原理是 对于给定的两个大整数a displaystyle a 和b displaystyle b 将a displaystyle a 和b displaystyle b 分成k displaystyle k 个较小的部分 每个部分的长度为l displaystyle l 并对这些部分执行运算 随着k displaystyle k 的增长 可以组合许多乘法子运算 从而降低算法的整体复杂度 然后再次使用图姆 库克算法递归计算乘法子运算 依此类推 Toom 3和图姆 库克两个术语有时会被错误的混用 但事实上Toom 3只是图姆 库克算法在k 3 displaystyle k 3 时的特例 Toom 3将9次乘法降低至仅需5次 使其在8 n log 5 log 3 8 n 1 46 displaystyle Theta n log 5 log 3 approx Theta n 1 46 的时间里运行 通常 Toom k displaystyle k 的时间复杂度为8 c k n e displaystyle Theta c k n e 其中e log 2 k 1 log k displaystyle e log 2k 1 log k n e displaystyle n e 是在乘法子运算上花费的时间 c displaystyle c 则是花费在对小常数进行的加法和乘法运算上的时间 1 著名的Karatsuba算法实际上是图姆 库克算法的特例 在Karatsuba算法中 原始乘数被拆分成两个较小的数 而原本的4次乘法运算缩减为3次 使之在8 n log 3 log 2 8 n 1 58 displaystyle Theta n log 3 log 2 approx Theta n 1 58 的时间内完成运算 Toom 1等价于普通的长乘法 具有8 n 2 displaystyle Theta n 2 的复杂度 尽管可以通过增加k displaystyle k 来使指数e displaystyle e 任意接近1 但函数c displaystyle c 增长速度非常快 1 2 混合级别图姆 库克算法的增长率直到2005年仍然是一个广为研究的开放性问题 3 根据高德纳所描述算法的一种实现 其复杂度可降低至8 n 2 2 log n log n displaystyle Theta n2 sqrt 2 log n log n 4 由于工作时的开销 当乘数包括较小的数时 图姆 库克算法会比长乘法更慢 因此它适用于中等规模的乘法 对于更大规模的数据 则有渐进更快的史恩哈格 施特拉森算法 复杂度为8 n log n log log n displaystyle Theta n log n log log n 这一算法由安德鲁 图姆1963年首次描述 并在斯蒂芬 库克1966年的博士学位论文中得到渐进等效的改进 5 目录 1 细节 1 1 拆分 1 2 求值 1 2 1 更快的求值 1 3 点乘 1 4 插值 1 5 重组 2 UNIQ postMath 00000128 QINU 在其他取值时的插值矩阵 2 1 Toom 1 2 2 Toom 1 5 2 3 Toom 2 2 4 Toom 2 5 3 另见 4 参考资料 5 引用 6 外部链接细节 编辑本节将讨论对于任意给定 k displaystyle k nbsp 值 Toom k displaystyle k nbsp 究竟是如何运作的 这是马可 波德拉托对图姆 库克多项式乘法的简化描述 6 这个算法包括五个主要步骤 拆分 求值 点乘 插值 重组在典型的大整数实现中 每个整数都表示为b displaystyle b nbsp 进制的数字序列 b displaystyle b nbsp 通常取较大的数 在此示例中 b 10000 displaystyle b 10000 nbsp 因此每个数字序列对应一组十进制数字 在实践中 b displaystyle b nbsp 通常取2 displaystyle 2 nbsp 的幂 设要相乘的两个大整数m displaystyle m nbsp n displaystyle n nbsp 分别是 m displaystyle m nbsp 12 displaystyle 12 nbsp 3456 displaystyle 3456 nbsp 7890 displaystyle 7890 nbsp 1234 displaystyle 1234 nbsp 5678 displaystyle 5678 nbsp 9012 displaystyle 9012 nbsp n displaystyle n nbsp 9 displaystyle 9 nbsp 8765 displaystyle 8765 nbsp 4321 displaystyle 4321 nbsp 9876 displaystyle 9876 nbsp 5432 displaystyle 5432 nbsp 1098 displaystyle 1098 nbsp 这对乘数实际上比图姆 库克算法通常要处理的数据小很多 在此使用学校里学习的普通乘法可能会更快 但这个示例仍有助于说明图姆 库克算法的工作原理 拆分 编辑 第一步是选择基数B b i displaystyle B b i nbsp 使得两个数字m displaystyle m nbsp 和n displaystyle n nbsp 可以分成k displaystyle k nbsp 段大小不超过B displaystyle B nbsp 的数字 例如在Toom 3算法中 拆分段数应至多为3 i displaystyle i nbsp 常常根据如下公式求得 i max log b m k log b n k 1 displaystyle i max left left lfloor frac left lfloor log b m right rfloor k right rfloor left lfloor frac left lfloor log b n right rfloor k right rfloor right 1 nbsp 我们的示例将演绎Toom 3算法的运算过程 因此确定B b 2 10 8 displaystyle B b 2 10 8 nbsp 接着把m displaystyle m nbsp 和n displaystyle n nbsp 拆分为3段 即m i displaystyle m i nbsp 和n i displaystyle n i nbsp 则有 m 2 123456 m 1 78901234 m 0 56789012 n 2 98765 n 1 43219876 n 0 54321098 displaystyle begin aligned m 2 amp 123456 m 1 amp 78901234 m 0 amp 56789012 n 2 amp 98765 n 1 amp 43219876 n 0 amp 54321098 end aligned nbsp 然后 我们把这些数作为 k 1 displaystyle k 1 nbsp 阶多项式p displaystyle p nbsp 和q displaystyle q nbsp 的系数 with the property that p B m displaystyle p B m nbsp and q B n displaystyle q B n nbsp p x m 2 x 2 m 1 x m 0 123456 x 2 78901234 x 56789012 displaystyle p x m 2 x 2 m 1 x m 0 123456x 2 78901234x 56789012 nbsp q x n 2 x 2 n 1 x n 0 98765 x 2 43219876 x 54321098 displaystyle q x n 2 x 2 n 1 x n 0 98765x 2 43219876x 54321098 nbsp 定义这些多项式的目的在于 如果计算出它们的乘积r x p x q x displaystyle r x p x q x nbsp 我们的答案就会是r B m n displaystyle r B m times n nbsp 如果乘数位数不同 对于m displaystyle m nbsp n displaystyle n nbsp 分别取不同的k displaystyle k nbsp 值十分有用 我们将其称为k m displaystyle k m nbsp 和k n displaystyle k n nbsp 例如 算法 Toom 2 5 是指k m 3 displaystyle k m 3 nbsp 且k n 2 displaystyle k n 2 nbsp 时的图姆 库克算法 这时B b i displaystyle B b i nbsp 中的i displaystyle i nbsp 通常被确定为 i max log b m k m log b n k n displaystyle i max left left lfloor frac left lceil log b m right rceil k m right rfloor left lfloor frac left lceil log b n right rceil k n right rfloor right nbsp 求值 编辑 图姆 库克算法包含一种常用的方法 来计算多项式p x displaystyle p x nbsp q x displaystyle q x nbsp 的乘积 注意 次数为d displaystyle d nbsp 的多项式可以通过d 1 displaystyle d 1 nbsp 个空间中的点确定 例如一次多项式是一条直线 它由两个点确定 这个方法是在各个点上求值p displaystyle p cdot nbsp 和q displaystyle q cdot nbsp 然后把这些点相乘以获得多项式乘积上的点 最后进行插值以找到其系数 由于deg p q deg p deg q displaystyle deg pq deg p deg q nbsp 我们将需要deg p deg q 1 k m k n 1 displaystyle deg p deg q 1 k m k n 1 nbsp 个点来确定最终结果d displaystyle d nbsp 在Toom 3的情况下 d 5 displaystyle d 5 nbsp 无论选择什么点 该算法都可以工作 有一些小例外 请参阅插值中的矩阵可逆性约束 但为了简化算法 最好选择较小的整数值 例如0 displaystyle 0 nbsp 1 displaystyle 1 nbsp 1 displaystyle 1 nbsp 和 2 displaystyle 2 nbsp 无穷大是一个常被使用的不寻常点 其记作 displaystyle infty nbsp 或1 0 displaystyle 1 0 nbsp 求多项式p displaystyle p nbsp 在无穷大时的值 实际上意味着令p x x deg p displaystyle p x x deg p nbsp 的上限为x displaystyle x nbsp 且趋向无穷大 因此 p displaystyle p infty nbsp 总是其高阶系数的值 m 2 displaystyle m 2 nbsp 是上文中的系数 在我们的Toom 3示例中 我们将使用点0 displaystyle 0 nbsp 1 displaystyle 1 nbsp 1 displaystyle 1 nbsp 2 displaystyle 2 nbsp 和 displaystyle infty nbsp 这些选择简化了求值 如下式子 p 0 m 0 m 1 0 m 2 0 2 m 0 p 1 m 0 m 1 1 m 2 1 2 m 0 m 1 m 2 p 1 m 0 m 1 1 m 2 1 2 m 0 m 1 m 2 p 2 m 0 m 1 2 m 2 2 2 m 0 2 m 1 4 m 2 p m 2 displaystyle begin array lrlrl p 0 amp amp m 0 m 1 0 m 2 0 2 amp amp m 0 p 1 amp amp m 0 m 1 1 m 2 1 2 amp amp m 0 m 1 m 2 p 1 amp amp m 0 m 1 1 m 2 1 2 amp amp m 0 m 1 m 2 p 2 amp amp m 0 m 1 2 m 2 2 2 amp amp m 0 2m 1 4m 2 p infty amp amp m 2 amp amp end array nbsp 对于q displaystyle q nbsp 也是如此 在示例中 我们得到的值是 p 0 displaystyle p 0 nbsp m 0 displaystyle m 0 nbsp 56789012 displaystyle 56789012 nbsp 56789012 displaystyle 56789012 nbsp p 1 displaystyle p 1 nbsp m 0 m 1 m 2 displaystyle m 0 m 1 m 2 nbsp 56789012 78901234 123456 displaystyle 56789012 78901234 123456 nbsp 135813702 displaystyle 135813702 nbsp p 1 displaystyle p 1 nbsp m 0 m 1 m 2 displaystyle m 0 m 1 m 2 nbsp 56789012 78901234 123456 displaystyle 56789012 78901234 123456 nbsp 21988766 displaystyle 21988766 nbsp p 2 displaystyle p 2 nbsp m 0 2 m 1 4 m 2 displaystyle m 0 2m 1 4m 2 nbsp 56789012 2 78901234 4 123456 displaystyle 56789012 2 times 78901234 4 times 123456 nbsp 100519632 displaystyle 100519632 nbsp p displaystyle p infty nbsp m 2 displaystyle m 2 nbsp 123456 displaystyle 123456 nbsp 123456 displaystyle 123456 nbsp q 0 displaystyle q 0 nbsp n 0 displaystyle n 0 nbsp 54321098 displaystyle 54321098 nbsp 54321098 displaystyle 54321098 nbsp q 1 displaystyle q 1 nbsp n 0 n 1 n 2 displaystyle n 0 n 1 n 2 nbsp 54321098 43219876 98765 displaystyle 54321098 43219876 98765 nbsp 97639739 displaystyle 97639739 nbsp q 1 displaystyle q 1 nbsp n 0 n 1 n 2 displaystyle n 0 n 1 n 2 nbsp 54321098 43219876 98765 displaystyle 54321098 43219876 98765 nbsp 11199987 displaystyle 11199987 nbsp q 2 displaystyle q 2 nbsp n 0 2 n 1 4 n 2 displaystyle n 0 2n 1 4n 2 nbsp 54321098 2 43219876 4 98765 displaystyle 54321098 2 times 43219876 4 times 98765 nbsp 31723594 displaystyle 31723594 nbsp q displaystyle q infty nbsp n 2 displaystyle n 2 nbsp 98765 displaystyle 98765 nbsp 98765 displaystyle 98765 nbsp 如上所示 这些值可以包括负值 为了下文的阐述 把这个求值过程视作矩阵向量乘法较为有用 其中 矩阵的每一行都包含求值点之一的幂 且向量包含多项式的系数 p 0 p 1 p 1 p 2 p 0 0 0 1 0 2 1 0 1 1 1 2 1 0 1 1 1 2 2 0 2 1 2 2 0 0 1 m 0 m 1 m 2 1 0 0 1 1 1 1 1 1 1 2 4 0 0 1 m 0 m 1 m 2 displaystyle left begin matrix p 0 p 1 p 1 p 2 p infty end matrix right left begin matrix 0 0 amp 0 1 amp 0 2 1 0 amp 1 1 amp 1 2 1 0 amp 1 1 amp 1 2 2 0 amp 2 1 amp 2 2 0 amp 0 amp 1 end matrix right left begin matrix m 0 m 1 m 2 end matrix right left begin matrix 1 amp 0 amp 0 1 amp 1 amp 1 1 amp 1 amp 1 1 amp 2 amp 4 0 amp 0 amp 1 end matrix right left begin matrix m 0 m 1 m 2 end matrix right nbsp The dimensions of the matrix are d displaystyle d nbsp by k m displaystyle k m nbsp for p displaystyle p nbsp and d displaystyle d nbsp by k n displaystyle k n nbsp for q displaystyle q nbsp 除最后一列的 1 displaystyle 1 nbsp 以外 无穷大的行总是0 displaystyle 0 nbsp 更快的求值 编辑 与上述公式相比 多点求值可能会减少基本运算 加 减 的次数 更快获得需要的结果 波德拉托 6 为Toom 3给出的序列如下所示 它是在运行示例的第一个操作数 多项式p displaystyle p nbsp 上进行的 p 0 displaystyle p 0 nbsp displaystyle leftarrow nbsp m 0 m 2 displaystyle m 0 m 2 nbsp 56789012 123456 displaystyle 56789012 123456 nbsp 56912468 displaystyle 56912468 nbsp p 0 displaystyle p 0 nbsp m 0 displaystyle m 0 nbsp 56789012 displaystyle 56789012 nbsp 56789012 displaystyle 56789012 nbsp p 1 displaystyle p 1 nbsp p 0 m 1 displaystyle p 0 m 1 nbsp 56912468 78901234 displaystyle 56912468 78901234 nbsp 135813702 displaystyle 135813702 nbsp p 1 displaystyle p 1 nbsp p 0 m 1 displaystyle p 0 m 1 nbsp 56912468 78901234 displaystyle 56912468 78901234 nbsp 21988766 displaystyle 21988766 nbsp p 2 displaystyle p 2 nbsp p 1 m 2 2 m 0 displaystyle p 1 m 2 times 2 m 0 nbsp 21988766 123456 2 56789012 displaystyle 21988766 123456 times 2 56789012 nbsp 100519632 displaystyle 100519632 nbsp p displaystyle p infty nbsp m 2 displaystyle m 2 nbsp 123456 displaystyle 123456 nbsp 123456 displaystyle 123456 nbsp 此序列需要进行五次加 减运算 比简单求值少一次 同时节省了在计算p 2 displaystyle p 2 nbsp 时乘以4 displaystyle 4 nbsp 的开销 点乘 编辑 与对多项式p displaystyle p cdot nbsp 和q displaystyle q cdot nbsp 所进行的乘法不同 将p a displaystyle p a nbsp 和q a displaystyle q a nbsp 被求出的值相乘仅涉及整数相乘 这是原始问题的较小实例 我们递归调用我们的乘法过程来使每对已求值的点相乘 在实践中 随着乘数减小 算法将逐渐过渡为教科书长乘法 令r displaystyle r nbsp 为多项式乘积 我们将得到 r 0 displaystyle r 0 nbsp p 0 q 0 displaystyle p 0 q 0 nbsp 56789012 54321098 displaystyle 56789012 times 54321098 nbsp 3084841486175176 displaystyle 3084841486175176 nbsp r 1 displaystyle r 1 nbsp p 1 q 1 displaystyle p 1 q 1 nbsp 135813702 97639739 displaystyle 135813702 times 97639739 nbsp 13260814415903778 displaystyle 13260814415903778 nbsp r 1 displaystyle r 1 nbsp p 1 q 1 displaystyle p 1 q 1 nbsp 21988766 11199987 displaystyle 21988766 times 11199987 nbsp 246273893346042 displaystyle 246273893346042 nbsp r 2 displaystyle r 2 nbsp p 2 q 2 displaystyle p 2 q 2 nbsp 100519632 31723594 displaystyle 100519632 times 31723594 nbsp 3188843994597408 displaystyle 3188843994597408 nbsp r displaystyle r infty nbsp p q displaystyle p infty q infty nbsp 123456 98765 displaystyle 123456 times 98765 nbsp 12193131840 displaystyle 12193131840 nbsp 如上所示 这些值也可以是负数 对于足够大的数值 这里是最昂贵的 唯一与m displaystyle m nbsp n displaystyle n nbsp 大小不成线性关系的步骤 插值 编辑 这一步最为复杂 与求值相反 给定多项式乘积r displaystyle r cdot nbsp 上的d displaystyle d nbsp 点 我们需要确定其系数 换句话说 我们要在右侧求解其向量的矩阵方程 r 0 r 1 r 1 r 2 r 0 0 0 1 0 2 0 3 0 4 1 0 1 1 1 2 1 3 1 4 1 0 1 1 1 2 1 3 1 4 2 0 2 1 2 2 2 3 2 4 0 0 0 0 1 r 0 r 1 r 2 r 3 r 4 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 2 4 8 16 0 0 0 0 1 r 0 r 1 r 2 r 3 r 4 displaystyle begin aligned left begin matrix r 0 r 1 r 1 r 2 r infty end matrix right amp left begin matrix 0 0 amp 0 1 amp 0 2 amp 0 3 amp 0 4 1 0 amp 1 1 amp 1 2 amp 1 3 amp 1 4 1 0 amp 1 1 amp 1 2 amp 1 3 amp 1 4 2 0 amp 2 1 amp 2 2 amp 2 3 amp 2 4 0 amp 0 amp 0 amp 0 amp 1 end matrix right left begin matrix r 0 r 1 r 2 r 3 r 4 end matrix right amp left begin matrix 1 amp 0 amp 0 amp 0 amp 0 1 amp 1 amp 1 amp 1 amp 1 1 amp 1 amp 1 amp 1 amp 1 1 amp 2 amp 4 amp 8 amp 16 0 amp 0 amp 0 amp 0 amp 1 end matrix right left begin matrix r 0 r 1 r 2 r 3 r 4 end matrix right end aligned nbsp 此矩阵的构造与求值步骤中的矩阵相同 不过它是d d displaystyle d times d nbsp 的 我们可以用高斯消元法来求出方程的解 但这样非常昂贵 根据以下事实 只要求值点的选择合适 这个矩阵就是可逆的 因此我们有 r 0 r 1 r 2 r 3 r 4 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 2 4 8 16 0 0 0 0 1 1 r 0 r 1 r 1 r 2 r 1 0 0 0 0 1 2 1 3 1 1 6 2 1 1 2 1 2 0 1 1 2 1 6 1 2 1 6 2 0 0 0 0 1 r 0 r 1 r 1 r 2 r displaystyle begin aligned left begin matrix r 0 r 1 r 2 r 3 r 4 end matrix right amp left begin matrix 1 amp 0 amp 0 amp 0 amp 0 1 amp 1 amp 1 amp 1 amp 1 1 amp 1 amp 1 amp 1 amp 1 1 amp 2 amp 4 amp 8 amp 16 0 amp 0 amp 0 amp 0 amp 1 end matrix right 1 left begin matrix r 0 r 1 r 1 r 2 r infty end matrix right amp left begin matrix 1 amp 0 amp 0 amp 0 amp 0 tfrac 1 2 amp tfrac 1 3 amp 1 amp tfrac 1 6 amp 2 1 amp tfrac 1 2 amp tfrac 1 2 amp 0 amp 1 tfrac 1 2 amp tfrac 1 6 amp tfrac 1 2 amp tfrac 1 6 amp 2 0 amp 0 amp 0 amp 0 amp 1 end matrix right left begin matrix r 0 r 1 r 1 r 2 r infty end matrix right end aligned nbsp 接下来即要求得该矩阵的向量积 尽管矩阵中包含分数 但所得的系数却是整数 因此所有这些都可以在整数算术中完成 仅仅是与小常数进行加减乘除 图姆 库克设计时面临的一个困难挑战就是找到有效的操作顺序来计算该乘积 下面是波德拉托为Toom 3找到的一组顺序 通过上面的示例演示 r 0 displaystyle r 0 nbsp displaystyle leftarrow nbsp r 0 displaystyle r 0 nbsp 3084841486175176 displaystyle 3084841486175176 nbsp r 4 displaystyle r 4 nbsp displaystyle leftarrow nbsp r displaystyle r infty nbsp 12193131840 displaystyle 12193131840 nbsp r 3 displaystyle r 3 nbsp displaystyle leftarrow nbsp r 2 r 1 3 displaystyle r 2 r 1 3 nbsp 3188843994597408 13260814415903778 3 displaystyle 3188843994597408 13260814415903778 3 nbsp 3357323473768790 displaystyle 3357323473768790 nbsp r 1 displaystyle r 1 nbsp displaystyle leftarrow nbsp r 1 r 1 2 displaystyle r 1 r 1 2 nbsp 13260814415903778 246273893346042 2 displaystyle 13260814415903778 246273893346042 2 nbsp 6753544154624910 displaystyle 6753544154624910 nbsp r 2 displaystyle r 2 nbsp displaystyle leftarrow nbsp r 1 r 0 displaystyle r 1 r 0 nbsp 246273893346042 3084841486175176 displaystyle 246273893346042 3084841486175176 nbsp 3331115379521218 displaystyle 3331115379521218 nbsp r 3 displaystyle r 3 nbsp displaystyle leftarrow nbsp r 2 r 3 2 2 r displaystyle r 2 r 3 2 2r infty nbsp 3331115379521218 3357323473768790 2 2 12193131840 displaystyle 3331115379521218 3357323473768790 2 2 times 12193131840 nbsp 13128433387466 displaystyle 13128433387466 nbsp r 2 displaystyle r 2 nbsp displaystyle leftarrow nbsp r 2 r 1 r 4 displaystyle r 2 r 1 r 4 nbsp 3331115379521218 6753544154624910 12193131840 displaystyle 3331115379521218 6753544154624910 12193131840 nbsp 3422416581971852 displaystyle 3422416581971852 nbsp r 1 displaystyle r 1 nbsp displaystyle leftarrow nbsp r 1 r 3 displaystyle r 1 r 3 nbsp 6753544154624910 13128433387466 displaystyle 6753544154624910 13128433387466 nbsp 6740415721237444 displaystyle 6740415721237444 nbsp 现在我们知道多项式乘积r displaystyle r nbsp r x 3084841486175176 6740415721237444 x 3422416581971852 x 2 13128433387466 x 3 12193131840 x 4 displaystyle begin array rrr r x amp amp 3084841486175176 amp amp 6740415721237444x amp amp 3422416581971852x 2 amp amp 13128433387466x 3 amp amp 12193131840x 4 end array nbsp 如果我们使用不同的k m displaystyle k m nbsp k n displaystyle k n nbsp 或求值点 矩阵和我们的插值将改变 但是它不依赖于输入 因此可以对任何给定的参数集进行硬编码 重组 编辑 最后 我们将求出r B displaystyle r B nbsp 的值以获得最终结果 很显然 由于B displaystyle B nbsp 是b displaystyle b nbsp 的幂 因此对B displaystyle B nbsp 的幂的乘法同样也可以应用于所有以b displaystyle b nbsp 为底数的数值 在这个示例中 b 10 4 displaystyle b 10 4 nbsp 且B b 2 10 8 displaystyle B b 2 10 8 nbsp 3084 displaystyle 3084 nbsp 8414 displaystyle 8414 nbsp 8617 displaystyle 8617 nbsp 5176 displaystyle 5176 nbsp 6740 displaystyle 6740 nbsp 4157 displaystyle 4157 nbsp 2123 displaystyle 2123 nbsp 7444 displaystyle 7444 nbsp 3422 displaystyle 3422 nbsp 4165 displaystyle 4165 nbsp 8197 displaystyle 8197 nbsp 1852 displaystyle 1852 nbsp 13 displaystyle 13 nbsp 1284 displaystyle 1284 nbsp 3338 displaystyle 3338 nbsp 7466 displaystyle 7466 nbsp displaystyle nbsp 121 displaystyle 121 nbsp 9313 displaystyle 9313 nbsp 1840 displaystyle 1840 nbsp 121 displaystyle 121 nbsp 9326 displaystyle 9326 nbsp 3124 displaystyle 3124 nbsp 6761 displaystyle 6761 nbsp 1632 displaystyle 1632 nbsp 4937 displaystyle 4937 nbsp 6009 displaystyle 6009 nbsp 5208 displaystyle 5208 nbsp 5858 displaystyle 5858 nbsp 8617 displaystyle 8617 nbsp 5176 displaystyle 5176 nbsp 这实际上是1234567890123456789012 displaystyle 1234567890123456789012 nbsp 与987654321987654321098 displaystyle 987654321987654321098 nbsp 的乘积 k displaystyle k 在其他取值时的插值矩阵 编辑这里我们给出了几种k m displaystyle k m nbsp 和k n displaystyle k n nbsp 取常见较小值的插值矩阵 Toom 1 编辑 Toom 1 k m k n 1 displaystyle k m k n 1 nbsp 需要一个求值点 这里选择0 displaystyle 0 nbsp 它退化为长乘法 并且使用恒等矩阵的插值矩阵 1 1 1 displaystyle left begin matrix 1 end matrix right 1 left begin matrix 1 end matrix right nbsp Toom 1 5 编辑 Toom 1 5 k m 2 k n 1 displaystyle k m 2 k n 1 nbsp 需要两个求值点 这里选择0 displaystyle 0 nbsp 和 displaystyle infty nbsp 且其插值矩阵就是恒等矩阵 1 0 0 1 1 1 0 0 1 displaystyle left begin matrix 1 amp 0 0 amp 1 end matrix right 1 left begin matrix 1 amp 0 0 amp 1 end matrix right nbsp 这里亦退化为长乘法 一个因数的两个系数都乘以另一个因数的两个系数 Toom 2 编辑 Toom 2 k m 2 k n 2 displaystyle k m 2 k n 2 nbsp 需要三个求值点 这里选择0 displaystyle 0 nbsp 1 displaystyle 1 nbsp 和 displaystyle infty nbsp 它与 Karatsuba 算法相同 其插值矩阵为 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 displaystyle left begin matrix 1 amp 0 amp 0 1 amp 1 amp 1 0 amp 0 amp 1 end matrix right 1 left begin matrix 1 amp 0 amp 0 1 amp 1 amp 1 0 amp 0 amp 1 end matrix right nbsp Toom 2 5 编辑 Toom 2 5 k m 3 k n 2 displaystyle k m 3 k n 2 nbsp 需要四个求值点 这里选择0 displaystyle 0 nbsp 1 displaystyle 1 nbsp 1 displaystyle 1 nbsp 和 displaystyle infty nbsp 它的插值矩阵为 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 2 1 2 1 1 1 2 1 2 0 0 0 0 1 displaystyle left begin matrix 1 amp 0 amp 0 amp 0 1 amp 1 amp 1 amp 1 1 amp 1 amp 1 amp 1 0 amp 0 amp 0 amp 1 end matrix right 1 left begin matrix 1 amp 0 amp 0 amp 0 0 amp tfrac 1 2 amp tfrac 1 2 amp 1 1 amp tfrac 1 2 amp tfrac 1 2 amp 0 0 amp 0 amp 0 amp 1 end matrix right nbsp 另见 编辑乘法算法 任意精度整数 长乘法 Karatsuba 算法 施特拉森算法 富尔算法参考资料 编辑 1 0 1 1 Knuth p 296 Crandall amp Pomerance p 474 Crandall amp Pomerance p 536 Knuth p 302 http cr yp to bib 1966 cook html Positive Results chapter III of Stephen A Cook On the Minimum Computation Time of Functions 6 0 6 1 Marco Bodrato Towards Optimal Toom Cook Algorithms for Univariate and Multivariate Polynomials in Characteristic 2 and 0 In WAIFI 07 proceedings volume 4547 of LNCS pages 116 133 June 21 22 2007 http bodrato it papers WAIFI2007 author website 引用 编辑D Knuth The Art of Computer Programming Volume 2 Third Edition Addison Wesley 1997 Section 4 3 3 A Digital methods pg 294 R Crandall amp C Pomerance Prime Numbers A Computational Perspective Second Edition Springer 2005 Section 9 5 1 Karatsuba and Toom Cook methods pg 473 M Bodrato Toward Optimal Toom Cook 页面存档备份 存于互联网档案馆 In WAIFI 07 Springer 2007 外部链接 编辑 nbsp 数学主题 http gmplib org manual Toom 3 002dWay Multiplication html 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title 图姆 库克算法 amp oldid 68711334, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。