多项式的根是mod的素数

时间:2015-03-12 03:13:11

标签: algorithm sympy polynomial-math polynomials

我正在寻找一种快速算法来找到素数有限域中单变量多项式的根。

也就是说,如果f = a0 + a1x + a2x2 + ... + anxn(n> 0),那么对于给定的素数p,找到满足r < p的所有f(r) = 0 mod p的算法。

我找到了Chiens搜索算法https://en.wikipedia.org/wiki/Chien_search,但我无法想象这对于大于20位的素数来说是快速的。有没有人有使用Chien的搜索算法的经验或知道更快的方法?这是否有一个sympy模块?

2 个答案:

答案 0 :(得分:13)

正如mcdowella的评论所指出的那样,这是非常好的研究。以下是Cantor-Zassenhaus random algorithm如何处理您想要找到多项式的根的情况,而不是更一般的因子分解。

注意在具有系数mod p的多项式环中,乘积x(x-1)(x-2)...(x-p + 1)具有所有可能的根,并且等于x ^ px by { {3}}和此环中的唯一因子分解。

设定g = GCD(f,x ^ p-x)。使用Fermat's Little Theorem计算两个多项式的GCD通常很快,采用最大程度对数的多个步骤。它不要求您考虑多项式。 g在该领域具有与f相同的根,并且没有重复的因子。

由于x ^ px的特殊形式,只有两个非零项,欧几里德算法的第一步可以由Euclid's algorithm完成,在大约2 log_2(p)步骤中只涉及度数的多项式系数mod p,是f的两倍。我们可以计算x mod f,x ^ 2 mod f,x ^ 4 mod f等,然后将对应于p的二进制展开中的非零位置的项相乘以计算x ^ p mod f,最后减去x。

反复执行以下操作:在Z / p中选择随机d。使用r_d =(x + d)^((p-1)/ 2)-1计算g的GCD,我们可以使用Euclid算法再次快速计算,使用第一步的重复平方。如果这个GCD的程度严格地在0和g的程度之间,我们发现了一个非平凡因子g,我们可以递归直到找到线性因子,因此得到g的根,从而得到f。

这有效吗? r_d具有d小于非零平方mod p的数字。考虑g,a和b的两个不同的根,因此(x-a)和(x-b)是g的因子。如果a + d是非零平方,而b + d不是,则(xa)是g和r_d的公因子,而(xb)不是,这意味着GCD(g,r_d)是g的非平凡因子。类似地,如果b + d是非零平方而a + d不是,则(x-b)是g和r_d的公因子,而(x-a)不是。根据数论,一个案例或另一个案例接近d的可能选择的一半,这意味着在我们找到g的非平凡因子之前平均需要d的选择,实际上是一个分离(xa)来自(xb)。

答案 1 :(得分:1)

你的答案很好,但我想我找到了一个很好的方法来找到以任何数字为模的根:这种方法基于“LATTICES”。让 r R 成为 mod p 的根。我们必须找到另一个函数,例如 h(x),使 h 不大,而 r h的根。 Lattice方法找到这个功能。在第一次,我们必须为格子创建多项式的基础,然后,使用“LLL”算法,我们找到一个“最短向量”,其根 r 没有模 p 。事实上,我们用这种方式消除了模数 p

有关更多说明,请参阅“Coppersmith D.找到小度多项式的小解。在密码学和格子中”。