使用 SymPy 找到数字的简单表示

Find a simple representation for a number with SymPy

我正在努力用 sympy

简化以下术语

(乳胶)$\sqrt3{8+3\sqrt{21}}+\sqrt3{8-3\sqrt{21}}$

from sympy import (
    init_printing,
    sqrt,
    cbrt,
    nsimplify,
    simplify,
)

init_printing(use_unicode=True)

value_plus = cbrt(8 + 3 * sqrt(21))
value_minus = cbrt(8 - 3 * sqrt(21))

value_both = value_plus + value_minus

这里,我把表达式分成两部分,分别是value_plusvalue_minus

对于第一部分,我得到了想要的结果

nsimplify(value_plus)

这是 $1/2+\sqrt{21}/2$ 可以在 wolfram alpha.

中看到

但是,对于第二部分,我们也可以在 wolfram aplha 中看到想要的结果($1/2-\sqrt{21}/2$),在替代形式下

nsimplify(value_minus)

我最终得到了一个复杂的表示,这也是正确的,但不是我想要得到的。

因此,我没有得到预期的结果,即 1。

value_both = value_plus + value_minus

如屏幕截图所示。 所以我的问题是,

  1. 如何强制数字的其他表示形式?
  2. 如何将表示限制为仅实数?

您可以使用 real_root:

而不是 cbrt
value_plus = real_root(8 + 3 * sqrt(21), 3)
value_minus = real_root(8 - 3 * sqrt(21), 3)

value_both = value_plus + value_minus

print(nsimplify(value_plus))
print(nsimplify(value_minus))
print(nsimplify(value_both))

输出将是:

1/2 + sqrt(21)/2
1/2 - sqrt(21)/2
1