9 假设我们在一个有限域中工作。在此字段上,我们得到了一个大的固定多项式p(x)(例如,度为1000)。该多项式是事先已知的,我们被允许在“初始阶段”使用大量资源进行计算。这些结果可以存储在相当小的查询表中。 在“初始阶段”结束时,我们将得到一个小的未知多项式q(x)(例如,小于等于5级)。 如果允许我们在“初始阶段”进行一些复杂的计算,是否有一种快速的方法来计算p(x)mod q(x)?一种明显的方法是为q(x)的所有可能值计算p(x)mod q(x)。有一个更好的方法吗? cc.complexity-theory ds.algorithms algebra algebraic-complexity polynomials — 保罗沃特斯 source
3 如果基础字段的阶数很小,以下算法会很好地起作用 ss。 假设我们知道 qq 是不可还原的 dd。然后,国防部qq, 我们知道 xsd=xxsd=x持有。因此,足以预先计算。p(x)modxsd−xp(x)modxsd−x 通常,可以分解为不可约多项式。在这种情况下,类似的参数适用于分别计算每个模,然后将结果拼接在一起。因此,我们确实需要为每个计算。q(x)q(x)q=q1…qrq=q1…qrppq1,…,qrq1,…,qrp(x)modxsd′−xp(x)modxsd′−xd′≤dd′≤d — 戴维·哈里斯 source
2 我认为有一个非常快速的方法可以做到这一点。让未知多项式的系数为,所以,其中是一些小的数目。现在让我们开始计算其中,其中大并且是已知的。我们使用来降低度数。最终我们得到的是度多项式,其系数是多项式(因为qqbibiq=∑di=0bixiq=∑i=0dbixiddp(modq)p(modq)p=∑Di=0aixip=∑i=0DaixiDDaiaiaDxD=−aDbd∑d−1i=1bd−ixD−iaDxD=−aDbd∑i=1d−1bd−ixD−i<d−1<d−1bibiaiai是已知的)。这些多项式一旦得到就可以快速计算。qq — 多摩普 source
-1 请在下面查看有关此帖子的出色评论。:) 预处理;输入: p(x)p(x) 因子为。p(x)p(x)p(x)=∏1000i=0(xi−ri)p(x)=∏i=01000(xi−ri) 存储此为表不同的根的和它们各自的多重。TTrjrjmjmj 在线阶段;输入: q(x)q(x) 将为。q(x)q(x)q(x)=∏5i=0(xi−r′i)q(x)=∏i=05(xi−ri′) 存储这个作为一个列表不同的根的和它们各自的多重。LLr′jrj′m′jmj′ 当不为空时,从和任何类似项中删除下一个根/重数。LLLLTT 从修改后的表读取并输出。p(x)modq(x)p(x)modq(x)TT 其他的建议: 显然,您希望对表进行排序,并通过二进制搜索(或树)对其进行访问。TT (让为的度。)如果希望输出以系数表示,则只需在最后进行一堆FFT即可得到时间。ddp(x)p(x)p(x)modq(x)p(x)modq(x)O~(d)O~(d) 根据您对它进行形式化的方式,您可能会预先计算出许多将中的术语重新组合在一起的各种方式(动态编程风格),因此大多数(或全部)乘法只是查找。那么,主要的开销就是查找次数,或者大约是。如果,这只是一些具体的算术运算。TTO(logd)O(logd)d=1000d=1000 — 丹尼尔·阿蓬 source 2 您将p放在哪个字段?您希望这种表示形式在原始字段方面有多大?当您说要从修改后的表和输出中读取时,您的意思是什么? — David Eppstein 2 仅当您在和拆分的字段上操作时,这才起作用。但这似乎取决于 ; 特别是,您不能单独计算的根。此外,在如此大的字段上计算的根需要时间(至少); 这并不比朴素的算法好。ppqqqqppqq|p||p| — 大卫·哈里斯