Основные кольца¶
При объявлении матриц, векторов или полиномов для них иногда полезно, а иногда и необходимо определять «кольца», на которых они определены. Кольцо - это математическая конструкция, в которой существуют определенные понятия суммы и произведения. Если вы никогда о них не слышали, то вам, вероятно, достаточно знать об этих четырех часто используемых кольцах:
целые числа \(\{..., -1, 0, 1, 2, ...\}\), называемые
ZZ
в Sage.рациональные числа – например, дроби или отношения целых чисел –-, называемые
QQ
в Sage.вещественные числа, называемые
RR
в Sage.комплексные числа, называемые
CC
в Sage.
Знание различий между данными кольцами очень важно, так как один и тот же полином, определенный в разных кольцах, может вести себя по-разному. Например, полином \(x^2-2\) имеет два корня: \(\pm \sqrt{2}\). Эти корни не являются рациональными числами, поэтому если вы работаете с полиномами с рациональными коэффициентами, то полином не будет разлагаться на множители. С вещественными коэффициентами — будет. Поэтому стоит определить кольцо, чтобы быть уверенным, что полученный результат будет правильным. Следующие две команды задают множества полиномов с рациональными коэффициентами и вещественными коэффициентами соответственно. Множества названы «ratpoly» и «realpoly», но это не столь важно в данном контексте, однако символьные сочетания «.<t>» и «.<z>» являются названиями переменных, использованных в двух случаях.
sage: ratpoly.<t> = PolynomialRing(QQ)
sage: realpoly.<z> = PolynomialRing(RR)
>>> from sage.all import *
>>> ratpoly = PolynomialRing(QQ, names=('t',)); (t,) = ratpoly._first_ngens(1)
>>> realpoly = PolynomialRing(RR, names=('z',)); (z,) = realpoly._first_ngens(1)
ratpoly.<t> = PolynomialRing(QQ) realpoly.<z> = PolynomialRing(RR)
Факторизируем \(x^2-2\):
sage: factor(t^2-2)
t^2 - 2
sage: factor(z^2-2)
(z - 1.41421356237310) * (z + 1.41421356237310)
>>> 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)
factor(t^2-2) factor(z^2-2)
Символ I
обозначает квадратный корень из \(-1\); i
— это
то же самое, что I
. Конечно, это не рациональное число:
sage: i # квадратный корень из -1
I
sage: i in QQ
False
>>> from sage.all import *
>>> i # квадратный корень из -1
I
>>> i in QQ
False
i # квадратный корень из -1 i in QQ
Заметка: Вышеописанный код может работать не так, как задумывалось,
если переменной i
было задано другое значение, например, если
оно было использовано, как счетчик для цикла. В таком случае введите
sage: reset('i')
>>> from sage.all import *
>>> reset('i')
reset('i')
для того, чтобы получить изначальное комплексное значение i
.
Есть одна тонкость в задании комплексных чисел: как описано выше,
символ i
представляет квадратный корень из \(-1\), но это корень
из \(-1\) как алгебраическое число. Вызов CC(i)
или CC.gen(0)
или CC.0
вернет комплексный квадратный корень из \(-1\).
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
>>> 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
i = CC(i) # комплексное число с плавающей запятой i == CC.0 a, b = 4/3, 2/3 z = a + b*i z z.imag() # мнимая часть z.real() == a # автоматическое приведение типов перед сравнением a + b 2*b == a parent(2/3) parent(4/2) 2/3 + 0.1 # автоматическое приведение типов перед сложением 0.1 + 2/3 # приведение типов в Sage симметрично
Далее следуют примеры базовых колец в Sage. Как отмечено выше,
кольцо рациональных чисел обозначается как QQ
, а также как
RationalField()
(поле - это кольцо, в котором произведение
является коммутативным и в котором каждый ненулевой элемент имеет
обратную величину в этом кольце (рациональные числа являются полем,
а целые - нет):
sage: RationalField()
Rational Field
sage: QQ
Rational Field
sage: 1/2 in QQ
True
>>> from sage.all import *
>>> RationalField()
Rational Field
>>> QQ
Rational Field
>>> Integer(1)/Integer(2) in QQ
True
RationalField() QQ 1/2 in QQ
Десятичное число 1.2
рассматривается как QQ
: десятичные числа,
которые также являются рациональными, могут быть «приведены» к
рациональным числам. Числа \(\pi\) и \(\sqrt{2}\) не являются рациональными:
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
>>> 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
1.2 in QQ pi in QQ pi in RR sqrt(2) in QQ sqrt(2) in CC
Для использования в высшей математике Sage также может выполнять операции с другими кольцами, как конечные поля, \(p\)-адические числа, кольцо алгебраических чисел, полиномиальные кольца и матричные кольца. Далее показаны некоторые из них:
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
>>> 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
GF(3) GF(27, 'a') # если поле не простое, нужно задать имя генератора Zp(5) sqrt(3) in QQbar # алгебраическое замыкакие QQ