SymPy имеет свой собственный класс Boolean
, потому что он должен использоваться в конструкции выражения Basic
и должен поддерживать такие методы, как subs
et c, которые будут использоваться последовательно в архитектуре SymPy.
Тип Boolean
может использоваться с bool
, например:
In [7]: S.true & True
Out[7]: True
In [8]: S.true and True
Out[8]: True
Проблема в вашем примере на самом деле связана с предпочтениями оператора:
In [9]: r != 0 & degree(g) < LT(r )
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-f2737cccd83e> in <module>
----> 1 r != 0 & degree(g) < LT(r )
TypeError: unsupported operand type(s) for &: 'int' and 'Integer'
In [10]: (r != 0) & (degree(g) < LT(r))
Out[10]:
4
2 < x
In [11]: r != (0 & degree(g)) < LT(r)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-c7a6030e1401> in <module>
----> 1 r != (0 & degree(g)) < LT(r)
TypeError: unsupported operand type(s) for &: 'int' and 'Integer'
Это 0 & degree(g)
который оценивается первым, а тип SymPy Integer
не может использоваться с &
, который используется для символов c "и" в SymPy:
In [14]: (x<1) & (x>-1)
Out[14]: x > -1 ∧ x < 1
Вероятно, вы хотели использовать Python Оператор and
, имеющий более низкий приоритет, чем &
:
In [15]: r != 0 and degree(g) < LT(r)
Out[15]:
4
2 < x
На самом деле он не будет работать, хотя в while
l oop, потому что выражение Boolean
является неопределенным:
---> 10 while (r != 0 and degree(g) < LT(r ) ):
11 q = q + LT (r )/ LT (g)
12 r = r - ( LT (r )/ LT (g))*g
~/current/sympy/sympy/sympy/core/relational.py in __nonzero__(self)
382
383 def __nonzero__(self):
--> 384 raise TypeError("cannot determine truth value of Relational")
385
386 __bool__ = __nonzero__
TypeError: cannot determine truth value of Relational
Это потому, что истинность условия неизвестна:
In [18]: degree(g) < LT(r)
Out[18]:
4
2 < x
Я думаю, что вы хотели проверить, есть rem(LT(g), LT(r)) == 0
.
from sympy import *
x = symbols('x')
f= x**4-5*x**2-2*x+7
g = 3*x**2 + 4*x - 2
q = 0
r = f
while (r != 0 and rem(LT(g), LT(r)) == 0):
q = q + LT (r )/ LT (g)
r = r - ( LT (r )/ LT (g))*g
print(q,r)
Выход:
0 x**4 - 5*x**2 - 2*x + 7