在本系列文章的开头,我们讨论过,如果两个次数不超过 的多项式乘法都采用点值形式,那么可以在 的时间复杂度内完成。
在实际应用中,困难在于多项式通常以系数形式给出,而且我们希望乘法的结果也采用系数形式。
幸运的是,这些问题可以通过使用快速版本的 NTT 和 INTT 来解决。
要在 时间内对以系数形式表示的两个多项式进行相乘,过程如下:
- 使用 NTT,将多项式从系数形式转换为点值形式。
- 将点值形式的多项式进行逐点乘法。这可以在 的时间复杂度内完成,结果同样为点值形式。
- 使用 INTT 将得到的结果多项式转换回系数形式。
使用 次单位根(其中 是 2 的幂),步骤 1 和 3 可以在 的时间内完成。
唯一的限制是,我们必须限制结果多项式的最高次数为 。因此,我们要相乘的两个多项式的次数之和不能超过 。
在实践中,这通常不是问题,因为我们通常可以使用包含足够大的 次单位根的域,使得多项式的次数保持在允许的范围内。
次数小于 的多项式也不会成为问题,因为可以用值为零的系数将它们填充至 次。
如果不使用快速 NTT 和 INTT,多项式乘法的时间复杂度将为 。
本章的目的就是证明我们的主张。我们将证明:在系数形式下将两个多项式相乘,等价于对每个多项式应用 NTT,进行逐点乘法,然后对通过该操作得到的结果多项式应用 INTT。
这个结果在多项式乘法的语境中被称为卷积定理。在更一般的语境下,卷积定理指出:
“原域中的卷积等价于变换域中的逐点乘法。”
为了正确理解这个定理,我们需要从定义什么是卷积开始。
不太倾向于数学的读者可以跳过本章,这不会影响阅读的连贯性。在接下来的正文中,我们将证明卷积定理,但如果读者只对其应用感兴趣,只需接受它可以用于在 而不是 的时间复杂度内进行多项式乘法即可。
卷积
在系数形式下将两个多项式相乘是卷积操作的一个例子。
考虑两个次数为 2 的多项式,
和
在系数形式下进行乘法,得到多项式
重新排列这个表达式,我们得到
因此, 和 相乘所得多项式的系数为
这些系数可以用以下公式简洁地表达
其中 ,即多项式 的次数。让我们检查其中一个系数 。对于这个系数,我们有
因为 和 均为零(因为多项式 和 的次数为 2),该式化简为
正如预期。
由下式定义的操作
称为卷积,通常写为
其中 表示卷积运算符。
卷积定理
我们的目标是证明:将 和 转换为点值形式,将对应的点相乘,再将结果转换回系数形式,这一过程等价于对 和 的系数进行卷积。
考虑多项式
和
它们的次数分别为 和 。
将 和 相乘会产生一个新的多项式 ,其次数分别是 和 的次数 和 的和。
假设 的次数为 。
因此,我们想要计算
如果次数小于 ,我们可以用零来填充高次项的系数。
我们将多项式 和 的系数表示为
上面的一些高次系数将为零,因为 和 的次数之和最多只能为 。这不是问题。我们唯一的限制是
我们的第一步是将多项式 和 从系数形式转换为点值形式。
**第一步:**将多项式转换为点值形式。
为了将这些多项式转换为点值形式,我们使用 NTT。通过选择 为 2 的幂,我们可以应用快速变换。然而,由于最终结果等价于乘以范德蒙德矩阵,我们将展示矩阵形式的表述。
例如,对于多项式 ,其在 次单位根处的计算值由下式给出
同样,对于 ,
这些矩阵运算可以在分量形式上写成
和
例如, 的求值由下式给出
**第二步:**对点值形式的多项式进行逐点乘法。
我们现在将 和 的计算值进行逐点乘法,以得到乘积多项式 的计算值:
在索引记法中,这可以写成
使用上一步得到的 和 的表达式,我们得到
简而言之,我们想要证明的是,如果我们对点值形式(即上述形式)的多项式 执行 INTT,结果与对 和 执行卷积相同。
**最后一步:**对点值形式的多项式 应用 INTT
在 次单位根上执行的逆数论变换(Inverse Number Theoretic Transform)是使用按比例 缩放的范德蒙德矩阵 来计算的。
因此,通过对点集 应用 INTT,我们得到系数形式的多项式 :
这可以写成分量形式:
利用 由下式给出这一事实:
我们得到
这个表达式很长,但可以通过应用单位根的正交性来进行化简。
首先,让我们将所有 的幂项分组:
上述表达式表明,我们可以使用单位根的正交性来对其进行化简。
回顾一下单位根的正交性公式:
在 提取出的单位根之和中使用上述公式,我们注意到
如果 (等价于 ),则其等于 ;否则等于 0。
这可以表示为 乘以克罗内克 δ 函数(Kronecker delta):
将 表达式中的
替换掉,我们得到
常数 和 相互抵消:
更重要的是,当对索引 求和时,除了 的情况外,所有项都消失了。这是由于单位根的正交性。
结果,关于 的求和被折叠(消除),我们可以将 中的求和替换为单一元素 。我们得到
这正是卷积公式!
让我们回顾一下刚才所做的步骤:
- 我们对多项式 和 应用了 NTT,将其系数表示转换为点值表示,也就是包含了它们在 次单位根处计算值的向量:
- 我们将这些计算值进行了逐点乘法,也就是说对于每个单位根 ,我们计算了
从而获得了乘积多项式 的点值表示。
- 我们对这个数值向量
应用了 INTT,以恢复 的系数表示。
我们证明了这三个步骤与多项式 和 相乘(即将 和 的系数进行卷积)产生的结果完全相同。
然而,直接卷积的时间复杂度为 ,而上述过程可以在 时间内执行,并得到相同的最终多项式。
这正是卷积定理所述的内容。用更正式的方式,我们可以这样写:
设 和 为两个系数形式的多项式。令 表示卷积操作, 表示乘法。
设 表示对 应用 NTT(即如果 是系数向量,则 为计算值向量),并设 表示对 应用 INTT。那么,
表达卷积定理的另一种方式是
这是一个线性变换,可以这样理解:系数域中的卷积等价于点值域中的逐点乘法。
本文是我们 ZK Book 中关于数论变换(Number Theoretic Transform)系列文章的一部分