图姆-库克算法

✍ dations ◷ 2025-09-15 11:38:28 #图姆-库克算法

图姆-库克算法(英语: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次,使其在 Θ ( n log ( 5 ) / log ( 3 ) ) Θ ( n 1.46 ) {displaystyle Theta (n^{log(5)/log(3)})approx Theta (n^{1.46})} 的时间里运行。通常,Toom- k {displaystyle k} 的时间复杂度为 Θ ( 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} 则是花费在对小常数进行的加法和乘法运算上的时间。著名的Karatsuba算法实际上是图姆-库克算法的特例,在Karatsuba算法中,原始乘数被拆分成两个较小的数,而原本的4次乘法运算缩减为3次,使之在 Θ ( n log ( 3 ) / log ( 2 ) ) Θ ( n 1.58 ) {displaystyle Theta (n^{log(3)/log(2)})approx Theta (n^{1.58})} 的时间内完成运算。Toom-1等价于普通的长乘法,具有 Θ ( n 2 ) {displaystyle Theta (n^{2})} 的复杂度。

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

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

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

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

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

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

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

我们的示例将演绎Toom-3算法的运算过程,因此确定 B = b 2 = 10 8 {displaystyle B=b^{2}=10^{8}} ,接着把 m {displaystyle m} n {displaystyle n} 拆分为3段,即 m i {displaystyle m_{i}} n i {displaystyle n_{i}} ,则有:

然后,我们把这些数作为 ( k 1 ) {displaystyle (k-1)} 阶多项式 p {displaystyle p} q {displaystyle q} 的系数,with the property that p ( B ) = m {displaystyle p(B)=m} and q ( B ) = n {displaystyle q(B)=n}

定义这些多项式的目的在于:如果计算出它们的乘积 r ( x ) = p ( x ) q ( x ) {displaystyle r(x)=p(x)q(x)} ,我们的答案就会是 r ( B ) = m × n {displaystyle r(B)=mtimes n}

如果乘数位数不同,对于 m {displaystyle m} n {displaystyle n} 分别取不同的 k {displaystyle k} 值十分有用,我们将其称为 k m {displaystyle k_{m}} k n {displaystyle k_{n}} 。例如,算法“Toom-2.5”是指 k m = 3 {displaystyle k_{m}=3} k n = 2 {displaystyle k_{n}=2} 时的图姆-库克算法。这时 B = b i {displaystyle B=b^{i}} 中的 i {displaystyle i} 通常被确定为:

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

由于 deg ( p q ) = deg ( p ) + deg ( q ) {displaystyle deg(pq)=deg(p)+deg(q)} ,我们将需要 deg ( p ) + deg ( q ) + 1 = k m + k n 1 {displaystyle deg(p)+deg(q)+1=k_{m}+k_{n}-1} 个点来确定最终结果 d {displaystyle d} 。在Toom-3的情况下, d = 5 {displaystyle d=5} 。无论选择什么点,该算法都可以工作(有一些小例外,请参阅插值中的矩阵可逆性约束),但为了简化算法,最好选择较小的整数值,例如 0 {displaystyle 0} 1 {displaystyle 1} 1 {displaystyle -1} 2 {displaystyle -2}

无穷大是一个常被使用的不寻常点,其记作 {displaystyle infty } 1 / 0 {displaystyle 1/0} 。求多项式 p {displaystyle p} 在无穷大时的值,实际上意味着令 p ( x ) / x deg p {displaystyle p(x)/x^{deg p}} 的上限为 x {displaystyle x} 且趋向无穷大。因此, p ( ) {displaystyle p(infty )} 总是其高阶系数的值( m 2 {displaystyle m_{2}} 是上文中的系数)。

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

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

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

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

The dimensions of the matrix are   d {displaystyle d} by   k m {displaystyle k_{m}} for   p {displaystyle p} and   d {displaystyle d} by   k n {displaystyle k_{n}} for   q {displaystyle q} 。除最后一列的 1 {displaystyle 1} 以外,无穷大的行总是 0 {displaystyle 0}

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

此序列需要进行五次加/减运算,比简单求值少一次,同时节省了在计算 p ( 2 ) {displaystyle p(-2)} 时乘以 4 {displaystyle 4} 的开销。

与对多项式 p ( ) {displaystyle p(cdot )} q

相关

  • 内夫反应内夫反应(Nef反应)是一级或二级硝基化合物负离子在酸中水解,生成醛酮和一氧化二氮的反应。反应以约翰·内夫的名字命名。1894年,他用硝基乙烷的钠盐与硫酸反应,得到了85-89%产率
  • 黑犀牛黑犀(学名:Diceros bicornis),也叫黑犀牛,是犀科黑犀属的唯一一种,产于非洲的肯尼亚、坦桑尼亚、喀麦隆、南非、纳米比亚和津巴布韦。尽管名叫黑犀,它们的体表颜色实际上更接近于灰
  • 文学改良刍议胡适于1917年1月1日发表于《新青年》第2卷第5号的一篇文章,提倡改良中国文学。当时他还是美国哥伦比亚大学的研究生,后来唐德刚在《胡适杂忆》中透露,胡适当时写那篇文章,原是在
  • 猪哥猪八戒,原名猪刚鬣,法号悟能,是中国古典小说《西游记》当中唐僧的四个徒弟之一,排行第二,猪脸人身,黑猪模样。孙悟空常呼其为“呆子”。朱士行(203—282),三国时代高僧,法号八戒。嘉平
  • 卡洛·鲁比亚卡洛·鲁比亚(意大利语:Carlo Rubbia,1934年3月31日-),出生于戈里齐亚,意大利物理学家,因与西蒙·范德梅尔在欧洲核子研究组织共同发现W及Z玻色子而获得1984年诺贝尔物理学奖。鲁比
  • 明亮 (清朝)明亮(满语:ᡳᠩᠯᡳᠶᠠᠩ,转写:;1736年-1822年),字寅斋,富察氏,满洲镶黄旗人,都统广成之子,孝贤纯皇后侄儿。清朝政治人物,军事人物。谥文襄。宁完我文毅 - 范文程文肃 - 李国英勤襄 -
  • 罗伯特·布莱罗伯特·布莱(英语:Robert Bly,1926年12月23日-),是一位美国诗人、作家、活动家,他最著名的《上帝之肋:一部男人的文化史》(1990)一度在纽约时报畅销书榜登榜达62周。而他的《身体周围
  • 桃园市立大园国际高级中等学校桃园市立大园国际高级中等学校(英语:Taoyuan Municipal Dayuan International Senior High School,DYISH或DYSH),简称大园国际高中、大园高中、园高,位于台湾桃园市大园区(也位于台
  • 天主教马拉巴教区天主教马拉巴教区(拉丁语:Dioecesis Marabensis;葡萄牙语:Diocese de Marabá)是巴西一个天主教教区,位于帕拉州东部。此教区属贝伦总教区。1911年7月18日设阿拉瓜亚的康塞桑自治
  • 罗纳德·英格尔哈特罗纳德·英格尔哈特(英语:Ronald Inglehart,1934年9月5日-2021年5月8日),美国著名的政治学家,美国密歇根大学勒文施泰因政治学讲席教授,社会研究所研究员,俄罗斯高等经济学院(圣彼得堡)比较社会研究实验室指导人之一,美国艺术与科学院院士、美国社会和政治科学院院士,主要研究领域有比较政治,政治发展,政治哲学等。