【问题标题】:Fast factorization of polynomial with integers coefficients具有整数系数的多项式的快速因式分解
【发布时间】:2015-06-10 07:12:07
【问题描述】:

我想在整数环上快速分解多项式(原始多项式具有整数系数,所有因子都具有整数系数)。

例如我想将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 的多项式分解的好算法?

【问题讨论】:

  • 为什么不用matlab或类似的?
  • @NickRosencrantz,通常我使用 Sage Math 来实现这样的目标。但现在我正在实现很大程度上依赖于多项式分解的算法,并且还有 GPU(基于 Cuda 或 Opencl)作为目标平台。所以应该是C。
  • 也许运行牛顿法,求因子,多项式除法,重复。
  • 您必须意识到 F(Z, x) 上的因式分解不能比 Z 上的因式分解更快。下一步是使用 Viete 的幻影,并对系数进行因式分解。无论如何,祝你好运。
  • @petRUShka:你能分享你的 C 代码吗?

标签: c performance algorithm polynomial-math polynomials


【解决方案1】:

由于 Sage 是免费和开源的,您应该能够找到 Sage 使用的算法,然后调用它,或者最坏的情况是用 C 重新实现它。但是,如果您真的必须从头开始编写程序,这是我会做什么:首先找到所有系数的 gcd 并将其除以,这使您的多项式“无内容”。然后取导数,求原多项式及其导数的多项式gcd。通过多项式除法从原始多项式中取出该因子,这将您的问题分为两部分:分解一个无内容、无平方的多项式 (p/gcd(p,p')),以及分解另一个多项式 (gcd(p, p')) 可能不是正方形的。对于后者,从头开始,直到您将问题简化为因式分解一个或多个无内容、无平方多项式。

下一步是实现一个因式分解算法 mod p。 Berlekamp 的算法可能是最简单的,尽管 Cantor-Zassenhaus 是最先进的。

最后,应用 Zassenhaus 算法对整数进行因式分解。如果您发现它太慢,可以使用“Lenstra-Lenstra-Lovasz lattice base reduction algorithm”进行改进。 http://en.wikipedia.org/wiki/Factorization_of_polynomials#Factoring_univariate_polynomials_over_the_integers

如您所见,这一切都相当复杂,并且依赖于抽象代数的大量理论。您最好使用 Sage 使用的同一个库,或者重新实现 Sage 实现,甚至只是从您的程序中调用 Sage 内核的运行版本。

【讨论】:

    【解决方案2】:

    根据 mathoverflow 上的 answerSage 使用 FLINT 进行因式分解。

    FLINT(数论快速库)是一个 C 库,支持 数论中的计算。这也是一个研究项目 数论中的算法。

    因此,可以在经过充分测试且稳定的库中查看甚至使用分解算法的实现。

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2012-12-19
      • 2018-05-24
      • 2011-02-08
      • 2021-12-01
      相关资源
      最近更新 更多