В системе GAP имеется стандартная функция MultiplicationTable , которая для заданного списка elms возвращает его таблицу умножения. Например, таким образом можно получить таблицу умножения, в которой
A[i][j] = 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( );