如何用Python证明根式是三次多项式的根
How to use Python to prove that a radical expression is the root of a cubic polynomial
给定的多项式是
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
这里的问题是浮点精度。方程式中的许多运算都会稍微偏离一点,尤其是对于具有无穷小数的 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
给定的多项式是
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
这里的问题是浮点精度。方程式中的许多运算都会稍微偏离一点,尤其是对于具有无穷小数的 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