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
