在之前关于“多值函数的图像保持(Image Preservation of Multivalued Functions)”的章节中,我们看到,与其在 次单位根上计算 ,不如将 转换为一个多值函数,并在定义域 上对其进行求值。
展开平方根
将 1 的 8 次根看作嵌套的平方根会更容易理解:
现在我们展示如何计算:
使用平方根展开的方法。
我们知道 的计算结果为 ,因此我们将 1 的最内层平方根替换为它的求值结果:

这“消除”了一层平方根。接下来,我们计算 和 。由于我们是在 8 次单位根上进行计算,,因此

然后,我们计算剩余的每一个平方根:

观察发现,求值树的“叶子”恰好是 在 8 次单位根上的求值结果。
在 8 次单位根上计算
平方根展开的妙处在于,对于 的大多数幂次,平方根会像这个例子所展示的那样“尽早消失”。我们将 替换为 ,但由于 是平方,我们最终得到的是 或者
下面是不断展开平方根直到获得 8 个求值结果的求值树。在最后一行,当没有平方根时,我们直接将对应的值复制下来。

现在观察一下,如果我们直接在 上对 8 次单位根 进行求值会发生什么——结果是完全一样的。
在 8 次单位根上计算
同样地,我们将 替换为 ,这会得到 。由于我们只有一个平方根,我们将只对平方根进行一次展开,然后简单地将结果复制下来即可。

我们在前面的章节中看到,如果 在 的偶数次幂上求值,结果为 1,否则为 -1。这里的结果与预期完全一致。
在 8 次单位根上计算
如果我们将 替换为 ,我们会得到一个有些尴尬的结果:
然而,如果我们先提取出 ,将 转换为 ,那么当我们将 替换为 时,新形式就变得容易处理得多:
第一层平方根将在第一次求值后消失,并且在求值树的大部分节点中, 将变成一个常数。
下面是展开平方根的图解。在每一层,我们解开(求值)一个平方根。蓝色的平方根代表每一步被求值的部分。作为一个通用规则,如果是嵌套的平方根,请对最内层的平方根进行求值:

现在,让我们将该结果与在 8 次单位根上逐个计算 的结果进行比较:
使用上述方法计算各项需要进行 8 次加法和 16 次乘法。
但是,使用平方根展开,我们只需要 2 次加法和 10 次乘法。每当一个平方根被展开为它的两个解时,我们就将它与相邻的项相乘。因此,每当解开“最终”的平方根时,就会产生两次乘法。这些在下图中用红色高亮显示。加法用蓝色高亮显示。

请注意,“计算平方根”是完全确定性的。我们知道它总是遵循 、2 次单位根、4 次单位根、8 次单位根等等这样的规律。因此,不需要显式地计算平方根。
简单项与困难项
我们可以看到, 项最容易计算,因为它们只需要进行 1 次求值,剩余部分只需沿求值树向下复制对应的值即可。
另一方面,没有幂次(也就是 1 次方)的 是“最困难”计算的,因为在沿求值树向下的每一步中,我们都需要进行平方根展开。
函数 的美妙之处在于,当它在 次单位根上变为多值函数 时,我们在求值树的第二层就完全计算出了平方根,在剩余的计算过程中,只需将 的和复制下来即可。
实际上,任何多项式都可以被改写为“最大化” 项的数量并“最小化” 项的数量。
假设我们有一个 7 次多项式,想要在 8 次单位根上进行求值。
为了使 项的数量最大化且只保留一个 项,我们将其因式分解如下:
练习: 在 4 次单位根上计算多项式 时,应当如何对其进行因式分解,才能使其只有一个 项并包含尽可能多的 项?请记住,在这种情况下 就是 。
在下一章中,我们将展示如何使用平方根展开计算一般的 4 次和 8 次多项式,这也恰好就是 NTT 算法。