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_{3}+n(i_{2}+di_{1})+1} = E_{i_{1}+1,i_{2}+1} \alpha^{i_{3}},$$
  where~$0\le i_{1},i_{2}<d$ and~$0\le i_{3}<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
