任意精度的多项式求解

Polynomial solving with arbitrary precision

本文关键字:多项式 精度 任意      更新时间:2023-10-16

我们一直在使用GSL来求解多项式。然而,我们希望使用任意精度来求解多项式。我查阅了GMP和Boost多精度库,然而,我找不到任何浮点系数多项式求解的例程。

  1. 是否存在任何免费和开源的库,用于求解任意精度或非常高精度(小数后>200位)的多项式?

  2. 是否可以使用GSL多项式求解程序,将数据类型更改为GMP任意精度?

  3. 使用GMP任意精度的数据类型,使用标准算法之一编写多项式求解器会更容易吗?

如果不清楚,请随时发表评论。

如果你知道一些求解多项式方程的算法(你会在很多教科书中找到这些算法),你可以调整并编码它以使用GMP。

由于GMP有一个C++类接口,具有通常外观的operator +。。。等等,你可以复制并通过一些现有的C代码,然后将其调整为GMP。

  1. MPSolve提供了一个使用多精度求解多项式的库。内部使用GMP。

    可以观察到以下情况:

    • 可以用整数、有理数和浮点任意精度进行计算
    • 多项式的系数和各种其他选项通过文件作为输入给出。可以对原始代码进行装配,以便从自己的程序中直接调用函数
    • 解决方案可以以各种格式报告,如指数、仅实数等
    • 该求解器已经在几个标准多项式测试用例中进行了验证并进行了检查
    • 解算器内部使用随机数,该随机数通过Linux机器上的/dev/random进行种子设定。这会导致解算器在后续运行中速度较慢的问题,因为在未来运行开始之前生成的熵不够。这可以通过用标准的伪随机生成器代替它来绕过
    • 尝试将解算器集成为一个库。然而,会出现严重的分段故障,难以调试。因此,求解器是通过调用其可执行文件来使用的。注意:这只是根据我的经验,希望能以更好的方式完成
    • 一个新的C++版本正在开发中,有望解决这些问题

  1. 将GSL多项式求解器分叉为使用GMP数据类型是乏味的。如果编写了解算器(见第3条),这将更容易,代码也将更易于控制和理解

  1. 正如答案中所建议的,可以使用GMP和MPFR多精度库,并且可以使用标准多项式求解技术(如Jenkins-Traub算法或基于QR的技术)编写多项式求解器

Boost C++库提供了使用GMP和MPFR的包装器,使用起来可能非常方便。

Arb库具有使用任意精度和区间算术求解实数和复数多项式的例程。