Skip to content

算法Algorithm

多项式乘法算法

施工中 · 内容逐步修订

Polynomial multiplication algorithm · Fast polynomial multiplication

以卷积、分治或点值变换计算系数乘积,并以乘法代价函数统一后续多项式算法。

形式陈述 ​

在交换含幺环 R 上,给定正整数 m,n 与次数分别小于 m,n 的多项式

A(x)=∑i=0m−1aixi,B(x)=∑j=0n−1bjxj,

目标是输出 C=AB 的长度 m+n−1 的系数向量;末尾允许为零,需要规范稠密表示时再删除尾随零。各坐标为

ck=∑i+j=kaibj.

按此式逐对相乘需要 mn 次系数乘法。对长度均不超过 N≥1 的稠密系数向量,记选定乘法实现的环运算上界为 M(N)。以下选用单调的界,满足 M(N)≥N、M(a)+M(b)≤M(a+b) 以及 M(2N)=O(M(N));这让许多后续算法可以只写成 O(M(N)) 或 O(M(N)log⁡N),而不绑定某一种实现。

Karatsuba 把 A=A0+xsA1、B=B0+xsB1,以

A0B0,A1B1,(A0+A1)(B0+B1)

三次半规模乘法恢复四个分块,得到 M(N)=O(Nlog2⁡3)。Toom–3 在若干点求值、做五次约三分之一规模的乘法再插值,给出 O(Nlog3⁡5),但插值需要相关小整数可逆。若系数域含足够高阶单位根且变换长度可逆,FFT把系数转换为点值,逐点相乘后逆变换,可达 O(Nlog⁡N) 次域运算。Karatsuba 的三个子乘积通过相减恢复交叉项,适用于任意交换环;Toom 的求值插值与 FFT 的单位根蝶形各有额外代数条件。这些路线都使用分治组织较小规模的运算。

直觉

卷积公式的困难不是某个系数难算,而是所有系数共享大量乘积。分治算法寻找可复用的线性组合:Karatsuba 用一次“和的乘积”同时携带两个交叉块,Toom–Cook 把更多分块看成一个较低次数的外层多项式,变换算法则干脆选择一个乘法已经对角化的点值坐标系。算法越快,越依赖系数环允许做哪些加法、除法和单位根运算。

M(N) 只约束环运算次数,本身不提供空间界。逐对累加的 schoolbook 实现保存 m+n−1 个输出系数,另需 O(1) 个系数累加槽位;按深度优先顺序复用子问题缓冲区的标准 Karatsuba,或采用长度 O(N) 变换的 FFT 乘法,可使用 O(N) 个系数工作槽位,递归控制信息和系数 bit 存储另计。

M(N) 是代数运算模型中的接口,不等于 bit complexity。若系数是 b bit 整数,一次系数乘法的成本随 b 增长,输出系数的 bit 长度可达到约 2b+log⁡N;若系数是浮点数,逐次蝶形会累积舍入误差;若系数在 Fp 中,所需的 2N 次单位根可能根本不存在。把“O(Nlog⁡N) 个域运算”直接翻译成同样数量的机器指令,会漏掉这些决定实现的条件。

多项式系数卷积的输出反对角线
例子与边界

令 A=1+2x+3x2+4x3、B=5+6x+7x2+8x3,按 s=2 分块:

A0=1+2x, A1=3+4x,B0=5+6x, B1=7+8x.

三次子乘积为

P0=5+16x+12x2,P2=21+52x+32x2,

以及 PΣ=(4+6x)(12+14x)=48+128x+84x2。交叉块是 P1=PΣ−P0−P2=22+60x+40x2,故

AB=P0+x2P1+x4P2=5+16x+34x2+60x3+61x4+52x5+32x6.

这个四项例子只节省一次子乘法,递归到大规模后才形成指数差异。

FFT 路线有明确边界。长度补零不足会计算循环卷积;在 F17 中存在阶 16 的单位根,可做长度 8 的数论变换,但在任意给定域中不能假定同样的根存在。复数 FFT 乘整数多项式时还要证明舍入后能唯一恢复精确系数。对极稀疏而指数巨大的输入,先建长度 N 的向量可能已经不可行,项表乘法反而更合适。

推论与应用

快速除法也由乘法接口控制。把首一除数 B 的系数反转为 B∗ 后,商的高位可转化为求 B∗ 在模 xk 下的逆。若已有精度 m 的近似 Hm 满足 B∗Hm≡1(modxm),Newton 提升

H2m=Hm(2−B∗Hm)modx2m

把正确精度翻倍。各层乘法规模按几何级数增长,在标准 M 假设下总成本为 O(M(N));再将被除式的反转多项式乘以这个截断逆,截取并反转得到商 Q,最后计算 A−BQ 得余式。公式要求常数项可逆,通常通过除数首项归一化保证,不能对一般含零因子的环无条件使用。

乘法因而成为子乘积树、快速求值、插值、GCD、结式和精确线性代数的公共成本单位。实现上应按规模分层:小输入用 schoolbook 以避免递归开销,中等输入切换 Karatsuba 或 Toom,大输入在单位根与内存条件合适时使用变换。阈值来自实测,却不改变算法正确性;真正不可省略的是系数域假设、结果长度和精确性口径。

参考资料
  • Joachim von zur Gathen and Jürgen Gerhard, Modern Computer Algebra, 3rd ed., Cambridge University Press, 2013, Chs. 8–9.
  • Alin Bostan and Éric Schost, “Polynomial Evaluation and Interpolation on Special Sets of Points,” Journal of Complexity 21(4), 2005, pp. 420–446.
  • Alfred V. Aho, John E. Hopcroft, and Jeffrey D. Ullman, The Design and Analysis of Computer Algorithms, Addison–Wesley, 1974, §8.2.
关系图谱10 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系