正如上一篇文章中所见,Inverse Number Theoretic Transform (INTT) 与 NTT 一样,都是使用 Vandermonde 矩阵来执行的。这表明通过 NTT 进行的求值(evaluation)和通过 INTT 进行的插值(interpolation)是相似的操作。
直接使用 Vandermonde 矩阵进行求值或插值的问题在于,将一个 k×k 矩阵与一个向量相乘需要 O(k2) 的时间。幸运的是,当使用 k 次单位根(且 k 是 2 的幂)时,可以使用一种不依赖于矩阵乘法的快速方法,将时间复杂度降低到 O(klogk)。
NTT 的快速方法已在“NTT Algorithm by Hand.”一章中介绍过。在本章中,我们将研究 INTT 的快速方法。
其思想很简单:将多项式插值解释为一种求值过程,从而允许使用与 NTT 相同的方法。
求值与插值
简而言之,NTT 允许我们将一个最高次数为 k−1 的多项式从其系数形式(coefficient form):
a0a1...ak−1
转换为点值形式(point-value form):
f(ω0)f(ω1)...f(ωk−1)
这是通过在 k 次单位根处对多项式进行求值来实现的。这被称为求值(evaluation)。
插值(Interpolation)是求值的逆过程:它是将多项式从其点值形式转换为系数形式的过程。
将插值视为求值
在 k 次单位根处的求值和插值是相似的操作,因为它们都是使用 Vandermonde 矩阵执行的。
为了更直观地理解,考虑一个最高次数为 3 的多项式,
f(x)=a+bx+cx2+dx3,
在 4 次单位根处进行求值:
f(1),f(ω),f(ω2),f(ω3).
求值过程可以写成:
f(1)f(ω)f(ω2)f(ω3)=11111ωω2ω31ω2ω4ω61ω3ω6ω9abcd.
插值过程可以写成:
abcd=4111111ω−1ω−2ω−31ω−2ω−4ω−61ω−3ω−6ω−9f(1)f(ω)f(ω2)f(ω3).
受求值结构的启发,我们可以将 4f(1),4f(ω),4f(ω2) 和 4f(ω3) 视为一个新多项式 f~(x) 的系数,定义为:
f~(x)=41(f(1)+f(ω)x+f(ω2)x2+f(ω3)x3).
按照这种说法,系数 a,b,c 和 d 即是 f~(x) 在以下点的求值:
abcd=f~(1)=f~(ω−1)=f~(ω−2)=f~(ω−3)
因此,我们可以将插值解释为另一个多项式的求值。关键的观察在于,逆 NTT 并不需要一种本质上不同的算法。
一旦将点值表示重新解释为一个新多项式的系数向量,插值就变成了在一组经过排列的单位根上的求值。从这个意义上说,求值和插值是相同的操作。
避免处理单位根的逆元
正如在以下变换中所见:
abcd=4111111ω−1ω−2ω−31ω−2ω−4ω−61ω−3ω−6ω−9f(1)f(ω)f(ω2)f(ω3),
插值涉及在单位根的逆元处进行求值。然而,我们可以避免直接处理这些逆元。
考虑 ω−1。在 4 次单位根中,它是与 ω 相乘结果为 1 的元素。由于:
ω⋅ω3=ω4≡1,
我们有 ω−1=ω3。
同理,
ω−2ω−3=ω2,=ω.
因此,系数 a,b,c 和 d 也就是:
f~(x)=41(f(1)+f(ω)x+f(ω2)x2+f(ω3)x3)
在以下各点的求值:
abcd=f~(1),=f~(ω−1)=f~(ω3),=f~(ω−2)=f~(ω2),=f~(ω−3)=f(ω).
利用 ω2=−1 这一性质,我们可以将它们重写为:
abcd=f~(1),=f~(ω3)=f~(−ω),=f~(ω2)=f~(−1),=f~(ω).
手动推导 INTT
对于最高次数为 k−1 的多项式(其中 k 是 2 的幂),可以使用在 NTT Algorithm by Hand. 一章中解释的快速方法,在 k 次单位根处对其进行求值。
关于
f~(x)=41(f(1)+f(ω)x+f(ω2)x2+f(ω3)x3)
在 f~(1),f~(−1),f~(ω) 和 f~(−ω) 处的求值过程如下图所示。
核心思路是将偶数次幂和奇数次幂进行分组,如下所示:
f~(x)=41(f(1)+f(ω2)x2)+x(f(ω)+f(ω3)x2)),
并在 1 处对 f~(x) 进行求值。在每一次计算最内层平方根时,表达式都会分支成两个,分别对应平方根的两个值。这一过程会持续进行,直到没有剩余的平方根为止,此时该过程结束。

我们得到:
abcd=f~(1)=41(f(1)+f(ω)+f(ω2)+f(ω3)),=f~(−ω)=41(f(1)−f(ω2)−ω(f(ω)−f(ω3))),=f~(−1)=41(f(1)+f(ω2)−(f(ω)+f(ω3))),=f~(ω)=41(f(1)−f(ω2)+ω(f(ω)−f(ω3))).
让我们确认这是否与从 Vandermonde 矩阵获得的结果一致:
abcd=4111111ω−1ω−2ω−31ω−2ω−4ω−61ω−3ω−6ω−9f(1)f(ω)f(ω2)f(ω3).
利用:
ω−1ω−2ω−3=ω3=−ω,=ω2=−1,=ω,
我们将其重写为:
abcd=4111111−ω−1ω1−11−11ω−1−ωf(1)f(ω)f(ω2)f(ω3).
进而得出:
abcd=f~(1)=f~(−ω)=f~(−1)=f~(ω)====41(f(1)+f(ω)+f(ω2)+f(ω3)),41(f(1)−f(ω2)−ω(f(ω)−f(ω3))),41(f(1)+f(ω2)−(f(ω)+f(ω3))),41(f(1)−f(ω2)+ω(f(ω)−f(ω3))).
这与快速算法所得出的表达式完全相同。
关键的区别在于,快速算法在 O(klogk) 的时间内运行,而直接进行矩阵乘法需要 O(k2) 的时间。
k−1 次多项式
我们在上一节中针对 3 次多项式所做的推导,可以推广到任意次数的多项式。
假设我们有一个在 k 次单位根处求值的多项式 f(x),其中 k 是 2 的幂:
f(ω0),f(ω1),f(ω2),...,f(ωk−1)
为了恢复经过这些点且最高次数为 k−1 的多项式 f(x) 的系数,我们定义一个新多项式 f~(x) 如下:
f~(x)=k1(f(1)+f(ω)x+f(ω2)x2+...+f(ωk−1)xk−1)
那么 f(x) 的系数就可以表示为:
a0a1a2...ak−1=f~(ω0)=f~(ω−1)=f~(ωk−1)=f~(ω−2)=f~(ωk−2)=f~(ω−(k−1))=f~(ω1)
本文是我们的 ZK Book 中关于数论变换(Number Theoretic Transform)系列文章的一部分