除以小的未知多项式时,找到大的固定多项式的余数


9

假设我们在一个有限域中工作。在此字段上,我们得到了一个大的固定多项式p(x)(例如,度为1000)。该多项式是事先已知的,我们被允许在“初始阶段”使用大量资源进行计算。这些结果可以存储在相当小的查询表中。

在“初始阶段”结束时,我们将得到一个小的未知多项式q(x)(例如,小于等于5级)。

如果允许我们在“初始阶段”进行一些复杂的计算,是否有一种快速的方法来计算p(x)mod q(x)?一种明显的方法是为q(x)的所有可能值计算p(x)mod q(x)。有一个更好的方法吗?

Answers:


3

如果基础字段的阶数很小,以下算法会很好地起作用 s

假设我们知道 q 是不可还原的 d。然后,国防部q, 我们知道 xsd=x持有。因此,足以预先计算。p(x)modxsdx

通常,可以分解为不可约多项式。在这种情况下,类似的参数适用于分别计算每个模,然后将结果拼接在一起。因此,我们确实需要为每个计算。q(x)q=q1qrpq1,,qrp(x)modxsdxdd


2

我认为有一个非常快速的方法可以做到这一点。让未知多项式的系数为,所以,其中是一些小的数目。现在让我们开始计算其中,其中大并且是已知的。我们使用来降低度数。最终我们得到的是度多项式,其系数是多项式(因为qbiq=i=0dbixidp(modq)p=i=0DaixiDaiaDxD=aDbdi=1d1bdixDi<d1biai是已知的)。这些多项式一旦得到就可以快速计算。q


-1

请在下面查看有关此帖子的出色评论。:)


预处理;输入: p(x)

  1. 因子为。p(x)p(x)=i=01000(xiri)

  2. 存储此为表不同的根的和它们各自的多重。Trjmj

在线阶段;输入: q(x)

  1. 将为。q(x)q(x)=i=05(xiri)

  2. 存储这个作为一个列表不同的根的和它们各自的多重。Lrjmj

  3. 当不为空时,从和任何类似项中删除下一个根/重数。LLT

  4. 从修改后的表读取并输出。p(x)modq(x)T


其他的建议:

  • 显然,您希望对表进行排序,并通过二进制搜索(或树)对其进行访问。T
  • (让为的度。)如果希望输出以系数表示,则只需在最后进行一堆FFT即可得到时间。dp(x)p(x)modq(x)O~(d)
  • 根据您对它进行形式化的方式,您可能会预先计算出许多将中的术语重新组合在一起的各种方式(动态编程风格),因此大多数(或全部)乘法只是查找。那么,主要的开销就是查找次数,或者大约是。如果,这只是一些具体的算术运算。TO(logd)d=1000

2
您将p放在哪个字段?您希望这种表示形式在原始字段方面有多大?当您说要从修改后的表和输出中读取时,您的意思是什么?
David Eppstein

2
仅当您在和拆分的字段上操作时,这才起作用。但这似乎取决于 ; 特别是,您不能单独计算的根。此外,在如此大的字段上计算的根需要时间(至少); 这并不比朴素的算法好。pqqpq|p|
大卫·哈里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.