(материал разработан с участием студентки ЗГУ О.Ганюк)
Одним из колец, предопределенных в системе 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/6
Z
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)