# Singular

#### D.3.2.15 U_D_O

Procedure from library `linalg.lib` (see linalg_lib).

Usage:
U_D_O(A); constant invertible matrix A

Return:
list Z: Z[1]=P , Z[2]=U , Z[3]=D , Z[4]=O
gives a permutation matrix P,
a normalized lower triangular matrix U ,
a diagonal matrix D, and
a normalized upper triangular matrix O
with P*A=U*D*O

Note:
Z[1]=-1 means that A is not regular (proc uses gaussred)

Example:
 ```LIB "linalg.lib"; ring r = 0,(x),dp; matrix A[5][5] = 10, 4, 0, -9, 8, -3, 6, -6, -4, 9, 0, 3, -1, -9, -8, -4,-2, -6, -10,10, -9, 5, -1, -6, 5; list Z = U_D_O(A); //construct P,U,D,O s.t. P*A=U*D*O print(Z[1]); //P ==> 1,0,0,0,0, ==> 0,1,0,0,0, ==> 0,0,1,0,0, ==> 0,0,0,1,0, ==> 0,0,0,0,1 print(Z[2]); //U ==> 1, 0, 0, 0, 0, ==> -3/10,1, 0, 0, 0, ==> 0, 5/12, 1, 0, 0, ==> -2/5, -1/18,-38/9,1, 0, ==> -9/10,43/36,37/9, -1049/2170,1 print(Z[3]); //D ==> 10,0, 0, 0, 0, ==> 0, 36/5,0, 0, 0, ==> 0, 0, 3/2,0, 0, ==> 0, 0, 0, -1085/27,0, ==> 0, 0, 0, 0, 6871/217 print(Z[4]); //O ==> 1,2/5,0, -9/10, 4/5, ==> 0,1, -5/6,-67/72, 19/12, ==> 0,0, 1, -149/36,-17/2, ==> 0,0, 0, 1, 216/217, ==> 0,0, 0, 0, 1 print(Z[1]*A); //P*A ==> 10,4, 0, -9, 8, ==> -3,6, -6,-4, 9, ==> 0, 3, -1,-9, -8, ==> -4,-2,-6,-10,10, ==> -9,5, -1,-6, 5 print(Z[2]*Z[3]*Z[4]); //U*D*O ==> 10,4, 0, -9, 8, ==> -3,6, -6,-4, 9, ==> 0, 3, -1,-9, -8, ==> -4,-2,-6,-10,10, ==> -9,5, -1,-6, 5 ```