a + b*sqrt(c) 形式的数的平方根

square root of number of the form a + b*sqrt(c)

我们如何在 sympy 中计算数字 a + b*sqrt(c) 的平方根?

例如,我们期望 sqrt(3 + 2*sqrt(2))1 + sqrt(2)

我不确定这是否回答了你的问题,因为它不是很详细,但这里有一个 link

https://docs.sympy.org/latest/modules/simplify/simplify.html\

例如

>>> from sympy import simplify, cos, sin
>>> from sympy.abc import x, y
>>> a = (x + x**2)/(x*sin(y)**2 + x*cos(y)**2)
>>> a
(x**2 + x)/(x*sin(y)**2 + x*cos(y)**2)
>>> simplify(a)
x + 1

执行此操作的特定函数称为 sqrtdenest:

In [19]: from sympy import sqrt, sqrtdenest

In [20]: e = sqrt(3 + 2*sqrt(2))

In [21]: e
Out[21]: 
  __________
╲╱ 2⋅√2 + 3 

In [22]: sqrtdenest(e)
Out[22]: 1 + √2

https://docs.sympy.org/latest/modules/simplify/simplify.html#sqrtdenest

sqrtdenest 函数也被 simplify 使用,在 SymPy 教程中有说明: https://docs.sympy.org/latest/tutorial/index.html

正如@oscar-enjamin 所指出的,sqrtdenest 是一个很好的第一站。我还要补充一点,如果你有一个你认为可以用其他数字表示的数字,nsimplify 可能会有所帮助:

>>> from sympy import nsimplify, sqrt, divisors
>>> eq=sqrt(3 + 2*sqrt(2))
>>> nsimplify(eq,[sqrt(2)])
1 + sqrt(2)

>>> eq = sqrt(19 + 3*sqrt(2) + 6*sqrt(3) - sqrt(10))
>>> nsimplify(eq, [sqrt(i) for i in divisors(int(eq**2)) if i - 1])
-sqrt(2) - sqrt(6)/2 + sqrt(3)/2 + sqrt(5)/2 + 3/2 + sqrt(15)/2 + sqrt(30)/2