NTT(数论变换)算法将有限域上的多项式从系数表示法转换为点值表示法。
如果多项式的次数为 ,那么我们会在 次单位根上对其进行求值,其中
我们不是在 次单位根集合 的每个点上逐一计算多项式 ,而是利用多值函数的像保持定理来对多值函数进行求值,该多值函数是通过在定义域 上将 中的 替换为 创建的。然后我们将平方根的计算结果从 迭代扩展到 ,再扩展到 ,依此类推,直到将计算结果扩展到 次单位根。
该方法的运行时间为 。
在 4 次单位根上计算
首先,我们对该函数进行因式分解,以最大化 的出现次数,因为 ,且 在单位根上很容易求值(根据单位根的幂是偶数还是奇数,结果只为 )。
这将得到以下函数:
接下来,我们对 进行变换,使得 ,这会得到:
这是平方根展开图:

现在,我们将此结果与逐一在 4 次单位根上计算 进行比较:
我们已知 且 ,并且 。通过代入,我们得到:
练习: 使用上述方法在 4 次单位根上计算 。提示:使用上面的示例并设 。
树的高度为 ,我们在每一行执行 次操作,因此运行时间为 。
在 8 次单位根上计算
首先,我们重新排列多项式以最大化 项的数量(因为 k = 8)。这得到:
现在我们代入 以得到多值函数 :
由于在一张图里画出整棵求值树会非常大,我们将画出求值树的左侧,即我们计算 的部分,并首先展示该图:

从上图可以得出:
现在我们展开求值树的右侧,此时 :

由该结果,我们得出:
将求值结果合并并展开 omega 项,我们得到:
接下来,我们按系数升序排列:
现在,让我们重新排列求值结果,使其按照 、、…、 的顺序排列:
如果我们将此结果与 8 次单位根的 Vandermonde 矩阵进行比较,可以看到我们正确地计算了 的各次幂。
Vandermonde 矩阵计算
上述 Vandermonde 矩阵的推导过程如下。在 时,矩阵的每一行都是 中 的对应幂。
接下来,我们将指数分离出 8 的倍数因子:
消去 8 的倍数因子后,我们有:
在代入 、、、 进行替换后,我们得到了最初的 Vandermonde 矩阵:
练习: 在 8 次单位根上计算 。同样,请注意你可以设 。
练习: 在 (其中 )的 4 次单位根上计算 。使用 Python 寻找一个本原 4 次单位根作为起点。
总结
使用平方根展开法在 次单位根上计算多项式,与逐一在单位根上计算该多项式会得到相同的求值结果。这之所以成立,归功于多值函数的像保持定理(Image Preservation Theorem for Multivalued Functions),因为我们仅仅是在定义域 上对该多值函数进行求值。
这种方法节省了计算成本,因为在每一步中,只有一半的平方根需要被计算并与配对的系数或系数和相乘。对于剩余的求值项,结果只需直接向下复制,而无需重新计算。