|  |  D.11.3.2 jacobson Procedure from libraryjacobson.lib(see  jacobson_lib).
 
Example: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 [3]
Note:
A list L of matrices {U,D,V} is returned. That is L[1]*M*L[3]=L[2],
where L[2] is a diagonal matrix and
 L[1], L[3] are square invertible polynomial (unimodular) matrices.
 Note, that M can be rectangular.
 The optional integer
 eng2determines 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.
 See also:
 divideUnits;
 smith.|  | LIB "jacobson.lib";
ring r = 0,(x,d),Dp;
def R = nc_algebra(1,1);   setring R; // the 1st Weyl algebra
matrix m[2][2] = d,x,0,d; print(m);
==> d,x,
==> 0,d 
list J = jacobson(m); // returns a list with 3 entries
print(J[2]); // a Jacobson Form D for m
==> xd2-d,0,
==> 0,    1 
print(J[1]*m*J[3] - J[2]); // 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[2][2] = s,x,0,s; print(m); // matrix of the same for as above
==> s,x,
==> 0,s 
list J = jacobson(m);
print(J[2]); // a Jacobson Form D, quite different from above
==> xs2+s2,0,
==> 0,     x 
print(J[1]*m*J[3] - J[2]); // check that U*M*V = D
==> 0,0,
==> 0,0 
 | 
 
 |