//PascalABC.Net 3.2
//Автор: Студэнt. Попытка№3. Привет, Anykey!
Program library_of_matrix;
const N = 3; //Порядок квадратной матрицы
type me = array[1..N, 1..N] of integer; //пользовательский тип для передачи в функцию или процедуру матрицы NxN

function _randomMatrix(l, r{левая/правая граница интервала}: integer): me;
var a: me;
begin
randomize;
  for var i:=1 to N do
    for var j:=1 to N do a[i, j]:=random(l, r);
result:=a;    
end;

procedure _printMatrix(a: me); //построчное выведение матрицы на экран
begin
  for var i:=1 to N do
  begin
    for var j:=1 to N do write(a[i, j]:10, ' ');
  writeln;  
  end;
end;

procedure _readMatrix(var a: me; path{путь к файлу}:string); //считывание матрицы из файла
var input: text;
begin
assign (input, path);
reset  (input);
  for var i:=1 to N do
  begin
    for var j:=1 to N do read(input, a[i, j]);
  readln(input);
  end;
close  (input);
end;

procedure _writeMatrix(var a: me; path{путь к файлу}:string); //вывод матрицы в файл
var output: text;
begin
assign (output, path);
rewrite(output);
  for var i:=1 to N do
  begin
    for var j:=1 to N do write(output, a[i, j], ' ');
  writeln(output);
  end;
close  (output);
end;

procedure _transpositionMatrix(var a: me); //транспонирование матрицы
begin
 for var i:=1 to N do
   for var j:=i+1 to N do swap(a[i, j], a[j, i]);
end;

function _sumMatrix(a, b: me): me; //сумма матриц
var c: me;
begin
  for var i:=1 to N do
    for var j:=1 to N do
      c[i, j]:=a[i, j]+b[i, j];
result:=c;
end;

function _multiplicationMatrix(a, b: me): me; //произведение матриц
var s: integer; c: me;
begin
for var i:=1 to N do
  for var j:=1 to N do
  begin
  s:=0;
    for var k:=1 to N do inc(s, a[k, i]*b[j, k]);
  c[i, j]:=s;
  end;
result:=c;
end;

function _powerMatrix (a: me;  pow: integer): me; //возведение в степень матриц
var b: me;
begin
b:=a;
  for var i:=1 to pow-1 do b:=_multiplicationMatrix(b, a);
result:=b;
end;

begin
writeln ('Рандомная матрица: ');
var matr:=_randomMatrix(-15, 15);
var matrCOPY:=matr;
_printMatrix(matr);
writeln('(A T * A)^2 = ');
_transpositionMatrix(matr);
_printMatrix(_powerMatrix(_multiplicationMatrix(matr, matrCOPY), 2));
end.