@@ -132,10 +132,12 @@ local n, weights, mat, vec, ReduceRow, t,
132132 if lead > n then
133133 return rhs;
134134 fi ;
135+ lhs := ShallowCopy(lhs);
135136 for i in [ 1 .. Length(weights)] do
136137 if weights[ i] = lead then
137138 z := lhs[ lead] ;
138- lhs := lhs - z * mat[ i] ; rhs := rhs - z * vec[ i] ;
139+ AddVector(lhs, mat[ i] , - z); # lhs is a vector
140+ rhs := rhs - z * vec[ i] ; # rhs is a scalar
139141 lead := PositionNonZero(lhs, lead);
140142 if lead > n then
141143 return rhs;
@@ -217,10 +219,10 @@ local m, n, zero, i, c, j, factor;
217219 for i in [ 1 .. m] do
218220 c := eqns.weights[ i] ;
219221 for j in [ 1 .. i- 1 ] do
220- if eqns.mat[ j][ c] <> zero then
222+ factor := eqns.mat[ j,c] ;
223+ if factor <> zero then
221224 Info (InfoMtxHom,6 ," solveEqns: kill mat[" ,j," ," ,c," ]" );
222- factor := eqns.mat[ j][ c] ;
223- eqns.mat[ j] := eqns.mat[ j] - factor* eqns.mat[ i] ;
225+ AddVector(eqns.mat[ j] , eqns.mat[ i] , - factor);
224226 eqns.vec[ j] := eqns.vec[ j] - factor* eqns.vec[ i] ;
225227 fi ;
226228 od ;
@@ -306,13 +308,13 @@ local n, coeffs, x, zero, z, i;
306308 coeffs:= [] ;
307309 x:= v;
308310 else
309- x:= v ;
311+ x:= ShallowCopy(v) ;
310312 zero:= x[ 1 ] * 0 ;
311313 coeffs:= ListWithIdenticalEntries(n, zero);
312314 for i in [ 1 .. n] do
313315 z:= x[ ech[ i]] ;
314316 if z <> zero then
315- x := x - z * base[ i] ;
317+ AddVector(x, base[ i] , - z) ;
316318 coeffs[ i] := z;
317319 fi ;
318320 od ;
@@ -552,13 +554,13 @@ end);
552554# If a linearly dependent set of elements is supplied, this
553555# routine will trim it down to a basis.
554556BindGlobal(" SMTX_EcheloniseMats" ,function (gens, F )
555- local n, m, zero, ech, k, i, j, l;
557+ local n, m, zero, ech, k, i, j, l, entry ;
556558
557559 if Length(gens) = 0 then
558560 return [ [] , [] ] ;
559561 fi ;
560562 # copy the list to avoid destroying the original list
561- gens:= ShallowCopy (gens);
563+ gens:= List (gens, MutableCopyMatrix );
562564
563565 n:= NrRows(gens[ 1 ] );
564566 m:= NrCols(gens[ 1 ] );
@@ -581,12 +583,15 @@ local n, m, zero, ech, k, i, j, l;
581583 Add(ech, [ i,j] );
582584
583585 # First normalise the [i,j] position to 1
584- gens[ k] := gens[ k] / gens[ k][ i,j] ;
586+ entry := gens[ k][ i,j] ;
587+ if not IsOne(entry) then
588+ MultMatrix(gens[ k] , 1 / entry);
589+ fi ;
585590
586591 # Now zero position [i,j] in all further generators
587592 for l in [ k+ 1 .. Length(gens)] do
588593 if (gens[ l][ i,j] <> zero) then
589- gens[ l] := gens [ l ] - gens[ k] * gens[ l][ i,j] ;
594+ AddMatrix( gens[ l] , gens[ k] , - gens[ l][ i,j] ) ;
590595 fi ;
591596 od ;
592597 k:= k + 1 ;
@@ -617,7 +622,7 @@ end);
617622# The code is heavily commented, and I appreciate suggestions on how to
618623# improve it (particularly bits of code).
619624BindGlobal(" SpinHom" ,function (V, W )
620- local nv, nw, F, zero, zeroW, gV, gW, k, U, echu, r, homs, s, work, ans, v0,
625+ local nv, nw, F, zero, minusone, zeroW, gV, gW, k, U, echu, r, homs, s, work, ans, v0,
621626 M, x, pos, z, echm, t, v, echv, a, u, e, start, oldlen, ag, m, uu, ret,
622627 c, s1, X, mat, uuc, uic, newhoms, hom, Uhom, imv0, imv0c, image, i, j, l;
623628
@@ -635,6 +640,7 @@ local nv, nw, F, zero, zeroW, gV, gW, k, U, echu, r, homs, s, work, ans, v0,
635640 TestModulesFitTogether(V,W);
636641 F:= V.field;
637642 zero:= Zero(F);
643+ minusone:=- One(F);
638644
639645 zeroW:= ListWithIdenticalEntries(nw,zero);
640646 zeroW:= ImmutableVector(F,zeroW);
@@ -744,27 +750,26 @@ local nv, nw, F, zero, zeroW, gV, gW, k, U, echu, r, homs, s, work, ans, v0,
744750 # create new element <x>, with its definition as the
745751 # difference between <v0^m> and <uu> in <U>.
746752 x:= v[ i] * gV[ j] ;
747- m:= ag ;
753+ m:= MutableCopyMat(ag) ;
748754 ConvertToMatrixRep(m, F);
749755 uu:= u[ i] * gV[ j] ;
750756
751757 ret:= EchResidueCoeffs(U, echu, x,3 );
752758 x:= ret.residue;
753- uu:= uu - ret.projection;
754-
759+ AddVector(uu, ret.projection, minusone);
755760 # reduce modulo the new semi-ech basis elements in <v>,
756761 # storing the coefficients in <c>
757762 #
758763 c:= ListWithIdenticalEntries(Length(v),zero);
759764 for l in [ 1 .. Length(v)] do
760765 z:= x[ echv[ l]] ;
761766 if z <> zero then
762- x := x - z * v[ l] ;
767+ AddVector(x, v[ l] , - z) ;
763768 if Length(m) > 0 then
764- m := m - z * a[ l] ;
769+ AddMatrix(m, a[ l] , - z) ;
765770 fi ;
766771 c[ l] := c[ l] + z;
767- uu := uu - z * u[ l] ;
772+ AddVector(uu, u[ l] , - z) ;
768773 fi ;
769774 od ;
770775 c:= ImmutableVector(F,c);
@@ -797,14 +802,14 @@ local nv, nw, F, zero, zeroW, gV, gW, k, U, echu, r, homs, s, work, ans, v0,
797802 for l in [ 1 .. Length(v)] do
798803 if c[ l] <> zero then
799804 if Length(X) > 0 then
800- X := X + c [ l] * a [ l] ;
805+ AddMatrix(X, a [ l] , c [ l] ) ;
801806 fi ;
802- uu := uu + c [ l] * u [ l] ;
807+ AddVector(uu, u [ l] , c [ l] ) ;
803808 fi ;
804809 od ;
805810
806811 if Length(X) > 0 then
807- X := X - ag ;
812+ AddMatrix(X, ag, minusone) ;
808813 fi ;
809814
810815 mat:= [] ;
@@ -814,6 +819,7 @@ local nv, nw, F, zero, zeroW, gV, gW, k, U, echu, r, homs, s, work, ans, v0,
814819 Add(mat, uuc * homs[ l] - uic * homs[ l] * gW[ j] );
815820 od ;
816821 Append(mat, X);
822+ ConvertToMatrixRep(mat);
817823 SMTX_AddEqns(e, TransposedMat(mat), zeroW);
818824 fi ;
819825 od ;
@@ -848,26 +854,26 @@ local nv, nw, F, zero, zeroW, gV, gW, k, U, echu, r, homs, s, work, ans, v0,
848854 ConvertToMatrixRep(Uhom, F);
849855 for l in [ 1 .. s] do
850856 if ans[ i][ l] <> zero then
851- Uhom:= Uhom + ans[ i][ l] * homs [ l ] ;
857+ AddMatrix( Uhom, homs [ l ] , ans[ i][ l] ) ;
852858 fi ;
853859 od ;
854860 for l in [ 1 .. r] do
855861 Add(hom, Uhom[ l] );
856862 od ;
857863 fi ;
858864
859- imv0:= zeroW * zero ;
865+ imv0:= ZeroMutable( zeroW) ;
860866 for l in [ 1 .. t] do
861867 if ans[ i][ s+ l] <> zero then
862- imv0:= imv0 + ans[ i][ s+ l] * M [ l ] ;
868+ AddVector( imv0, M [ l ] , ans[ i][ s+ l] ) ;
863869 fi ;
864870 od ;
865871 imv0c:= EchResidueCoeffs(M, echm, imv0,1 );
866872 for l in [ 1 .. Length(v)] do
867873 if Length(imv0c)= 0 then image:= [] ;
868874 else image:= imv0c * a[ l] ;fi ;
869875 if r > 0 then
870- image:= image + EchResidueCoeffs(U, echu, u[ l] ,1 ) * Uhom;
876+ AddVector( image, EchResidueCoeffs(U, echu, u[ l] ,1 ) * Uhom) ;
871877 fi ;
872878 Add(hom, image);
873879 od ;
@@ -984,18 +990,21 @@ local proveIndecomposability, addnilpotent, n, F, zero, basis, enddim,
984990 local i, r, c, k, done, l;
985991 # NB: <remain> and <nildim> and <cnt> are not local
986992
993+ a := MutableCopyMatrix(a);
987994 for i in [ 1 .. nildim] do
988- r:= echelon[ nilech[ i]][ 1 ] ; c:= echelon[ nilech[ i]][ 2 ] ;
995+ r:= echelon[ nilech[ i]][ 1 ] ;
996+ c:= echelon[ nilech[ i]][ 2 ] ;
989997 if a[ r,c] <> zero then
990- a := a - a[ r,c] * nilbase [ i ] / nilbase[ i][ r,c] ;
998+ AddMatrix(a, nilbase [ i ] , - a[ r,c] / nilbase[ i][ r,c] ) ;
991999 fi ;
9921000 od ;
9931001
9941002 # find which echelon index to remove due to this new element
9951003 k:= 1 ; done:= false ;
9961004 while not done and k <= Length(remain) do
9971005 l:= remain[ k] ;
998- r:= echelon[ l][ 1 ] ; c:= echelon[ l][ 2 ] ;
1006+ r:= echelon[ l][ 1 ] ;
1007+ c:= echelon[ l][ 2 ] ;
9991008 if a[ r,c] <> zero then
10001009 done:= true ;
10011010 else
@@ -1377,12 +1386,12 @@ SMTX.IsomorphismModules:=SMTX_IsomorphismModules;
13771386# running down diagonals below the main diagonal:
13781387# [2,1], [3,2], [4,3], ..., [3,1], [4,2], ..., [n-1,1], [n, 2], [n,1]
13791388BindGlobal(" SMTX_EcheloniseNilpotentMatAlg" ,function (matalg, F )
1380- local zero, n, base, ech, k, diff, i, j, found, l;
1389+ local zero, n, base, ech, k, diff, i, j, found, l, entry ;
13811390
13821391 zero:= Zero(F);
13831392 n := NrCols(matalg[ 1 ] );
13841393
1385- base := ShallowCopy (matalg);
1394+ base := List (matalg, MutableCopyMatrix );
13861395 ech := [] ;
13871396 k := 1 ;
13881397
@@ -1409,12 +1418,15 @@ local zero, n, base, ech, k, diff, i, j, found, l;
14091418 Add(ech, [ i,j] );
14101419
14111420 # First normalise the [i,j] position to 1
1412- base[ k] := base[ k] / base[ k][ i,j] ;
1421+ entry := base[ k][ i,j] ;
1422+ if not IsOne(entry) then
1423+ MultMatrix(base[ k] , 1 / entry);
1424+ fi ;
14131425
14141426 # Now zero position [i,j] in all other basis elements
14151427 for l in [ 1 .. Length(base)] do
14161428 if (l <> k) and (base[ l][ i,j] <> zero) then
1417- base[ l] := base[ l ] - base[ k ] * base [ l][ i,j] ;
1429+ AddMatrix( base[ l] , base[ k ] , - base[ l][ i,j] ) ;
14181430 fi ;
14191431 od ;
14201432 k := k + 1 ;
0 commit comments