Данный раздел посвящен операциям над группами и их элементами. Приведенные ниже примеры используют группы подстановок, но большинство используемых в них функций (в т.ч. Group, Size, SylowSubgroup) применяется и к другим используемым в GAP видам групп, для каждого из которых вычисления производятся по специальному алгоритму.
Зададим группу подстановок, которая порождается (записанными в виде произведения независимых циклов) подстановками (1 2) и (1 2 3 4 5 6 7 8). Эта группа есть не что иное, как симметрическая группа S_8:
gap> s8:= Group( (1,2), (1,2,3,4,5,6,7,8) ); Group([ (1,2), (1,2,3,4,5,6,7,8) ]) |
Группа S_8 содержит знакопеременную группу A_8, которая может быть задана как подгруппа, состоящая из четных подстановок, или как ее коммутант:
gap> a8 := DerivedSubgroup( s8 ); Group([ (1,2,3), (2,3,4), (3,4,5), (2,6)(3,4), (3,7)(4,5), (3,5,6,7)(4,8) ]) |
Если обращение к объекту происходит часто, удобно присвоить ему имя. В этом случае при следующих обращениях к объекту вместо его представления будет выводиться на печать его имя:
gap> SetName(a8,"A8"); gap> a8; A8 |
Несмотря на отсутствие связи между именем и идентификатором, их желательно выбирать согласованно.
Изучим группу a8. Она является объектом, список известных свойств и атрибутов которого можно получить следующим образом:
gap> KnownPropertiesOfObject(a8); [ "IsFinite", "CanEasilyCompareElements", "CanEasilySortElements", "IsDuplicateFree", "IsGeneratorsOfMagmaWithInverses", "IsAssociative", "IsSimpleSemigroup", "IsFinitelyGeneratedGroup", "IsSubsetLocallyFiniteGroup", "KnowsHowToDecompose" ] gap> KnownAttributesOfObject(a8); [ "Name", "OneImmutable", "ParentAttr", "LargestMovedPoint", "GeneratorsOfMagmaWithInverses", "MultiplicativeNeutralElement", "StabChainMutable", "StabChainOptions" ] |
Этот список может расширяться в процессе работы с объектом, так как многие функции сохраняют информацию о нем в новых атрибутах и свойствах, что позволяет эффективно избегать повторных вычислений. Например, найдем порядок группы. Видно, что скорость его повторного определения существенно выше, так как вместо его вычисления просто выводится на печать его уже сохраненное значение.
gap> Size( a8 ); 20160 gap> time; 6 gap> Size( a8 ); 20160 gap> time; 6 |
Теперь проверим, является ли группа абелевой и совершенной:
gap> IsAbelian( a8 ); IsPerfect( a8 ); false true |
Сравним теперь список известных свойств и атрибутов с первоначальным и увидим, что добавились к ним новые:
gap> KnownPropertiesOfObject(a8); [ "IsEmpty", "IsTrivial", "IsNonTrivial", "IsFinite", "CanEasilyCompareElements", "CanEasilySortElements", "IsDuplicateFree", "IsGeneratorsOfMagmaWithInverses", "IsAssociative", "IsCommutative", "IsSimpleSemigroup", "IsFinitelyGeneratedGroup", "IsSubsetLocallyFiniteGroup", "KnowsHowToDecompose", "IsPerfectGroup" ] gap> KnownAttributesOfObject(a8); [ "Name", "Size", "OneImmutable", "ParentAttr", "LargestMovedPoint", "GeneratorsOfMagmaWithInverses", "TrivialSubmagmaWithOne", "MultiplicativeNeutralElement", "DerivedSubgroup", "StabChainMutable", "StabChainOptions" ] |
Теперь получим список простых делителей порядка группы:
gap> Set( Factors( Size( a8 ) ) ); [ 2, 3, 5, 7 ] |
Для каждого из простых делителей p вычислим силовскую p-подгруппу и напечатаем ее порядок:
gap> for p in last do > Print(p, " : ", Size(SylowSubgroup(a8,p)),"\n"); > od; 2 : 64 3 : 9 5 : 5 7 : 7 |
Исследуем силовскую 2-подгруппу. Обозначим ее syl2:
gap> syl2:=SylowSubgroup(a8,2); Group([ (1,5)(4,8), (1,5)(2,7), (3,6)(4,8), (2,3)(6,7), (1,4)(2,3)(5,8)(6,7), (1,2)(3,4)(5,7)(6,8) ]) |
Теперь вычислим ее нормализатор в a8:
gap> Normalizer( a8, syl2 ); Group([ (1,5)(4,8), (1,5)(3,6), (2,7)(4,8), (2,3)(6,7), (1,4)(2,3)(5,8)(6,7), (1,6)(2,8)(3,5)(4,7) ]) |
Проверим, что он совпадает с ней самой:
gap> last = syl2; true |
Вычислим центр подгруппы syl2:
gap> Centre(syl2); Group([ (1,5)(2,7)(3,6)(4,8) ]) |
Найдем централизатор cent последней подгруппы в a8, т.е. подгруппу элементов а8, перестановочных с каждым элементом центра группы syl2:
gap> cent:= Centralizer( a8, last ); Group([ (1,5)(2,7)(3,6)(4,8), (3,4)(6,8), (3,6)(4,8), (2,3)(6,7), (1,2)(5,7) ]) |
Найдем его порядок:
gap> Size( cent ); 192 |
Вычислим ряд коммутантов cent:
gap> DerivedSeries(cent);
[ Group([ (1,5)(2,7)(3,6)(4,8), (3,4)(6,8), (3,6)(4,8), (2,3)(6,7),
(1,2)(5,7) ]), Group([ (1,6,7)(2,5,3), (2,3,8)(4,7,6), (1,5)(3,6) ]),
Group([ (1,7)(2,5)(3,8)(4,6), (1,5)(2,7), (3,6)(4,8), (1,3)(2,8)(4,7)(5,6),
(1,3)(2,4)(5,6)(7,8) ]), Group([ (1,5)(2,7)(3,6)(4,8) ]), Group(()) ]
|
Последний элемент полученного списка - тривиальная подгруппа, поэтому cent - разрешимая группа. Порядки подгрупп, входящих в ряд коммутантов (производный ряд) удобно получить следующим образом:
gap> List( last, Size ); [ 192, 96, 32, 2, 1 ] |
Вычислим теперь нижний центральный ряд группы cent:
gap> LowerCentralSeries(cent);
[ Group([ (1,5)(2,7)(3,6)(4,8), (3,4)(6,8), (3,6)(4,8), (2,3)(6,7),
(1,2)(5,7) ]), Group([ (1,6,7)(2,5,3), (2,3,8)(4,7,6), (1,5)(3,6) ]) ]
|
Теперь покажем, как найти стабилизатор некоторого элемента множества, на котором действует группа подстановок. Как видно из следующего примера, стабилизатором единицы является подгруппа порядка 2520 и индекса 8, порожденная пятью подстановками:
gap> stab:= Stabilizer( a8, 1 ); Group([ (2,3,4), (3,4,5), (2,6)(3,4), (3,7)(4,5), (3,5,6,7)(4,8) ]) gap> Size(stab); 2520 gap> Index(a8,stab); 8 |
С помощью функции Random получим случайный элемент из a8:
gap> x:=Random( a8 ); (1,7,6,5)(4,8) |
Новые подгруппы могут быть теперь получены путем поиска его централизатора, а затем комбинаций сопряжения и пересечения уже известных подгрупп.
gap> cent:=Centralizer(a8,x); Group([ (1,7,6,5)(4,8), (2,3)(4,8) ]) gap> Size(cent); 8 gap> conj:= ConjugateSubgroup( cent, (2,3,4) ); Group([ (1,7,6,5)(2,8), (2,8)(3,4) ]) gap> inter:= Intersection( cent, conj ); Group([ (1,6)(5,7) ]) |
В следующем примере мы вычислим подгруппу группы a8, затем ее нормализатор и в итоге определим структуру факторгруппы. Сначала создадим элементарную абелеву подгруппу порядка 8:
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> SetName( elab, "2^3" ); elab; 2^3 gap> norm := Normalizer( a8, elab );; Size( norm ); 1344 |
Теперь мы имеем подгруппу norm порядка 1344 и ее подгруппу elab, и желаем построить факторгруппу. Поскольку мы также жедаем найти прообразы элементов факторгруппы в norm, нам также понадобится естественный гомоморфизм из norm в факторгруппу с ядром elab.
gap> hom := NaturalHomomorphismByNormalSubgroup( norm, elab ); <action epimorphism> gap> f := Image( hom ); Group([ (), (), (), (4,5)(6,7), (4,6)(5,7), (2,3)(6,7), (2,4)(3,5), (1,2)(5,6) ]) gap> Size( f ); 168 |
Полученная факторгруппа f также является группой подстановок. Однако множество, на котором она действует, не имеет ничего общего с множеством точек, на котором действует norm (это просто совпадение, что оба множества являются подмножествами множества натуральных чисел). Теперь мы можем найти образы и прообразы относительно естественного гомоморфизма. Множество прообразов элемента является смежным классом по подгруппе elab. Мы используем функцию PreImages, так как hom не является взаимно однозначным отображением.
gap> ker:= Kernel( hom ); 2^3 gap> x := (1,8,3,5,7,6,2);; Image( hom, x ); (1,7,5,6,2,3,4) gap> coset := PreImages( hom, last ); RightCoset(2^3,(2,8,6,7,3,4,5)) |
Заметьте, что GAP может выбирать любой из представителей смежного класса прообразов. Конечно же, частное двух представителей одного смежного класса лежит в ядре гомоморфизма:
gap> rep:= Representative( coset ); (2,8,6,7,3,4,5) gap> x * rep^-1 in ker; true |
Факторгруппа f является простой группой, т.е. она не имеет нетривиальных нормальных подгрупп:
gap> IsSimple( f ); true |
Группа norm действует на 8 элементах своей нормальной подгруппы elab с помощью сопряжения, что приводит к представлению группы f в S_8, оставляющему неподвижной только лишь точку 1. Образ этого представления может быть вычислен с помощью функции Action; более того, он даже содежится в группе norm, и мы можем показать, что norm в действительности является расщепимым расширением элементарной абелевой группы elab с помощью группы f.
gap> op := Action( norm, elab ); Group([ (), (), (), (5,6)(7,8), (5,7)(6,8), (3,4)(7,8), (3,5)(4,6), (2,3)(6,7) ]) gap> IsSubgroup( a8, op ); IsSubgroup( norm, op ); true true gap> IsTrivial( Intersection( elab, op ) ); true |
Примечание. Нельзя использовать знак "<" вместо IsSubgroup. Так, не приводит к ошибке команда:
gap> elab < a8; false |
Оператор же равенства "=" фактически проверяет равенство групп.
Другим источником информации о группе a8 будет являться ее разбиение на классы сопряженных элементов. Получим список классов сопряженности:
gap> ccl:=ConjugacyClasses(a8); [ ()^G, (1,2)(3,4)^G, (1,2)(3,4)(5,6)(7,8)^G, (1,2,3)^G, (1,2,3)(4,5)(6,7)^G, (1,2,3)(4,5,6)^G, (1,2,3,4)(5,6)^G, (1,2,3,4)(5,6,7,8)^G, (1,2,3,4,5)^G, (1,2,3,4,5)(6,7,8)^G, (1,2,3,4,5)(6,8,7)^G, (1,2,3,4,5,6)(7,8)^G, (1,2,3,4,5,6,7)^G, (1,2,3,4,5,6,8)^G ] gap> Length(last); 14 |
Теперь определим порядки представителей классов сопряженности, взяв в каждом классе по одному представителю:
gap> reps:= List( ccl, Representative ); [ (), (1,2)(3,4), (1,2)(3,4)(5,6)(7,8), (1,2,3), (1,2,3)(4,5)(6,7), (1,2,3)(4,5,6), (1,2,3,4)(5,6), (1,2,3,4)(5,6,7,8), (1,2,3,4,5), (1,2,3,4,5)(6,7,8), (1,2,3,4,5)(6,8,7), (1,2,3,4,5,6)(7,8), (1,2,3,4,5,6,7), (1,2,3,4,5,6,8) ] gap> List( reps, r -> Order( r ) ); [ 1, 2, 2, 3, 6, 3, 4, 4, 5, 15, 15, 6, 7, 7 ] |
Определим, сколько элементов содержится в каждом классе:
gap> List(ccl,Size); [ 1, 210, 105, 112, 1680, 1120, 2520, 1260, 1344, 1344, 1344, 3360, 2880, 2880 ] |
Примечание: следует различать функции Order (порядок элемента), Size (порядок группы, класса сопряженности и т.п.) и Length (длина списка). Построив классы сопряженных элементов, мы можем рассматривать их функции, т.е. отображения, принимающие одинаковые значения на всем классе сопряженных элементов. Примером может являться число неподвижных точек:
gap> nrfixedpoints:= function( perm, support ) > return Number( [1 .. support], x -> x^perm = x); > end; function( perm, support ) ... end |
Вычислим его для группы a8:
gap> permchar1:= List(reps, x->nrfixedpoints(x,8)); [ 8, 4, 0, 5, 1, 2, 2, 0, 3, 0, 0, 0, 1, 1 ] |
generated by GAPDoc2HTML