(*~\Глагол\Отделы\ЧисАн\16\ц.N\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                           ОТДЕЛ уцМатрица;
(*============================================================================*
 * НАЗНАЧЕНИЕ: определение матриц из узк.целых чисел (16 разрядов)
 *              и основные вычисления над ними
 *============================================================================*)

ИСПОЛЬЗУЕТ
уцМатем   ИЗ "..\..\..\..\Отделы\ЧисАн\16\ц\",
уцВектор  ИЗ "..\..\..\..\Отделы\ЧисАн\16\ц.N\",
(*
уцМатрВВ  ИЗ "..\..\..\..\Отделы\ЧисАн\16\ц.N\ВводВывод\",

  НаЭкран ИЗ "..\..\..\..\Отделы\Обмен\ВводВывод\";
*)

ВИД
                    Вид- = РЯД ИЗ уцВектор.Вид;
  Доступ-= ДОСТУП К Вид;

         (* вид Цел - это 16-разрядная точность для хранения целых *)
  Цел = уцМатем.Цел;                                             (* локальная *)

(*----------------------------------------------------------------------------*
 * Код ошибки после выполнения функций
 *----------------------------------------------------------------------------*)
ПОСТ
  ВЫРОЖДЕНА-           =-1;  (* вырожденная матрица *)
  НЕТ_СХОДИМОСТИ-      =-2;  (* нет сходимости *)
  НЕ_ПоложитОПРЕДЕЛЕНа-=-3;  (* матрица не является положительно определенной *)
(*
ПОСТ
  МАЛОЕ = 1.D-20;               (* вместо 0. с точностью 32 разряда *)
*)


(*-оооооооооооооо- опережающие определения/заготовки задач -ооооооооооооооооо-*)


(*----------------------------------------------------------------------------*)
ЗАДАЧА^ умнСтрокиНаСтолбец-(уцВектСтрока-,уцВектСтолбец-:уцВектор.Вид; N:ЦЕЛ):Цел;
(*
 * Цель: умножение вектора-строки на вектор-столбец
 *)
(*----------------------------------------------------------------------------*)
ЗАДАЧА^ умнНаВектор-(уцМатр-:цМатрица.Вид;         (* уцМатр*уцВход = уцВыход *)
                    уцВход-,
                    уцВыход+:уцВектор.Вид; N:ЦЕЛ);
(*
 * Цель: умножение действительной матрицы <уцМатр> на
 *         входной действительный  вектор <уцВход> в <уцВыход>         
 *)
(*----------------------------------------------------------------------------*)
ЗАДАЧА^ Перемножить-(L-,A+:уцМатрица.Вид; N:ЦЕЛ);
(*
 * Цель: перемножение двух действ. матриц <L>*<L'>=<A>, где
 *                                            <L'> - транспонированная <L>   
 *)

(*----------------------------------------------------------------------------*
 * Переписывание действительных матриц, их строк и столбцов
 *----------------------------------------------------------------------------*)

ЗАДАЧА^ ОбменСтрок-   (A+:уцМатрица.Вид; i,k:ЦЕЛ; N0:ЦЕЛ; N1:ЦЕЛ);
ЗАДАЧА^ ОбменСтолбцов-(A+:уцМатрица.Вид; j,k:ЦЕЛ; N0:ЦЕЛ; N1:ЦЕЛ);

ЗАДАЧА^ Списать-(из-,в+:уцМатрица.Вид);
ЗАДАЧА^ СписатьСтолбецИзВектора-(из-: уцВектор.Вид; в+:уцМатрица.Вид; стлб:ЦЕЛ; N0:ЦЕЛ; N1:ЦЕЛ);
ЗАДАЧА^ СписатьВекторИзСтолбца- (из-:уцМатрица.Вид; в+: уцВектор.Вид; стлб:ЦЕЛ; N0:ЦЕЛ; N1:ЦЕЛ);


(*=рррррррррррррррррррррррр= реализация задач =рррррррррррррррррррррррррррррр=*)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА умнСтрокиНаСтолбец-(уцВектСтрока-,уцВектСтолбец-:уцВектор.Вид; N:ЦЕЛ):Цел;
(*
 * Цель: умножение вектора-строки на вектор-столбец
 *----------------------------------------------------------------------------*
 * До:    <уцВектСтрока>  - входная действ. вектор-строка
 *        <уцВектСтолбец> - входной действ. вектор-столбец
 * После: действительная сумма произведений элементов входных векторов
 *)
ПЕР
            суммаП,
                     Произведение:ЦЕЛ;                     (* временные целые *)
     j:ЦЕЛ;
            N:ЦЕЛ;  (* рабочая длина вектора или число используемых отсчётов, N <= Отсчётов,
            N - любое *)
УКАЗ
(*-
  НаЭкран.ВсяЦепь("^ уцМатрица.умнСтрокиНаСтолбец() ^");
-*)
         (* N:=РАЗМЕР(уцВектСтолбец);*)
  ПРОВЕРИТЬ(N > 1);                           (* и остановить работу при N<=1 *)
(*
  уцМатрВВ.наЭкран("^ уцВектСтрока = %7d",уцВектСтрока);
  уцМатрВВ.наЭкран("^уцВектСтолбец = %7d",уцВектСтолбец);
*)
    суммаП:=0;            (* накопление в суммаП суммы произведений по j *)
  ОТ j:=0 ДО N-1 ВЫП
                     Произведение:=уцВектСтрока[j]*уцВектСтолбец[j];
    суммаП:=суммаП + Произведение;
(*-
          НаЭкран.Цел4числа("^ Произведение= %7d, суммаП=  %7d",
                               Произведение,
                                                   суммаП,          0, 0
                           );
          );
-*)
  КОН;
  ВОЗВРАТ УЗК(суммаП)
КОН умнСтрокиНаСтолбец;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА умнНаВектор-(уцМатр-:уцМатрица.Вид;         (* уцМатр*уцВход = уцВыход *)
                   уцВход-,
                   уцВыход+:уцВектор.Вид; N:ЦЕЛ);
(*
 * Цель: умножение действительной матрицы <уцМатр> на
 *         входной действительный  вектор <уцВход> в <уцВыход>
 *----------------------------------------------------------------------------*
 * До:    <уцМатр>  - входная действительная матрица из NxN
 *        <уцВход>  - входной  действительный временной вектор-сигнал из N,Y=X*M
 * После: <уцВыход> - выходной действительный частотный вектор-спектр из N    
 *)
ПЕР
     i(*,j*):ЦЕЛ;
(*-
            суммаП,
                     Произведение:Цел;                     (* временные целые *)
-*)
         (* N:ЦЕЛ;     рабочая длина вектора или число используемых отсчётов, N <= Отсчётов,
            N - любое *)
УКАЗ
(*-
НаЭкран.ВсяЦепь("^ уцМатрица.умнНаВектор() ^");
-*)
         (* N:=РАЗМЕР(уцВход);*)
  ПРОВЕРИТЬ(N > 1);                           (* и остановить работу при N<=1 *)
(*
  уцМатрВВ.наЭкран("^уцВход = %7d",уцВход);
*)
  ОТ i:=0 ДО N-1 ВЫП
(*-
      суммаП:=0;          (* накопление в суммаП суммы произведений по j *)
    ОТ j:=0 ДО N-1 ВЫП
                       Произведение:=уцМатр[i,j]*уцВход[j];
      суммаП:=суммаП + Произведение;
(*-
     НаЭкран.Цел4числа("^ Произведение= %7d, суммаП=  %7d",
                               Произведение,
                                                  суммаП,          0, 0
                           );
-*)
    КОН;
    уцВыход[i]:=суммаП
-*)
    уцВыход[i]:=умнСтрокиНаСтолбец(уцМатр[i],уцВход,N);
  КОН;
(*
  уцМатрВВ.наЭкран("^уцВыход = %7d",уцВыход^);
*)
КОН умнНаВектор;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Перемножить-(L-,A+:уцМатрица.Вид; N:ЦЕЛ);
(*
 * Цель: перемножение двух действ. матриц <L>*<L'>=<A>, где
 *                                            <L'> - транспонированная <L>   
 *)
ПЕР
  i,j,k:ЦЕЛ;
      summaProizv:ЦЕЛ;
     (* N:ЦЕЛ; *)
УКАЗ
     (* N:=РАЗМЕР(L,0); *)
  ОТ i:=0 ДО N-1 ВЫП
    ОТ j:=0 ДО i ВЫП
      summaProizv:=0;
      ОТ k:=0 ДО j ВЫП
        summaProizv:=summaProizv + L[i,k]*L[j,k]
      КОН;
        A[i,j]:=УЗК(summaProizv);
      ЕСЛИ i # j ТО
        A[j,i]:=УЗК(summaProizv)
      КОН
    КОН 
  КОН
КОН Перемножить;


(*============================================================================*
 * Переписывание действительных матриц, их строк и столбцов
 *============================================================================*)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОбменСтрок-(A+:уцМатрица.Вид; i,k:ЦЕЛ; N0:ЦЕЛ; N1:ЦЕЛ);
ПЕР
     j:ЦЕЛ;
УКАЗ
  ОТ j:=0 ДО N1(*РАЗМЕР(A,1)*)-1 ВЫП
    уцМатем.обмен(A[i,j],A[k,j])    (* по столбцам *)
  КОН
КОН ОбменСтрок;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОбменСтолбцов-(A+:уцМатрица.Вид; j,k:ЦЕЛ; N0:ЦЕЛ; N1:ЦЕЛ);
ПЕР
     i:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО N0(*РАЗМЕР(A,0)*)-1 ВЫП
    уцМатем.обмен(A[i,j],A[i,k])    (* по рядам *)
  КОН
КОН ОбменСтолбцов;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Списать-(из-,в+:уцМатрица.Вид; N0:ЦЕЛ; N1:ЦЕЛ);
ПЕР
  i,j:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО   N0(*уцМатем.мин(РАЗМЕР(из,0),РАЗМЕР(в,0))*)-1 ВЫП
    ОТ j:=0 ДО N1(*уцМатем.мин(РАЗМЕР(из,1),РАЗМЕР(в,1))*)-1 ВЫП
      в[i,j]:=из[i,j] 
    КОН 
  КОН
КОН Списать;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА СписатьСтолбецИзВектора-(из-: уцВектор.Вид;
                                 в+:уцМатрица.Вид; стлб:ЦЕЛ; N0:ЦЕЛ; N1:ЦЕЛ);
ПЕР                         (*- из[*] -> в[*,стлб] -*)
     i:ЦЕЛ;
УКАЗ
(*ОТ i:=0 ДО уцМатем.мин(РАЗМЕР(из),РАЗМЕР(в,0))-1 ВЫП*)(* РАЗМЕР(в,0)-число рядов *)
  ОТ i:=0 ДО уцМатем.мин(N0,N1)-1 ВЫП
    в[i,стлб]:=из[i]                                    (* по рядам *)
  КОН
КОН СписатьСтолбецИзВектора;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА СписатьВекторИзСтолбца-(из-:уцМатрица.Вид;
                                в+: уцВектор.Вид; стлб:ЦЕЛ; N0:ЦЕЛ; N1:ЦЕЛ);
ПЕР                        (*- из[*,стлб] -> в[*] -*)
     i:ЦЕЛ;
УКАЗ
(*ОТ i:=0 ДО уцМатем.мин(РАЗМЕР(из,0),РАЗМЕР(в))-1 ВЫП*)(* РАЗМЕР(из,0)-число рядов *)
  ОТ i:=0 ДО уцМатем.мин(N0,N1)-1 ВЫП
    в[i]:=из[i,стлб]                                    (* по рядам *)
  КОН
КОН СписатьВекторИзСтолбца;

КОН уцМатрица.
