我想在整数环上快速分解多项式(原始多项式有整数系数,所有因子都有整数系数)。
例如,我想将4*x^6 + 20*x^5 + 29*x^4 - 14*x^3 - 71*x^2 - 48*x
分解为(2*x^4 + 7*x^3 + 4*x^2 - 13*x - 16)*(2*x + 3)*x
。
我应该选择哪种算法来避免代码的复杂性和方法的低效率(谈论算术运算和内存消耗的总量)?
我将使用C编程语言。
例如,对于ring of integers modulo prime number以上的多项式因子分解可能有一些好的算法吗?
答案 0 :(得分:2)
由于Sage是免费和开源的,你应该能够找到Sage使用的算法然后调用它,或者最坏的情况下用C重新实现它。但是,如果你真的必须从头开始编写一个程序,那么这是我会做什么:首先找到所有系数的gcd并将其除去,这使得你的多项式"内容自由"。然后取导数并找到原始多项式及其导数的多项式gcd。通过多项式除法将该因子从原始多项式中取出,这将您的问题分解为两部分:分解无内容,无方形多项式(p / gcd(p,p')),并分解另一个多项式(gcd( p,p'))可能不是方形的。对于后者,从一开始就重新开始,直到你将问题简化为一个或多个无内容,无方形多项式的因子。
下一步是实现分解算法mod p。 Berlekamp的算法可能是最简单的,尽管Cantor-Zassenhaus是最先进的。
最后,应用Zassenhaus算法来计算整数。如果你发现它太慢,可以使用" Lenstra-Lenstra-Lovasz格子基础约简算法来改进它#34;。 http://en.wikipedia.org/wiki/Factorization_of_polynomials#Factoring_univariate_polynomials_over_the_integers
正如你所看到的,这一切都相当复杂,取决于抽象代数的大量理论。您最好使用Sage使用的相同库,或者重新实现Sage实现,甚至只是从程序中调用正在运行的Sage内核版本。
答案 1 :(得分:0)