[BACK]Return to mat CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / lib

Annotation of OpenXM_contrib2/asir2000/lib/mat, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/lib/mat,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */
                      2: /* fraction free gaussian elimination; detructive */
                      3:
                      4: def deter(MAT)
                      5: {
                      6:        S = size(MAT);
                      7:        if ( car(S) != car(cdr(S)) )
                      8:                return 0;
                      9:        N = car(S);
                     10:        for ( J = 0, D = 1; J < N; J++ ) {
                     11:                for ( I = J; (I<N)&&(MAT[I][J] == 0); I++ );
                     12:                if ( I != N ) {
                     13:                        for ( L = I; L < N; L++ )
                     14:                                if ( MAT[L][J] && (nmono(MAT[L][J]) < nmono(MAT[I][J])) )
                     15:                                        I = L;
                     16:                        if ( J != I )
                     17:                                for ( K = 0; K < N; K++ ) {
                     18:                                        B = MAT[J][K]; MAT[J][K] = MAT[I][K]; MAT[I][K] = B;
                     19:                                }
                     20:
                     21:                        for ( I = J + 1, V = MAT[J][J]; I < N; I++ )
                     22:                                for ( K = J + 1, U = MAT[I][J]; K < N; K++ )
                     23:                                        MAT[I][K] = sdiv(MAT[I][K]*V-MAT[J][K]*U,D);
                     24:                        D = V;
                     25:                } else
                     26:                        return ( 0 );
                     27:        }
                     28:        return (D);
                     29: }
                     30:
                     31: /* characteristic polynomial */
                     32:
                     33: def cp(M)
                     34: {
                     35:        tstart;
                     36:        S = size(M);
                     37:        if ( car(S) != car(cdr(S)) )
                     38:                return 0;
                     39:        N = car(S);
                     40:        MAT = newmat(N,N);
                     41:        for ( I = 0; I < N; I++ )
                     42:                for ( J = 0; J < N; J++ )
                     43:                        if ( I == J )
                     44:                                MAT[I][J] = red(M[I][J]-x);
                     45:                        else
                     46:                                MAT[I][J] = red(M[I][J]);
                     47:        D = deter(MAT);
                     48:        tstop;
                     49:        return (D);
                     50: }
                     51:
                     52: /* calculation of charpoly by danilevskii's method */
                     53:
                     54: def da(MAT)
                     55: {
                     56:        tstart;
                     57:        S = size(MAT);
                     58:        if ( car(S) != car(cdr(S)) )
                     59:                return 0;
                     60:        N = car(S);
                     61:        M = newmat(N,N);
                     62:        for ( I = 0; I < N; I++ )
                     63:                for ( J = 0; J < N; J++ )
                     64:                        M[I][J] = red(MAT[I][J]);
                     65:
                     66:        for ( W = newvect(N), J = 0, K = 0, D = 1; J < N; J++ ) {
                     67:                for ( I = J + 1; (I<N) && (M[I][J] == 0); I++ );
                     68:                if ( I == N ) {
                     69:                        for ( L = J, S = 1; L >= K; L-- )
                     70:                                S = S*x-M[L][J];
                     71:                        D *= S;
                     72:                        K = J + 1;
                     73:                } else {
                     74:                        B = J + 1;
                     75:                        for ( L = 0; L < N; L++ ) {
                     76:                                T = M[I][L]; M[I][L] = M[B][L]; M[B][L] = T;
                     77:                        }
                     78:                        for ( L = 0; L < N; L++ ) {
                     79:                                T = M[L][B]; M[L][B] = M[L][I]; M[L][I] = T;
                     80:                                W[L] = M[L][J];
                     81:                        }
                     82:                        for ( L = K, T = red(1/M[B][J]); L < N; L++ )
                     83:                                M[B][L] *= T;
                     84:                        for ( L = K; L < N; L++ )
                     85:                                if ( W[L] && (L != J + 1) )
                     86:                                        for ( B = K, T = W[L]; B < N; B++ )
                     87:                                                M[L][B] -= M[J+1][B]*T;
                     88:                        for ( L = K; L < N; L++ ) {
                     89:                                for ( B = 0, T = 0; B < N ; B++ )
                     90:                                        T += M[L][B] * W[B];
                     91:                                M[L][J + 1] = T;
                     92:                        }
                     93:                }
                     94:        }
                     95:        tstop;
                     96:        return ( D );
                     97: }
                     98:
                     99: def newvmat(N) {
                    100:        M = newmat(N,N);
                    101:        for ( I = 0; I < N; I++ )
                    102:                for ( J = 0; J < N; J++ )
                    103:                        M[I][J] = strtov(rtostr(x)+rtostr(I))^J;
                    104:        return M;
                    105: }
                    106:
                    107: def newssmat(N) {
                    108:        M = newmat(N,N);
                    109:        for ( I = 0; I < N; I++ )
                    110:                for ( J = 0; J < N; J++ )
                    111:                        M[I][J] = strtov(rtostr(x)+rtostr(I)+"_"+rtostr(J));
                    112:        return M;
                    113: }
                    114:
                    115: def newasssmat(N) {
                    116:        N *= 2;
                    117:        M = newmat(N,N);
                    118:        for ( I = 0; I < N; I++ )
                    119:                for ( J = 0; J < I; J++ )
                    120:                        M[I][J] = strtov(rtostr(x)+rtostr(I)+"_"+rtostr(J));
                    121:        for ( I = 0; I < N; I++ )
                    122:                for ( J = I + 1; J < N; J++ )
                    123:                        M[I][J] = -M[J][I];
                    124:        return M;
                    125: }
                    126:
                    127: /* calculation of determinant by minor expansion */
                    128:
                    129: def edet(M) {
                    130:        S = size(M);
                    131:        if ( S[0] == 1 )
                    132:                return M[0][0];
                    133:        else {
                    134:                N = S[0];
                    135:                L = newmat(N-1,N-1);
                    136:                for ( I = 0, R = 0; I < N; I++ ) {
                    137:                        for ( J = 1; J < N; J++ ) {
                    138:                                for ( K = 0; K < I; K++ )
                    139:                                        L[J-1][K] = M[J][K];
                    140:                                for ( K = I+1; K < N; K++ )
                    141:                                        L[J-1][K-1] = M[J][K];
                    142:                        }
                    143:                        R += (-1)^I*edet(L)*M[0][I];
                    144:                }
                    145:                return R;
                    146:        }
                    147: }
                    148:
                    149: /* sylvester's matrix */
                    150:
                    151: def syl(V,P1,P2) {
                    152:        D1 = deg(P1,V); D2 = deg(P2,V);
                    153:        M = newmat(D1+D2,D1+D2);
                    154:        for ( J = 0; J <= D2; J++ )
                    155:                M[0][J] = coef(P2,D2-J,V);
                    156:        for ( I = 1; I < D1; I++ )
                    157:                for ( J = 0; J <= D2; J++ )
                    158:                M[I][I+J] = M[0][J];
                    159:        for ( J = 0; J <= D1; J++ )
                    160:                M[D1][J] = coef(P1,D1-J,V);
                    161:        for ( I = 1; I < D2; I++ )
                    162:                for ( J = 0; J <= D1; J++ )
                    163:                M[D1+I][I+J] = M[D1][J];
                    164:        return M;
                    165: }
                    166:
                    167: /* calculation of resultant by edet() */
                    168:
                    169: def res_minor(V,P1,P2)
                    170: {
                    171:        D1 = deg(P1,V); D2 = deg(P2,V);
                    172:        M = newmat(D1+D2,D1+D2);
                    173:        for ( J = 0; J <= D2; J++ )
                    174:                M[0][J] = coef(P2,D2-J,V);
                    175:        for ( I = 1; I < D1; I++ )
                    176:                for ( J = 0; J <= D2; J++ )
                    177:                M[I][I+J] = M[0][J];
                    178:        for ( J = 0; J <= D1; J++ )
                    179:                M[D1][J] = coef(P1,D1-J,V);
                    180:        for ( I = 1; I < D2; I++ )
                    181:                for ( J = 0; J <= D1; J++ )
                    182:                M[D1+I][I+J] = M[D1][J];
                    183:        return edet(M);
                    184: }
                    185: end$

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>