# Singular          #### D.11.3.2 jacobson

Procedure from library `jacobson.lib` (see jacobson_lib).

Usage:
jacobson(M, eng); M matrix, eng an optional int

Return:
list

Assume:
Basering is a (non-commutative) ring in two variables.

Purpose:
compute a weak Jacobson normal form of M over the basering

Theory:
Groebner bases and involutions are used, following 

Note:
A list L of matrices {U,D,V} is returned. That is L*M*L=L,
where L is a diagonal matrix and
L, L are square invertible polynomial (unimodular) matrices.
Note, that M can be rectangular.
The optional integer `eng2` determines the Groebner basis engine:
0 (default) ensures the use of 'slimgb' , otherwise 'std' is used.

Display:
If `printlevel`=1, progress debug messages will be printed,
if `printlevel`>=2, all the debug messages will be printed.

Example:
 ```LIB "jacobson.lib"; ring r = 0,(x,d),Dp; def R = nc_algebra(1,1); setring R; // the 1st Weyl algebra matrix m = d,x,0,d; print(m); ==> d,x, ==> 0,d list J = jacobson(m); // returns a list with 3 entries print(J); // a Jacobson Form D for m ==> xd2-d,0, ==> 0, 1 print(J*m*J - J); // check that U*M*V = D ==> 0,0, ==> 0,0 /* now, let us do the same for the shift algebra */ ring r2 = 0,(x,s),Dp; def R2 = nc_algebra(1,s); setring R2; // the 1st shift algebra matrix m = s,x,0,s; print(m); // matrix of the same for as above ==> s,x, ==> 0,s list J = jacobson(m); print(J); // a Jacobson Form D, quite different from above ==> xs2+s2,0, ==> 0, x print(J*m*J - J); // check that U*M*V = D ==> 0,0, ==> 0,0 ``` 