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


Построение таблицы умножения для конечной группы подстановок

В системе GAP имеется стандартная функция MultiplicationTable , которая для заданного списка elms возвращает его таблицу умножения. Например, таким образом можно получить таблицу умножения, в которой

A[i][j] = k

тогда и только тогда, когда

elms[i] * elms[j] = elms[k].

Пример:

gap> G:=SymmetricGroup(3);
Sym( [ 1 .. 3 ] )
gap> elms:=AsList(G);
[ (), (2,3), (1,2), (1,2,3), (1,3,2), (1,3) ]
gap> A:=MultiplicationTable(elms);
[ [ 1, 2, 3, 4, 5, 6 ], [ 2, 1, 4, 3, 6, 5 ], [ 3, 5, 1, 6, 2, 4 ],
  [ 4, 6, 2, 5, 1, 3 ], [ 5, 3, 6, 1, 4, 2 ], [ 6, 4, 5, 2, 3, 1 ] ]
gap> Display(A);
[ [  1,  2,  3,  4,  5,  6 ],
  [  2,  1,  4,  3,  6,  5 ],
  [  3,  5,  1,  6,  2,  4 ],
  [  4,  6,  2,  5,  1,  3 ],
  [  5,  3,  6,  1,  4,  2 ],
  [  6,  4,  5,  2,  3,  1 ] ]

 
Получение таблицы умножения в виде матрицы удобно, так как существует и обратная возможность построения объекта по его таблице умножения. Но каким образом, если необходимо, можно сделать таблицу умножения более наглядной ?
 
Следующая программа была предложена студентом Запорожского государственного университета Юрием Романиченко:
 
Cayley:=function(G)
local s,i,l,m,j,k,max;
l:=Elements(G);
max:=1;
for i in [1..Length(l)] do
  for j in [1..Length(l)] do
    m:=l[i]*l[j];
    s:=String(m);
    if max<Length(String(s)) then
      max:=Length(String(s));
    fi;
  od;
od;
s:=String(" ",max);
Print(s," ");
for i in [1..Length(l)] do
  s:=String(l[i],max);
  Print(s,"  ");
od;
Print("\n");
s:=String(" ",max);
Print(s,"_");
for i in [1..Length(l)*max+2*(Length(l)-1)] do
  Print("_");
od;
Print("\n");
for i in [1..Length(l)] do
  s:=String(l[i],max);
  Print(s,"|");
  for j in [1..Length(l)] do
    m:=l[i]*l[j];
    s:=String(m,max);
    Print(s,"  ");
  od;
  Print("\n");
od;
end;

 
При обращении к этой функции на экран будет выведена следующая таблица:
 
gap> Cayley(G);
             ()    (2,3)    (1,2)  (1,2,3)  (1,3,2)    (1,3)
       _____________________________________________________
     ()|     ()    (2,3)    (1,2)  (1,2,3)  (1,3,2)    (1,3)
  (2,3)|  (2,3)       ()  (1,2,3)    (1,2)    (1,3)  (1,3,2)
  (1,2)|  (1,2)  (1,3,2)       ()    (1,3)    (2,3)  (1,2,3)
(1,2,3)|(1,2,3)    (1,3)    (2,3)  (1,3,2)       ()    (1,2)
(1,3,2)|(1,3,2)    (1,2)    (1,3)       ()  (1,2,3)    (2,3)
  (1,3)|  (1,3)  (1,2,3)  (1,3,2)    (2,3)    (1,2)       ()

 
Заметим, что в случае, когда ширина таблицы превышает ширину экрана, разрыва строк можно избежать, если сначала увеличить до максимально возможной длину строки вывода с помощью команды
 
SizeScreen( [ 256, ] );
 
и затем открыть файл протокола командой
 
LogTo( "log.txt" );
 
В этом случае в текстовом файле таблица не будет искажена, если ее ширина не будет превышать 256 символов. Файл протокола закрывается командой
 
LogTo( );



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