haskell - 求多项式的根

标签 haskell algebra polynomials

给定 n 次多项式,如何可靠地找到 y = 0 时 x 的所有值。

我目前正在使用 Math.Polynomial库,它似乎没有内置这个函数。但是,我可能在这里遗漏了一些东西,看起来这将是一个广泛使用的函数。

谢谢

最佳答案

如果您不介意使用外部 SMT 求解器,则可以使用 SBV 包:

Prelude Data.SBV> allSat $ \x -> 2*x^3-19*x^2+15*x+72 .== (0::SReal)
Solution #1:
  s0 = 3.0 :: Real
Solution #2:
  s0 = 8.0 :: Real
Solution #3:
  s0 = -1.5 :: Real
Found 3 different solutions.

保证根是精确的,即不会发生舍入错误。 Real 类型对应于无限精确的代数实数。如果结果无法以有限形式打印,它将被写为一个简单方程的根,并将扩展到当前的打印精度:

Prelude Data.SBV> allSat $ \x -> x^2-2 .== (0::SReal)
Solution #1:
  s0 = root(1, x^2 = 2) = -1.414213562373095... :: Real
Solution #2:
  s0 = root(2, x^2 = 2) = 1.414213562373095... :: Real
Found 2 different solutions.

位数可以任意长并且可配置:

Prelude Data.SBV> allSatWith z3{printRealPrec=20} $ \x -> x^2-2 .== (0::SReal)
Solution #1:
  s0 = root(1, x^2 = 2) = -1.4142135623730950488... :: Real
Solution #2:
  s0 = root(2, x^2 = 2) = 1.4142135623730950488... :: Real
Found 2 different solutions.

请注意,SMT 求解器只会为您提供实根;不会找到复杂的解决方案:

Prelude Data.SBV> allSat $ \x -> x^2+1 .== (0::SReal)
No solutions found.

如果只有一些根是真实的,那么就会找到这些根:

Prelude Data.SBV> allSat $ \x -> x^3+2*x-1 .== (0::SReal)
Solution #1:
  s0 = root(1, x^3+2x = 1) = 0.4533976515164037... :: Real
This is the only solution.
PS。为了使这一切顺利进行,请不要忘记首先在您的计算机上安装 Z3。您可以从 https://github.com/Z3Prover/z3/releases 获取最新副本

关于haskell - 求多项式的根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49765183/

相关文章:

c++ - 将一个类对象的指针赋值给另一个类对象c++

无法正确解码多项式

haskell - 类型 : (Num a, Ord a) 与 (Int a)?

无需绘图即可找到多项式的最大值/最小值的算法

haskell - Haskell 中大量掷骰子的平均值

c++ - 稀疏矩阵超定线性方程组c/c++库

c - 如何用C语言求解单变量线性方程

c++ - 从 C++ 文件中读取多项式?

haskell - 是否有 Monad 的实例但没有 MonadFix 的实例?

generics - 关于如何使用 multirec 的教程