多项式

是一个以 为自变量的 上的多项式。例如,

就定义了一个 次多项式。 是常数项。 次多项式有 个系数。 我们经常想要将自变量 用一个具体值 替换掉,以计算其在该具体值 处的值,表示为

在数学上这通常被称为 “求 在点 处的值”。 所谓“点”,是从多项式的几何表示来的, 将多项式表示为 ,那么 就是一个二维空间中的一个点的坐标。 但是我们处理的多项式通常总是等于零,并且 是一个某个域中的元素。 不应该与椭圆曲线的点混淆,椭圆曲线上的点的说法我们也要经常使用,但是不在多项式求值的语境下使用。

重要说明:

  • 多项式相乘,将产生这样一个积多项式,该多项式的次数是其因子多项式的次数的和。多项式除法,则会减去相应的次数。

  • 给定一个 次多项式 ,如果我们在 个不同点求取了多项式的值,那么这些值就能唯一确定该多项式。 换句话说,给定 个不同点值,我们就能通过多项式插值来唯一确定 次多项式

  • 是多项式 系数表示, 我们也可以用它在 个不同点处的 点值表示 来表示它。不管那种表示方法,都唯一确定了相同的多项式。

(备注) 霍纳法则

霍纳法则可以仅仅使用 次乘法和 次加法就高效地求得一个 次多项式在某处的取值。 霍纳法则如下:

快速傅里叶变换 (FFT)

FFT是一种在系数表示和点值表示之间进行转换的高效方法。它在多项式的 次单位根上求取多项式的值。 这 次单位根是 其中 是多项式的主单位根。 通过利用单位根中的对称性,FFT的每一轮计算都只计算问题规模的一半。绝大多数情况下,我们都要求多项式的次数是 的 幂次,即 ,并递归运用减半算法。

动机:快速计算多项式乘法

在系数表示下,计算多项式相乘需要 次计算。 比如,

显而易见,第一个多项式中的 项必须与第二个多项式的 项相乘。

而在点值表示下,多项式相乘仅仅需要 计算:

每个值都按照点的顺序相应计算即可。

这就提示了如下的快速计算多项式乘法的策略:

  1. 对多项式在 个点处求值(转成点值表示)

  2. 在点值表示下,按照点的顺序依次计算积多项式的点 () (计算积多项式的点值表示);

  3. 将积多项式的点值表示转换成系数表示。

现在的挑战就是如何高效地进行多项式 求值插值。 最朴素的方法,对多项式在 个点处进行求值将需要 计算(我们在每一个点处都使用 的霍纳法则):

方便起见,我们将如下表示上面的矩阵:

就是 离散傅里叶变换 也被称为 范德蒙矩阵。)

(radix-2) Cooley-Tukey 算法

我们的策略就是将一个规模为 的 DFT 分成两个规模分别为 的 DFT。假定多项式 我们将其按照奇数项和偶数项进行拆分:

于是原多项式就是:

尝试在 and , 处求值,我们就能发现某些对称性:

值得注意的是,我们仅仅在一半的domain上求取 这是因为 (折半引理)。

但是这些值却能帮助我们在完整domain 上求出 。 这就意味着,我们将一个成都为 的 DFT 转化成了两个长度为 的 DFT。

我们选择 的幂次(必要时,可以添 补齐),然后递归地运用这种分治策略。 由主定理可知1,这种多项式求值算法仅需要 计算,这就是著名的快速傅里叶变换(FFT)。

逆FFT

我们已经求得了多项式的值并将它们按照点的顺序进行了相乘。剩下的工作就是要把积的点值表示转换成系数表示。 做这件事,我们仍然是在点值上调用FFT。只不过,这次我们将做如下修正:

  • 将范德蒙矩阵中的 替换掉
  • 把最后的结果乘以

也就是:

(为了理解为什么逆FFT与FFT有相似的形式,请参考 13-1 2。下图也是从 2来的。)

Schwartz-Zippel 引理

Schwartz-Zippel 引理的通俗解释就是 “不同的多项式在绝大多数点上的值都是不同的”。 它的正式表述如下:

是有 个变量的 次非零多项式。 是一个至少有 个元素的集合。如果我们从 中随机选择 ,

是我们更熟悉的单变量多项式的情况下,如 退化成,一个 次的非零多项式至多有 个根。

Schwartz-Zippel引理可以用来检验两个多项式是否相等。设有两个多变量的多项式 ,它们的次数分别是 。 我们选取随机数 ,其中 的元素个数至少是 , 进而验证 是否都成立。 如果两个多项式相同,那么上式会一直成立,而如果两个多项式不相同,那么上式成立的概率至多就是

Vanishing多项式

考虑这样一个 -阶乘法子群 ,它的主单位根是 。 对所有 ,有 。这就是说 中的每个元素都满足如下等式

这就是说每个元素都是 的根。我们称 就是在 上的 Vanishing 多项式 因为该多项式在 中每个元素处的取值都为

这在检验多项式约束的时候尤其有用。举个例子, 检验 上的正确性,我们只需简单地验证 倍数。这就是说,如果我们的约束除以消除多项式,仍然是一个多项式,即: ,那么我们就说在 成立。

拉格朗日基函数

TODO: explain what a basis is in general (briefly).

多项式通常以单项式基(例如,)来表示。但是当我们在一个 阶乘法子群上工作时,我们 找到了更加自然表示方式,就是以拉格朗日基来表示。

考虑一个 -阶乘法子群 ,它的主单位根是 。则该子群相应的拉格朗日基就是这样一个函数集合 , 其中

我们可以更简洁地写为 其中 就是Kronecker delta函数。

于是,我们可以用拉格朗日基函数的线性组合来表示我们的多项式,

上式其实就等价于我们说 的值是 的值是 ,在 的值是 等等。

当我们在一个乘法子群上工作时,拉格朗日基函数有一个很方便的稀疏表示形式:

其中 质心权重。(欲理解该形式如何推导,请参考3。) 对 ,有

.

假设我们有一系列多项式的值 。 由于我们不能假设 会形成一个乘法子群,我们就用拉格朗日多项式 的一般形式 于是我们构建:

这里,任何 都会产生一个分子为 的项 ,这就导致 整个的积就是 。另一方面,当 时,每一项都是 因此整体的积就是 。于是我们给出了在集合 上的 Kronecker delta 函数

拉格朗日插值

设给定一个多项式的点值表示如下,

我们可以利用拉格朗日基重建其系数表示:

其中

References