“先为线性模数 $x u i$ 建立子乘积树。在根处令余式 $r {h,0}=f\bmod M {h,0}$;对每个内部结点递推”
形式陈述
在交换含幺环
并递推
根为
令
该对象是带多项式标签的平衡二叉树,而不是只保存叶子乘积的一个公式。保留全部层时,每层系数记录和结点数均为
直觉
逐个构造
更重要的是,中间结点记录了叶子集合的“共同模数”。从根向下计算余式时,父结点上的一个余式只需分别模两个子结点,而无需重新处理原始大多项式;从叶子向上插值时,兄弟结点的乘积又提供了把两块局部答案嵌回全局的乘子。因此树的价值不只是更快得到根积,而是保存了一张可沿两个方向遍历的代数路由图。
例子与边界
对求值点
第一层两结点是
根则为
若随后要把多项式
重复点并不妨碍建树:点列
复杂度式还隐藏了存储边界。保留全部层虽然渐近上方便,却可能让大系数复制占主导;只保存根又会迫使每次下降重新建子积。最佳策略取决于查询次数和内存预算。对于单位根等特殊点集,FFT 可直接一次变换求值,通用子乘积树的额外
推论与应用
子乘积树向下支撑快速多点求值:每个结点携带对其叶子乘积的余式。向上则支撑乘积树快速插值:左右局部线性组合分别乘以对侧的子积,再相加成为父结点答案。同一骨架还实现多模约简、多项式 Chinese remainder 重构和批量有理函数求值。
在复杂算法中,树常与反转多项式的快速除法结合。模数都是首一时,长除法不需要倒置不可逆的首项;若使用 Newton 反演加速,还要确保相应反转多项式的常数项为单位。把这些代数条件写在余式子程序接口中,可以让上层树递归只负责划分点集,不把“某次除法是否存在”分散到每个结点。
参考资料
- Joachim von zur Gathen and Jürgen Gerhard, Modern Computer Algebra, 3rd ed., Cambridge University Press, 2013, Ch. 10.
- Robert T. Moenck and Allan Borodin, “Fast Modular Transforms,” Journal of Computer and System Sciences 8(3), 1974, pp. 366–386.
- Arne Storjohann, CS 487/687 Symbolic Computation: Script 7—Fast Evaluation and Interpolation, University of Waterloo lecture notes.