Ответ 1
Я подозреваю, что это не может быть функцией sympy
по следующим причинам:
Первый, если theta не является алгебраической над целыми числами, то примыкание tota к кольцу многочленов над целыми числами изоморфно.
Например, pi не является алгебраическим по целым числам, так как нет целочисленных коэффициентов, которые в сочетании с pi и степенями pi равны нулю.
Чтобы доказать, что они на самом деле изоморфны, просто возьмем гомоморфизм оценочного кольца, который оценивает каждый многочлен в точке pi.
Это не может быть готовой функцией, потому что вычисление того, является ли число неалгебраическим над любым кольцом, нетривиально. Например, определение того, является ли или нет e + pi
алгебраическим, остается открытым вопросом.
Это может быть достигнуто в sympy
на
from sympy.polys.domains import ZZ, QQ, RR, FF, EX
x, y, z, t = symbols('x y z t')
ZZ['theta']
или
ZZ[t]
Можно легко проверить, что это, действительно, дает вам кольцо многочленов над целыми числами.
Second, числа, которые являются алгебраическими (числа, такие как мнимое число i
, которые являются корнями целочисленных многочленов), могут быть получены путем взятия полиномиального кольца по модулю и идеи, порожденной это уникальный мононический многочлен.
Итак, если theta - мнимое число i
, которое имеет единственный мононический многочлен x^2+1
>>> QQ.old_poly_ring(x).ideal(x**2+1)
<x**2 + 1>
>>> ZZ.old_poly_ring(x).ideal(x**2+1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/sympy/polys/domains/ring.py", line 91, in ideal
return ModuleImplementedIdeal(self, self.free_module(1).submodule(
File "/usr/local/lib/python2.7/dist- packages/sympy/polys/domains/old_polynomialring.py", line 192, in free_module
return FreeModulePolyRing(self, rank)
File "/usr/local/lib/python2.7/dist-packages/sympy/polys/agca/modules.py", line 455, in __init__
+ 'got %s' % ring.dom)
NotImplementedError: Ground domain must be a field, got ZZ
Кроме того, попробуйте следующее:
>>> QQ.old_poly_ring(x).quotient_ring([x**2])
QQ[x]/<x**2>
>>> ZZ.old_poly_ring(x).quotient_ring([x**2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/sympy/polys/domains/ring.py", line 115, in quotient_ring
e = self.ideal(*e)
File "/usr/local/lib/python2.7/dist-packages/sympy/polys/domains/ring.py", line 91, in ideal
return ModuleImplementedIdeal(self, self.free_module(1).submodule(
File "/usr/local/lib/python2.7/dist-packages/sympy/polys/domains/old_polynomialring.py", line 192, in free_module
return FreeModulePolyRing(self, rank)
File "/usr/local/lib/python2.7/dist-packages/sympy/polys/agca/modules.py", line 455, in __init__
+ 'got %s' % ring.dom)
NotImplementedError: Ground domain must be a field, got ZZ
Однако полезная функциональность реализована только для полиномиальных колец над полями и различных локализаций и их частных.
Короче говоря, если theta не является алгебраической над целыми числами, это может быть невозможно в рамках sympy.
Однако, представляя кольца таким образом, может быть достигнуто путем создания классов и использования магических методов Python для переопределения регулярного поведения +
и *
, что по сути является тем, что нам нужно изучить кольца.
Вот пример гауссовских целых чисел, упомянутых выше. Этот код может быть легко переназначен, чтобы дать вам, скажем, квадратный корень из 2 или любое другое алгебраическое число над целыми числами.