图姆-库克算法

✍ dations ◷ 2025-11-04 20:09: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

相关

  • 5-羟色胺和去甲肾上腺素再摄取抑制剂5-羟色胺和去甲肾上腺素再摄取抑制剂(英语:Serotonin–norepinephrine reuptake inhibitors) (SNRIs),是一种用来治疗重度抑郁症和其他精神障碍的抗抑郁药。SNRI有时候也用来治
  • 孢子(英语:Spore,汉语拼音:bāo-zǐ,注音符号:ㄅㄠ ㄗˇ)是一种脱离亲本后能发育成新个体的单细胞或少数细胞的繁殖体。孢子一般有休眠作用,能在恶劣的环境下保持自有的传播能力,并再
  • 金得臣金得臣(韩语:김득신;1754年-1822年),字贤辅(韩语:현보),号兢斋(韩语:긍재)、弘月轩(韩语:홍월헌),本贯开城金氏,朝鲜王朝后期画家,宫廷画工金应履之子,本人也是宫中图画署画工,与金弘道也以画风俗
  • 消防员学校消防员学校,是应急管理部消防救援局直属的一所专门消防救援院校,位于江苏省南京市。1982年6月,经江苏省人民政府批准,成立江苏省消防教导大队,主要承担江苏消防部队预提警官培训
  • 国际发明联盟协会国际发明联盟协会(英语:International Federation of Inventors' Associations,缩写 IFIA),是一个非营利非政府的国际性组织,由丹麦、芬兰、德国、英国、挪威、瑞典、瑞士等国的发
  • 第一代基奇纳伯爵赫伯特·基奇纳陆军元帅霍雷肖·赫伯特·基奇纳,第一代基奇纳伯爵,KG,KP,GCB,OM,GCSI,GCMG,GCIE,ADC,PC(Horatio Herbert Kitchener, 1st Earl Kitchener,1850年6月24日 - 1916年6月5日),生于爱尔兰,英国
  • 阿纳托利·莫克连科阿纳托利·尤里耶维奇·莫克连科(乌克兰语:Анатолій Юрійович Мокренко,1933年1月22日-2020年3月24日),乌克兰歌唱家,歌剧演员。乌克兰国家歌剧院原院长兼
  • 世界生态安全大会世界生态安全大会(英语:World Ecological Safety Assembly,缩写:WESA)是由国际生态安全合作组织举办的两年一届的国际生态安全会议。第一届世界生态安全大会于2010年在柬埔寨金边
  • 陈云富陈云富(1938年-),男,江苏镇江人,中国舞蹈演员,中国歌剧舞剧院演员,曾任中国儿童歌舞学会会​长。
  • 赵斗淳 (政治家)赵斗淳(朝鲜语:조두순/趙斗淳,1796年-1870年),字元七,号心菴,朝鲜王朝文臣。本贯杨州赵氏。纯祖在位期间文科及第,历任奎章阁待教、大司成、副提学、吏曹参议。1835年任同知副使,此后任礼曹参判、吏曹参判、黄海道观察使、汉城府判尹等职。1849年任艺文馆大提学,参与编纂《宪宗实录》。此后历任工曹判书、刑曹判书、兵曹判书、吏曹判书、右议政、左议政。1862年,因三政紊乱,百姓无法忍受苛酷的压榨,各地爆发民变。朝廷下令设置厘整厅,任命赵斗淳为总裁,对三政全力改革。1863年哲宗去世后,赵斗淳积极主张推