Вернуться к списку примеров

Элементы теории колец
(материал разработан с участием студентки ЗГУ О.Ганюк)

Одним из колец, предопределенных в системе GAP, является кольцо целых чисел, которое можно задать непосредственно функцией Integers:
gap> K:=Integers;
Integers
Функция IsRing проверяет, является ли объект кольцом:
gap> IsRing(K);
true
gap> IsRing(SymmetricGroup(8));
false   

Одним из способов задания колец является указание их порождающих элементов. Как мы знаем, в качестве порождающего элемента кольца целых чисел можно выбрать 1 или -1, и система GAP "знает" это:
gap> Ring(1);
Integers
gap> Ring(-1);
Integers
Аналогичым образом задается кольцо четных целых чисел:
gap> L:=Ring(2);
<ring with 1 generators>
Теперь зададим кольцо М, порожденное целыми числами элементами 5 и 7. Несложно заметить, что M содержит в себе единицу, которую можно представить в виде 1=5*3-2*7, и поэтому будет совпадать с кольцом целых чисел:
gap> M:=Ring(5,7);
Integers
Заметим, что коэффициенты для линейного представления НОД двух чисел, использованного в предыдущем примере, можно найти с помощью функции GcdRepresentation:
gap> GcdRepresentation(5,7);
[ 3, -2 ]
gap> 5*3-2*7;
1
Проверим теперь некоторые алгебраические свойства построенного выше кольца четных целых чисел L:
gap> IsCommutative(L);           # коммутативность (по умножению)
true
gap> IsAssociative(L);           # ассоциативность (по умножению)
true
gap> IsLDistributive(L);         # дистрибутивность слева
truе
gap> IsRDistributive(L);         # дистрибутивность справа
true
gap> IsAdditivelyCommutative(L); # коммутативность по умножению
truе
Нулевой и (если имеется) единичный элементы кольца получаются следующим образом:
gap> Zero(L);
0
gap> One(K);
1
Заметим, что при попытке применить к L функцию One(L) будет выдано сообщение об ошибке, так как кольцо четных целых чисел L не является кольцом с единицей.

Далее, мы можем построить подкольцо Т кольца К с помощью функции Subring, указав порождающие элементы подкольца. В данном случае мы задаем подкольцо, состоящее из всех целых чисел, кратных пяти:
gap> T:=Subring(K,[5]);
<ring with 1 generators>
Одной из полезных функций является функция Quotient, с помощью которой можно найти результат деления в кольце:
gap> Quotient(Integers, 2, 3);
fail
gap> Quotient(Integers, 12, 3);
4
Действительно, в первом случае не существует такого целого числа q, для которого 2 = q * 3. Во втором случае 12=4*3.

Одним из примеров конечных колец, реализованных в системе GAP и удобными для учебных целей, являются кольца классов вычетов. Создадим кольцо Z6, которое является кольцом Z/6Z классов вычетов по модулю 6:
gap> Z6:=Integers mod 6;
(Integers mod 6)
Выберем случайным образом два его элемента с помощью функции Random:
gap> x:=Random(Z6);
ZmodnZObj( 5, 6 ) # класс вычетов по модулю 6 с представителем 5
gap> y:=Random(Z6);
ZmodnZObj( 4, 6 ) # класс вычетов по модулю 6 с представителем 4

Такая на первый взгляд специфическая запись классов вычетов по модулю на самом деле имеет свои преимущества, так как позволяет одновременно видеть и вычет, и модуль, по которому он рассматривается.

Найдем теперь результат деления х на у в кольце Z/6Z c помощью уже упомянутой функции Quotient:
gap> Quotient(Z6, x, y);
fail
gap> q:=Quotient(Z6, y, x);
ZmodnZObj( 2, 6 )
gap> y=x*q;
true
Найти результат деления в кольце можно было бы и следующим способом (как видно, результаты деления различными способами совпадают):
gap> x/y;
ZmodnZObj( fail, 6 )
gap> y/x;
ZmodnZObj( 2, 6 )
Идеалы колец конструируются с помощью функции Ideal с указанием списка образующих элементов идеала. Например, создадим идеал кольца целых чисел, состоящий из четных чисел:
gap> R:= Integers;
gap> I:= Ideal( R, [ 2 ] );
<two-sided ideal in Integers, (1 generators)>
В следующем примере создадим кольцо квадратных матриц третьего порядка с рациональными коэффициентами, а затем  зададим его идеал, образованный случайно выбранной матрицей:
gap> A:= FullMatrixAlgebra( Rationals, 3 );
( Rationals^[ 3, 3 ] )
gap> I:= Ideal( A, [ Random( A ) ] );
<two-sided ideal in ( Rationals^[ 3, 3 ] ), (1 generators)>
gap> IsTwoSidedIdeal( A, I );
true
В заключение покажем, как можно работать с подкольцами поля комплексных чисел.  В системе GAP мнимая единица задается как Е(4):
gap> E(4);
E(4)
gap> E(4)*E(4); #  проверим, что  i^2 = -1
-1
В следующем (тривиальном с математической точки зрения) примере мы зададим кольцо, порожденное комплексными числами вида 3a+3bi, и убедимся в том, что оно коммутативно:
gap> R:=Ring(3,3*E(4));
<ring with 2 generators>
gap> IsCommutative(R);
true

Кроме того, имеются и два стандартных подкольца поля комплексных чисел. Функция GaussianIntegers возвращает кольцо целых гауссовых чисел, т.е. комплексных чисел вида a+bi, где a и b - целые:
gap> GZ:=GaussianIntegers;
GaussianIntegers
gap> Random(GZ);
1+2*E(4)

Аналогично, функция GaussianRationals возвращает кольцо рациональных гауссовых чисел, т.е. комплексных чисел вида a+bi, где a и b - рациональные:
gap> GQ:=GaussianRationals;
GaussianRationals
gap> Random(GQ);
1/3+2*E(4)

Вернуться к списку примеров