Данный раздел посвящен операциям над группами
и их элементами. Определения и необходимые
теоретические сведения могут быть найдены в [2]-[6].
Приведенные ниже примеры используют группы
подстановок, но большинство используемых в них
функций (в т.ч. Group, Size, SylowSubgroup) применяется и к
другим используемым в GAP видам групп, для каждого
из которых вычисления производятся по
специальному алгоритму.
Зададим группу подстановок, которая
порождается (записанными в виде произведения
независимых циклов) подстановками (1,2) и
(1,2,3,4,5,6,7,8). Эта группа есть не что иное, как
симметрическая группа S8:
gap> s8:= Group( (1,2), (1,2,3,4,5,6,7,8) );
Group( (1,2), (1,2,3,4,5,6,7,8) )
Группа S8 содержит знакопеременную группу
A8, которая может быть задана как подгруппа,
состоящая из четных подстановок, или как ее
коммутант:
gap> a8:= CommutatorSubgroup( s8, s8 );
Subgroup( Group( (1,2), (1,2,3,4,5,6,7,8) ),
[(1,3,2),(2,4,3),(2,3)(4,5),(2,4,6,5,3),
(2,5,3)(4,7,6),(2,3)(5,6,8,7) ] )
Таким образом, A8 описывается как
подгруппа группы s8, которая порождается
указанными шестью подстановками. Это
представление намного короче, чем внутренняя
структура a8, (которую можно посмотреть с помощью
функций RecFields и PrintRec), но для понимания его вполне
достаточно.
Если обращение к объекту происходит часть,
удобно присвоить ему имя:
gap> s8.name:= "s8";
"s8"
gap> a8;
Subgroup( s8 ,[ (1,3,2), (2,4,3), (2,3)(4,5),
(2,4,6,5,3), (2,5,3)(4,7,6), (2,3)(5,6,8,7)] )
gap> a8.name:= "a8";
"a8"
gap> a8;
a8
Как только группа будет содержать поле name,
вместо самого описания группы будет выводиться
ее имя:
gap> copya8:= Copy( a8 );
a8
Несмотря на отсутствие связи между именем и
идентификатором, их желательно выбирать
согласованно.
Изучим группу a8. Она является записью, список
полей которой возвращает функция RecFields:
gap> RecFields( a8 );
[ "isDomain", "isGroup", "parent",
"identity",
"generators", "operations",
"isPermGroup",
"1", "2", "3", "4",
"5", "6", "stabChainOptions",
"stabChain", "orbit",
"transversal",
"stabilizer", "name" ]
Многие функции сохраняют информацию о группе,
добавляя новое поле в эту запись, что позволяет
избежать повторных вычислений. Но сейчас нас
интересуют свойства самой группы, а не
организация данных. Сначала получим ее порядок и
проверим, является ли она абелевой.
gap> Size( a8 ); IsAbelian( a8 ); IsPerfect( a8 );
20160
false
true
Теперь получим список простых делителей
порядка группы:
gap> Set( Factors( Size( a8 ) ) );
[ 2, 3, 5, 7 ]
Для каждого из простых делителей pвычислим
силовскую p-подгруппу, которую функция
SylowSubgroup сохрани в поле a8.sylowSubgroups:
gap> Set( Factors( Size( a8 ) ) );
[ 2, 3, 5, 7 ]
gap> for p in last do
> SylowSubgroup( a8, p );
> od;
gap> a8.sylowSubgroups;
[ , Subgroup(s8,[(1,5)(7,8), (1,5)(2,6),
(3,4)(7,8), (2,3)(4,6),(1,7)(2,3)(4,6)(5,8),
(1,2)(3,7)(4,8)(5,6)]),
Subgroup( s8, [ (3,8,7), (2,6,4)(3,7,8) ] ),,
Subgroup( s8, [ (3,7,8,6,4) ] ),,
Subgroup( s8, [ (2,8,4,5,7,3,6) ] ) ]
sylowSubgroups является списком, p-м элементом
которого является силовская p-подгруппа, если
такая существует (поэтому 1-й, 4-й и 6-й элементы
списка не определены).
Исследуем силовскую 2-подгруппу. Сначала для
удобства обозначим ее syl2, а затем определим ее
размер:
gap> syl2:= last[2];;
gap> Size( syl2 );
64
Теперь вычислим ее нормализатор в a8:
gap> Normalizer( a8, syl2 );
Subgroup( s8, [ (3,4)(7,8), (2,3)(4,6),
> (1,2)(3,7)(4,8)(5,6) ] )
Проверим, совпадает ли он с syl2:
gap> last = syl2;
true
Вычислим центр подгруппы syl2:
gap> Centre( syl2 );
Subgroup( s8, [ ( 1, 5)( 2, 6)( 3, 4)( 7, 8) ] )
Найдем централизатор cent последней подгруппы в
a8, т.е. подгруппу элементов а8, перестановочных с
каждым элементом центра группы syl2:
gap> cent:= Centralizer( a8, last );
Subgroup( s8, [ ( 1, 5)( 2, 6)( 3, 4)( 7, 8),
(3,4)(7,8), (3,7)(4,8), (2,3)(4,6), (1,2)(5,6) ])
Найдем ее порядок:
gap> Size( cent );
192
Вычислим ряд коммутантов cent:
gap> DerivedSeries( cent );
[ Subgroup( s8, [ (1,5)(2,6)(3,4)(7,8), (3,4)(7,8),
(3,7)(4,8), (2,3)(4,6), (1,2)(5,6) ] ),
Subgroup( s8, [ (1,6,3)(2,4,5), (1,8,3)(4,5,7),
(1,7)(2,3)(4,6)(5,8), (1,5)(2,6) ] ),
Subgroup( s8, [ (1,3)(2,7)(4,5)(6,8),
(1,6)(2,5)(3,8)(4,7), (1,5)(3,4),
(1,5)(7,8) ] ),
Subgroup( s8, [ (1,5)(2,6)(3,4)(7,8) ] ),
Subgroup( s8, [ ] ) ]
Последний элемент полученного списка —
тривиальная подгруппа, поэтому cent - разрешимая
группа.
Порядки подгрупп, входящих в ряд коммутантов
(производный ряд) удобно получить следующим
образом:
gap> List( last, Size );
[ 192, 96, 32, 2, 1 ]
Вычислим теперь нижний центральный ряд группы
cent:
gap> low:= LowerCentralSeries( cent );
[ Subgroup( s8, [ (1,5)(2,6)(3,4)(7,8), (3,4)(7,8),
(3,7)(4,8), (2,3)(4,6), (1,2)(5,6)
] ),
Subgroup( s8, [ (1,6,3)(2,4,5), (1,8,3)(4,5,7),
(1,7)(2,3)(4,6)(5,8), (1,5)(2,6) ]
) ]
Теперь покажем, как найти стабилизатор
некоторого элемента множества, на котором
действует группа подстановок. Как видно из
следующего примера, стабилизатором единицы
является подгруппа порядка 2520 и индекса 8,
порожденная пятью подстановками:
gap> stab:= Stabilizer( a8, 1 );
Subgroup( s8, [ (2,5,6), (2,5)(3,6), (2,5,6,4,3),
(2,5,3)(4,6,8), (2,5)(3,4,7,8) ] )
gap> Size( stab );
2520
gap> Index( a8, stab );
8
С помощью функции Random получим случайный
элемент из a8:
gap> Random( a8 );
(1,6,3,2,7)(4,5,8)
Новые подгруппы могут быть теперь получены
путем поиска его централизатора, а затем
комбинаций сопряжения и пересечения уже
известных подгрупп. Заметим, что, хотя мы
формируем подгруппы, не выходя за пределы а8, при
выводе они описываются как подгруппы s8:
gap> Random( a8 );
(1,3,2,4,7,5,6)
gap> cent:= Centralizer( a8,(1,2)(3,4)(5,8)(6,7) );
Subgroup( s8, [ (1,2)(3,4)(5,8)(6,7), (5,6)(7,8),
(5,7)(6,8), (3,4)(6,7), (3,5)(4,8),
(1,3)(2,4) ] )
gap> Size( cent );
192
gap> conj:= ConjugateSubgroup( cent, (2,3,4) );
Subgroup( s8, [ (1,3)(2,4), (5,8)(6,7), (5,6)(7,8),
(5,7)(6,8), (2,4)(6,7), (2,8)(4,5),
(1,4)(2,3)] )
gap> inter:= Intersection( cent, conj );
Subgroup( s8, [ (5,6)(7,8), (5,7)(6,8), (1,2)(3,4),
(1,3)(2,4) ] )
gap> Size( inter ); IsElementaryAbelian( inter );
16
true
gap> norm:= Normalizer( a8, inter );
Subgroup( s8, [ (6,7,8), (5,6,8), (3,4)(6,8),
(2,3)(6,8), (1,2)(6,8),
(1,5)(2,6,3,7,4,8) ] )
gap> Size( norm );
576
Теперь построим в группе a8 элементарную
абелеву подгруппу порядка 8, каждая инволюция
(т.е. элемент порядка 2) в которой не имеет
неподвижных точек, а затем вычислим ее
нормализатор в :
gap> elab:= Group( (1,2)(3,4)(5,6)(7,8),
>(1,3)(2,4)(5,7)(6,8),(1,5)(2,6)(3,7)(4,8) );;
gap> Size( elab );
8
gap> IsElementaryAbelian( elab );
true
gap> norm:=Normalizer( a8, AsSubgroup(s8, elab) );
Subgroup( s8, [(5,6)(7,8), (5,7)(6,8), (3,4)(7,8),
(3,5)(4,6), (2,3)(6,7), (1,2)(7,8)])
gap> Size( norm );
1344
Заметим, что группа elab была определена как
отдельная группа, поэтому мы воспользовались
функцией AsSubgroup для того, чтобы рассматривать ее
как подгруппу в a8. Применение команды Normalizer(a8,elab);
дало бы тот же результат, однако было бы
некорректным. В последнем случае недоступны
некоторые эффективные алгоритмы, что может
существенно увеличить время расчета.
Еще один пример использования функции AsSubgroup,
обращающий внимание на правильное указание
группы, подгруппа которой рассматривается:
gap> IsSubgroup( a8, AsSubgroup( a8, elab ) );
Error, <G> must be a parent group in
AsSubgroup( a8, elab ) called from main loop
brk> quit;
gap> IsSubgroup( a8, AsSubgroup( s8, elab ) );
true
Примечание. Нельзя использовать знак "<"
вместо IsSubgroup. Так, не приводят к ошибкам команды:
gap> elab < a8;
false
gap> AsSubgroup( s8, elab ) < a8;
false
В данном случае происходит простое сравнение
списков элементов указанных групп в
соответствии с лексикографическим порядком.
Кроме того, если эти списки еще не вычислены, то
они вычисляются в процессе выполнения операции,
что нежелательно при работе с большими группами.
Оператор равенства "=" фактически
проверяет равенство групп. Например,
gap> elab = AsSubgroup( s8, elab );
true
означает, что две группы состоят из одинаковых
элементов. Заметим, однако, что их свойства могут
отличаться, если они заданы как подгруппы
различных групп.
Теперь вычислим факторгруппу подгруппы norm по
подгруппе elab (см. предыдущий параграф). Сначала
зададим elab как подгруппу группы s8:
gap> elab:= AsSubgroup( s8, elab );;
gap> elab.name:= "elab";;
Факторгруппу f получаем следующим образом:
gap> f:= norm / elab;
(Subgroup(s8, [ (5,6)(7,8), (5,7)(6,8), (3,4)(7,8),
(3,5)(4,6), (2,3)(6,7), (1,2)(7,8) ] ) / elab)
gap> Size( f );
168
Полученная группа f, как видно из результата,
уже не является группой подстановок. Но операции
над ней и ее элементами производятся аналогично:
gap> Random( f );
FactorGroupElement( elab, (2,8,7)(3,5,6) )
gap> Order( f, last );
3
Построим естественный гомоморфизм из norm на f,
отображающий каждый элемент в содержащий его
смежный класс по подгруппе elab.
gap> f.name:= "f";;
gap> hom:= NaturalHomomorphism( norm, f );
NaturalHomomorphism( Subgroup( s8, [ (5,6)(7,8),
(5,7)(6,8), (3,4)(7,8), (3,5)(4,6), (2,3)(6,7),
(1,2)(7,8) ] ), (Subgroup( s8, [ (5,6)(7,8),
(5,7)(6,8), (3,4)(7,8), (3,5)(4,6), (2,3)(6,7),
(1,2)(7,8) ] ) / elab) )
Ядром естественного гомоморфизма является elab:
gap> Kernel( hom ) = elab;
true
Пусть теперь x - произвольный элемент в norm.
вычислим сначала его образ, а затем смежный
класс, в котором содержится x, как множество
прообразов соответствующего элемента
факторгруппы:
gap> x:= Random( norm );
(1,7,5,8,3,6,2)
gap> Image( hom, x );
FactorGroupElement( elab, (2,7,3,4,6,8,5) )
gap> coset:= PreImages( hom, last );
(elab*(2,7,3,4,6,8,5))
gap> IsCoset( coset ); x in coset; coset in f;
true
true
false
Действие группы f на множестве своих элементов
с помощью умножения справа приводит к
регулярному представлению группы f
подстановками, т.е. к новой группе подстановок.
gap> op:= Operation( f, Elements( f ), OnRight );;
gap> IsPermGroup( op );
true
gap> Maximum( List( op.generators,
>
LargestMovedPointPerm ) );
168
gap> IsSimple( op );
true
Другим источником информации о группе a8 будет
являться ее разбиение на классы сопряженых
элементов. Получим список классов сопряженности:
gap> ccl:= ConjugacyClasses( a8 );
[ ConjugacyClass( a8, () ),
ConjugacyClass( a8, (1,3)(2,6)(4,7)(5,8) ),
ConjugacyClass( a8, (1,3)(2,8,5)(6,7) ),
ConjugacyClass( a8, (2,5,8) ),
ConjugacyClass( a8, (1,3)(6,7) ),
ConjugacyClass( a8, (1,3,2,5,4,7,8) ),
ConjugacyClass( a8, (1,5,8,2,7,3,4) ),
ConjugacyClass( a8, (1,5)(2,8,7,4,3,6) ),
ConjugacyClass( a8, (2,7,3)(4,6,8) ),
ConjugacyClass( a8, (1,6)(3,8,5,4) ),
ConjugacyClass( a8, (1,3,5,2)(4,6,8,7) ),
ConjugacyClass( a8, (1,8,6,2,5) ),
ConjugacyClass( a8, (1,7,2,4,3)(5,8,6) ),
ConjugacyClass( a8, (1,2,3,7,4)(5,8,6) ) ]
gap> Length( ccl );
14
Теперь определим порядки представителей
классов сопряженности, взяв в каждом классе по
одному представителю:
gap> reps:= List( ccl, Representative );
[ (), (1,3)(2,6)(4,7)(5,8), (1,3)(2,8,5)(6,7),
(2,5,8), (1,3)(6,7), (1,3,2,5,4,7,8),
(1,5,8,2,7,3,4), (1,5)(2,8,7,4,3,6),
(2,7,3)(4,6,8), (1,6)(3,8,5,4),
> (1,3,5,2)(4,6,8,7), (1,8,6,2,5),
(1,7,2,4,3)(5,8,6), (1,2,3,7,4)(5,8,6) ]
gap> List( reps, r -> Order( a8, r ) );
[ 1, 2, 6, 3, 2, 7, 7, 6, 3, 4, 4, 5, 15, 15 ]
Определим, сколько элементов содержится в
каждом классе:
gap> List( ccl, Size );
[ 1, 105, 1680, 112, 210, 2880, 2880, 3360, 1120,
2520, 1260, 1344, 1344, 1344 ]
Примечание: следует различать функции
Order> (порядок элемента), >Size (порядок группы,
класса сопряженности и т.п.) и Length (длина списка).
Построив классы сопряженных элементов, мы
можем рассматривать их функции, т.е. отображения,
принимающие одинаковые значения на всем классе
сопряженных элементов. Примером может являться
число неподвижных точек:
gap> nrfixedpoints:= function( perm, support )
> return Number( [1 .. support], x -> x^perm = x);
> end;
function ( perm, support ) ... end
Вычислим его для группы a8:
s"> gap> permchar1:= List(reps, x->nrfixedpoints(x,8));
[ 8, 0, 1, 5, 4, 1, 1, 0, 2, 2, 0, 3, 0, 0 ].
|