Function: algsplit
Section: algebras
C-Name: algsplit
Prototype: GDn
Help: algsplit(al,{v='x}): computes an isomorphism between al and M_d(F_q).
Doc: If \var{al} is a table algebra over~$\F_p$ output by \tet{algtableinit}
that represents a simple algebra, computes an isomorphism between \var{al} and
a matrix algebra~$M_d(\F_{p^n})$ where~$N = nd^2$ is the dimension of~\var{al}.
Returns a \typ{VEC}~$[map,mapi]$, where:
\item \var{map} is a \typ{VEC} of~$N$ matrices of size~$d\times d$ with
\typ{FFELT} coefficients using the variable~\var{v}, representing the image of
the basis of~\var{al} under the isomorphism.
\item \var{mapi} is an~$N\times N$ matrix with \typ{INT} coefficients,
representing the image in \var{al} by the inverse isomorphism of the
basis~$(b_i)$ of~$M_d(\F_p[\alpha])$ (where~$\alpha$ has degree~$n$
over~$\F_p$) defined as follows:
let~$E_{i,j}$ be the matrix having all coefficients~$0$ except the~$(i,j)$-th
coefficient equal to~$1$, and define
$$b_i = E_{((i-1)/nd)+1, ((i-1)/n \mod d)+1} \alpha^{(i-1)\mod n}.$$
Example:
\bprog
? al0 = alginit(nfinit(y^2+7), [-1,-1]);
? al = algtableinit(algmultable(al0), 3); \\ isomorphic to M_2(F_9)
? [map,mapi] = algsplit(al, 'a);
? x = [1,2,1,0,0,0,0,0]~; fx = map*x
%4 =
[2*a 0]
[ 0 2]
? y = [0,0,0,0,1,0,0,1]~; fy = map*y
%5 =
[1 2*a]
[2 a + 2]
? map*algmul(al,x,y) == fx*fy
%6 = 1
? map*mapi[,6]
%7 =
[0 0]
[a 0]
@eprog
\misctitle{Warning} If~\var{al} is not simple, \kbd{algsplit(al)} can trigger
an error, but can also run into an infinite loop. Example:
\bprog
? al = alginit(nfinit(y),[-1,-1]); \\ ramified at 2
? al2 = algtableinit(algmultable(al),2); \\ maximal order modulo 2
? algsplit(al2); \\ not semisimple, infinite loop
@eprog