如何使用Python证明根表达式是三次多项式的根

2024-06-06 10:08:11 发布

您现在位置:Python中文网/ 问答频道 /正文

给定的多项式是

p = Poly(x**3-x**2-2*x+1, x) # and a root as radical expression:
rt = 1/3 + (-7/2 - 21*sqrt(3)*I/2)**(1/3)/3 + (-7/2 + 21*sqrt(3)*I/2)**(1/3)/3 

将根代入多项式得到(简化):

expr = 7*(-1 - 3*sqrt(3)*I)**(2/3)*(-1 + 3*sqrt(3)*I)**(1/3)/18 - \
7*2**(2/3)*(-7 + 21*sqrt(3)*I)**(1/3)/18 - \
7*2**(2/3)*(-7 - 21*sqrt(3)*I)**(1/3)/18 + \
7*(-1 - 3*sqrt(3)*I)**(1/3)*(-1 + 3*sqrt(3)*I)**(2/3)/18

但无法让python显示此表达式为零:

expr == 0 # False

但是:

expr.evalf()  # gives -0.e-131 - 0.e-132*I

Tags: andfalse表达式asrootsqrtexpressionrt
2条回答

这里的问题是浮点精度。方程中的很多运算都会有点偏差,特别是对于2/3或1/3,它们有无限小数。这一点在诸如本How to avoid floating point errors?之类的答案中得到了解释。为了避免这个问题,可以使用round将结果截断到小数点的特定数目内

round(float_num, num_of_decimals)

然后评估它是否等于零

你可能会不顾一切地使用精度更高的Decimal,但我怀疑你会得到一个平坦的零,即使使用它,其中一些操作不会产生小数有限的数字,因此一些数量会在某处丢失,最终结果非常接近零,但实际上不是零

您是否需要131或132小数点精度才能将其设置为零

有一个函数minpoly用于计算代数表达式的最小多项式:

In [71]: rt = S(1)/3 + (-S(7)/2 - 21*sqrt(3)*I/2)**(S(1)/3)/3 + (-S(7)/2 + 21*sqrt(3)*I/2)**(S(1)/3)/3

In [72]: rt
Out[72]: 
        _______________       _______________
       ╱   7   21⋅√3⋅ⅈ       ╱   7   21⋅√3⋅ⅈ 
    3 ╱  - ─ - ───────    3 ╱  - ─ + ─────── 
1   ╲╱     2      2       ╲╱     2      2    
─ + ─────────────────── + ───────────────────
3            3                     3         

In [73]: minpoly(rt)
Out[73]: 
 3    2          
x  - x  - 2⋅x + 1

这表明这是你所展示的多项式的根。通常r是多项式p的根,那么minpoly(r)是除以p的多项式

我们还可以使用minpoly证明将根代入多项式后的表达式为零:

In [74]: p = x**3-x**2-2*x+1

In [75]: p.subs(x, rt)
Out[75]: 
                                                                           2                                                  3 
          _______________   ⎛        _______________       _______________⎞    ⎛        _______________       _______________⎞  
         ╱   7   21⋅√3⋅ⅈ    ⎜       ╱   7   21⋅√3⋅ⅈ       ╱   7   21⋅√3⋅ⅈ ⎟    ⎜       ╱   7   21⋅√3⋅ⅈ       ╱   7   21⋅√3⋅ⅈ ⎟  
    2⋅3 ╱  - ─ + ───────    ⎜    3 ╱  - ─ - ───────    3 ╱  - ─ + ─────── ⎟    ⎜    3 ╱  - ─ - ───────    3 ╱  - ─ + ─────── ⎟  
1     ╲╱     2      2       ⎜1   ╲╱     2      2       ╲╱     2      2    ⎟    ⎜1   ╲╱     2      2       ╲╱     2      2    ⎟  
─ - ───────────────────── - ⎜─ + ─────────────────── + ───────────────────⎟  + ⎜─ + ─────────────────── + ───────────────────⎟  
3             3             ⎝3            3                     3         ⎠    ⎝3            3                     3         ⎠  

                       
        _______________
       ╱   7   21⋅√3⋅ⅈ 
  2⋅3 ╱  - ─ - ─────── 
    ╲╱     2      2    
- ─────────────────────
            3          

In [76]: minpoly(p.subs(x, rt))
Out[76]: x

这里的最小多项式是x,它的唯一根是零

https://en.wikipedia.org/wiki/Minimal_polynomial_(field_theory)https://docs.sympy.org/latest/modules/polys/reference.html#sympy.polys.numberfields.minpoly

相关问题 更多 >