Подтвердить что ты не робот

Представление колец алгебраических целых чисел

Я пытаюсь представить кольцо;

enter image description here

где theta - корень мононического неприводимого многочлена f с целыми коэффициентами степени d.

Это кольцо является подкольцом целых алгебраических чисел, которое само является подкольцом поля;

enter image description here

Я могу представить это поле с помощью sympy AlgebraicField class

Q_theta = sympy.polys.domains.AlgebraicField(QQ,theta)

Есть ли способ представить вышеуказанное целочисленное подстроку аналогичным образом?

4b9b3361

Ответ 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 или любое другое алгебраическое число над целыми числами.

Ответ 2

Физик здесь: я понял некоторые из этих слов, но, возможно, я могу помочь: -D

Вы пробовали SymPyIntegerRing?

class sympy.polys.domains.SymPyIntegerRing

    Integer ring based on SymPy’s Integer type.