Основные кольца - Sage Tutorial in Russian

Skip to content
Back to top
View this page
Edit this page

# Основные кольца

При объявлении матриц, векторов или полиномов для них иногда полезно, а иногда и необходимо определять «кольца», на которых они определены. Кольцо - это математическая конструкция, в которой существуют определенные понятия суммы и произведения. Если вы никогда о них не слышали, то вам, вероятно, достаточно знать об этих четырех часто используемых кольцах:

- целые числа \(\{..., -1, 0, 1, 2, ...\}\), называемые `ZZ` в Sage.

- рациональные числа – например, дроби или отношения целых чисел –-, называемые `QQ` в Sage.

- вещественные числа, называемые `RR` в Sage.

- комплексные числа, называемые `CC` в Sage.

Знание различий между данными кольцами очень важно, так как один и тот же полином, определенный в разных кольцах, может вести себя по-разному. Например, полином \(x^2-2\) имеет два корня: \(\pm \sqrt{2}\). Эти корни не являются рациональными числами, поэтому если вы работаете с полиномами с рациональными коэффициентами, то полином не будет разлагаться на множители. С вещественными коэффициентами — будет. Поэтому стоит определить кольцо, чтобы быть уверенным, что полученный результат будет правильным. Следующие две команды задают множества полиномов с рациональными коэффициентами и вещественными коэффициентами соответственно. Множества названы «ratpoly» и «realpoly», но это не столь важно в данном контексте, однако символьные сочетания «.<t>» и «.<z>» являются названиями переменных, использованных в двух случаях.

Sage

    sage: ratpoly.<t> = PolynomialRing(QQ)
    sage: realpoly.<z> = PolynomialRing(RR)

Python

    >>> from sage.all import *
    >>> ratpoly = PolynomialRing(QQ, names=('t',)); (t,) = ratpoly._first_ngens(1)
    >>> realpoly = PolynomialRing(RR, names=('z',)); (z,) = realpoly._first_ngens(1)

Факторизируем \(x^2-2\):

Sage

    sage: factor(t^2-2)
    t^2 - 2
    sage: factor(z^2-2)
    (z - 1.41421356237310) * (z + 1.41421356237310)

[Python]

    >>> from sage.all import *
    >>> factor(t**Integer(2)-Integer(2))
    t^2 - 2
    >>> factor(z**Integer(2)-Integer(2))
    (z - 1.41421356237310) * (z + 1.41421356237310)

Символ `I` обозначает квадратный корень из \(-1\); `i` — это то же самое, что `I`. Конечно, это не рациональное число:

Sage

    sage: i  # квадратный корень из -1
    I
    sage: i in QQ
    False

Python

    >>> from sage.all import *
    >>> i  # квадратный корень из -1
    I
    >>> i in QQ
    False

Заметка: Вышеописанный код может работать не так, как задумывалось, если переменной `i` было задано другое значение, например, если оно было использовано, как счетчик для цикла. В таком случае введите

Sage

    sage: reset('i')

[Python]

    >>> from sage.all import *
    >>> reset('i')

для того, чтобы получить изначальное комплексное значение `i`.

Есть одна тонкость в задании комплексных чисел: как описано выше, символ `i` представляет квадратный корень из \(-1\), но это корень из \(-1\) как алгебраическое число. Вызов `CC(i)` или `CC.gen(0)` или `CC.0` вернет комплексный квадратный корень из \(-1\).

Sage

    sage: i = CC(i)  # комплексное число с плавающей запятой
    sage: i == CC.0
    True
    sage: a, b = 4/3, 2/3
    sage: z = a + b*i
    sage: z
    1.33333333333333 + 0.666666666666667*I
    sage: z.imag()  # мнимая часть
    0.666666666666667
    sage: z.real() == a  # автоматическое приведение типов перед сравнением
    True
    sage: a + b
    2
    sage: 2*b == a
    True
    sage: parent(2/3)
    Rational Field
    sage: parent(4/2)
    Rational Field
    sage: 2/3 + 0.1  # автоматическое приведение типов перед сложением
    0.766666666666667
    sage: 0.1 + 2/3  # приведение типов в Sage симметрично
    0.766666666666667

Python

    >>> from sage.all import *
    >>> i = CC(i)  # комплексное число с плавающей запятой
    >>> i == CC.gen(0)
    True
    >>> a, b = Integer(4)/Integer(3), Integer(2)/Integer(3)
    >>> z = a + b*i
    >>> z
    1.33333333333333 + 0.666666666666667*I
    >>> z.imag()  # мнимая часть
    0.666666666666667
    >>> z.real() == a  # автоматическое приведение типов перед сравнением
    True
    >>> a + b
    2
    >>> Integer(2)*b == a
    True
    >>> parent(Integer(2)/Integer(3))
    Rational Field
    >>> parent(Integer(4)/Integer(2))
    Rational Field
    >>> Integer(2)/Integer(3) + RealNumber('0.1')  # автоматическое приведение типов перед сложением
    0.766666666666667
    >>> RealNumber('0.1') + Integer(2)/Integer(3)  # приведение типов в Sage симметрично
    0.766666666666667

Далее следуют примеры базовых колец в Sage. Как отмечено выше, кольцо рациональных чисел обозначается как `QQ`, а также как `RationalField()` (поле - это кольцо, в котором произведение является коммутативным и в котором каждый ненулевой элемент имеет обратную величину в этом кольце (рациональные числа являются полем, а целые - нет):

Sage

    sage: RationalField()
    Rational Field
    sage: QQ
    Rational Field
    sage: 1/2 in QQ
    True

[Python]

    >>> from sage.all import *
    >>> RationalField()
    Rational Field
    >>> QQ
    Rational Field
    >>> Integer(1)/Integer(2) in QQ
    True

Десятичное число `1.2` рассматривается как `QQ`: десятичные числа, которые также являются рациональными, могут быть «приведены» к рациональным числам. Числа \(\pi\) и \(\sqrt{2}\) не являются рациональными:

Sage

    sage: 1.2 in QQ
    True
    sage: pi in QQ
    False
    sage: pi in RR
    True
    sage: sqrt(2) in QQ
    False
    sage: sqrt(2) in CC
    True

Python

    >>> from sage.all import *
    >>> RealNumber('1.2') in QQ
    True
    >>> pi in QQ
    False
    >>> pi in RR
    True
    >>> sqrt(Integer(2)) in QQ
    False
    >>> sqrt(Integer(2)) in CC
    True

Для использования в высшей математике Sage также может выполнять операции с другими кольцами, как конечные поля, \(p\)-адические числа, кольцо алгебраических чисел, полиномиальные кольца и матричные кольца. Далее показаны некоторые из них:

Sage

    sage: GF(3)
    Finite Field of size 3
    sage: GF(27, 'a')  # если поле не простое, нужно задать имя генератора
    Finite Field in a of size 3^3
    sage: Zp(5)
    5-adic Ring with capped relative precision 20
    sage: sqrt(3) in QQbar # алгебраическое замыкакие QQ
    True

[Python]

    >>> from sage.all import *
    >>> GF(Integer(3))
    Finite Field of size 3
    >>> GF(Integer(27), 'a')  # если поле не простое, нужно задать имя генератора
    Finite Field in a of size 3^3
    >>> Zp(Integer(5))
    5-adic Ring with capped relative precision 20
    >>> sqrt(Integer(3)) in QQbar # алгебраическое замыкакие QQ
    True