67 lines
1.6 KiB
Text
67 lines
1.6 KiB
Text
MODULE GaussianElimination EXPORTS Main;
|
|
|
|
IMPORT IO, ModularRing AS MR, IntMatrix AS IM, ModMatrix AS MM;
|
|
|
|
CONST
|
|
|
|
(* data to set up the matrices *)
|
|
|
|
A1 = ARRAY OF INTEGER { 2, 1, 0 };
|
|
A2 = ARRAY OF INTEGER { 1, 2, 0 };
|
|
A3 = ARRAY OF INTEGER { 0, 3, 0 };
|
|
A = ARRAY OF ARRAY OF INTEGER { A1, A2, A3 };
|
|
|
|
B1 = ARRAY OF INTEGER { 4, 8, 0, -4, 0 };
|
|
B2 = ARRAY OF INTEGER { -3, -6, 0, 9, 0 };
|
|
B3 = ARRAY OF INTEGER { 1, 3, 5, 7, 2 };
|
|
B4 = ARRAY OF INTEGER { 7, 5, 3, 1, 2 };
|
|
B = ARRAY OF ARRAY OF INTEGER { B1, B2, B3, B4 };
|
|
|
|
PROCEDURE IntToModArray(READONLY A: IM.T; VAR B: MM.T; mod: CARDINAL) =
|
|
(*
|
|
copies a two-dimensional array of integers
|
|
to a two-dimension array of integers modulo "mod"
|
|
*)
|
|
BEGIN
|
|
B := NEW(MM.T).initDimensions(A.num_rows(), A.num_cols());
|
|
WITH Adata = A.entries(), Bdata = B.entries() DO
|
|
FOR i := FIRST(Adata^) TO LAST(Adata^) DO
|
|
WITH Ai = Adata[i], Bi = Bdata[i] DO
|
|
FOR j := FIRST(Ai) TO LAST(Ai) DO
|
|
MR.Init(Bi[j], Ai[j], mod);
|
|
END;
|
|
END;
|
|
END;
|
|
END;
|
|
END IntToModArray;
|
|
|
|
VAR
|
|
|
|
M: IM.T;
|
|
N: MM.T;
|
|
|
|
BEGIN
|
|
|
|
(* triangularize the data in A *)
|
|
M := NEW(IM.T).init(A);
|
|
IO.Put("Initial A:\n");
|
|
IM.PrintMatrix(M);
|
|
IO.PutChar('\n');
|
|
M.triangularize();
|
|
IO.Put("Final A:\n");
|
|
IM.PrintMatrix(M);
|
|
IO.PutChar('\n');
|
|
IO.PutChar('\n');
|
|
|
|
(* triangularize the data in B, all computations modulo 46 *)
|
|
M := NEW(IM.T).init(B);
|
|
IntToModArray(M, N, 46);
|
|
IO.Put("Initial B:\n");
|
|
MM.PrintMatrix(N);
|
|
IO.PutChar('\n');
|
|
N.triangularize();
|
|
IO.Put("Final B:\n");
|
|
MM.PrintMatrix(N);
|
|
IO.PutChar('\n');
|
|
|
|
END GaussianElimination.
|