| #### 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 [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 `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[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
See also: divideUnits; smith.

User manual for Singular version 4-0-2, 2015, generated by texi2html.