/* $OpenXM: OpenXM_contrib2/asir2000/lib/mat,v 1.1.1.1 1999/12/03 07:39:11 noro Exp $ */ /* fraction free gaussian elimination; detructive */ def deter(MAT) { S = size(MAT); if ( car(S) != car(cdr(S)) ) return 0; N = car(S); for ( J = 0, D = 1; J < N; J++ ) { for ( I = J; (I= K; L-- ) S = S*x-M[L][J]; D *= S; K = J + 1; } else { B = J + 1; for ( L = 0; L < N; L++ ) { T = M[I][L]; M[I][L] = M[B][L]; M[B][L] = T; } for ( L = 0; L < N; L++ ) { T = M[L][B]; M[L][B] = M[L][I]; M[L][I] = T; W[L] = M[L][J]; } for ( L = K, T = red(1/M[B][J]); L < N; L++ ) M[B][L] *= T; for ( L = K; L < N; L++ ) if ( W[L] && (L != J + 1) ) for ( B = K, T = W[L]; B < N; B++ ) M[L][B] -= M[J+1][B]*T; for ( L = K; L < N; L++ ) { for ( B = 0, T = 0; B < N ; B++ ) T += M[L][B] * W[B]; M[L][J + 1] = T; } } } tstop; return ( D ); } def newvmat(N) { M = newmat(N,N); for ( I = 0; I < N; I++ ) for ( J = 0; J < N; J++ ) M[I][J] = strtov(rtostr(x)+rtostr(I))^J; return M; } def newssmat(N) { M = newmat(N,N); for ( I = 0; I < N; I++ ) for ( J = 0; J < N; J++ ) M[I][J] = strtov(rtostr(x)+rtostr(I)+"_"+rtostr(J)); return M; } def newasssmat(N) { N *= 2; M = newmat(N,N); for ( I = 0; I < N; I++ ) for ( J = 0; J < I; J++ ) M[I][J] = strtov(rtostr(x)+rtostr(I)+"_"+rtostr(J)); for ( I = 0; I < N; I++ ) for ( J = I + 1; J < N; J++ ) M[I][J] = -M[J][I]; return M; } /* calculation of determinant by minor expansion */ def edet(M) { S = size(M); if ( S[0] == 1 ) return M[0][0]; else { N = S[0]; L = newmat(N-1,N-1); for ( I = 0, R = 0; I < N; I++ ) { for ( J = 1; J < N; J++ ) { for ( K = 0; K < I; K++ ) L[J-1][K] = M[J][K]; for ( K = I+1; K < N; K++ ) L[J-1][K-1] = M[J][K]; } R += (-1)^I*edet(L)*M[0][I]; } return R; } } /* sylvester's matrix */ def syl(V,P1,P2) { D1 = deg(P1,V); D2 = deg(P2,V); M = newmat(D1+D2,D1+D2); for ( J = 0; J <= D2; J++ ) M[0][J] = coef(P2,D2-J,V); for ( I = 1; I < D1; I++ ) for ( J = 0; J <= D2; J++ ) M[I][I+J] = M[0][J]; for ( J = 0; J <= D1; J++ ) M[D1][J] = coef(P1,D1-J,V); for ( I = 1; I < D2; I++ ) for ( J = 0; J <= D1; J++ ) M[D1+I][I+J] = M[D1][J]; return M; } /* calculation of resultant by edet() */ def res_minor(V,P1,P2) { D1 = deg(P1,V); D2 = deg(P2,V); M = newmat(D1+D2,D1+D2); for ( J = 0; J <= D2; J++ ) M[0][J] = coef(P2,D2-J,V); for ( I = 1; I < D1; I++ ) for ( J = 0; J <= D2; J++ ) M[I][I+J] = M[0][J]; for ( J = 0; J <= D1; J++ ) M[D1][J] = coef(P1,D1-J,V); for ( I = 1; I < D2; I++ ) for ( J = 0; J <= D1; J++ ) M[D1+I][I+J] = M[D1][J]; return edet(M); } end$